Software development of explosion! −夢の破片(カケラ)たちの日々 別館− このページをアンテナに追加 RSSフィード Twitter

2012年07月09日

HornetQ…

HornetQを検証で使っているのだけども、Consumerが居るQueueにQueueBrowserでアクセスしても、キューイングされてるメッセージが拾えない。

推測だけど、マルチスレッドで動いたときに、QueueBrowserの結果が保証出来なくなるのだろう。

なので、java.util.Queue#peek()みたいなことをやるのであれば、createQueueSession(true, Session.TRANSACTED)にしておいて、consumerで一旦receiveしたら、rollbackするくらいしか手がない。

ActiveMQならこんなことないんだけどね。

そもそも、何をやりたいかというと、複数のproducerがQueueにメッセージを送ると、ルーティングして、複数のconsumerが居るQueueに送られる。

そして、その複数のconsumerは、それぞれが別々のメッセージをQueueから受信(このときはQueueからは削除されない)して、別のQueue(ワーキング)に投げ込んでおく。

ワーキングに投げ込めたら、元のQueueからは捨てる(本来のMQ的な受信)。

そんなことがしたいわけです。

ルーティングがHornetQだと簡単に使えるってことなので、HornetQで行こうと思ったんだけど、上述したQueueから削除せずに受信ってのが出来ないわけですよ。

交互にQueueBrowserを開いて閉じてConsumerを開いて閉じてをやって、シングルスレッドなら出来る確認はしてはいるけど、そもそもがそんな使い方すべきじゃないしね。

JMSは使い辛いです。

Kestrelというのを試そうかとも思うけど、ルーティング出来るのかねぇ?ルーティングルールも問題だけど、落ちたときに永続化されてる必要があるのもまた厄介なところ。

まぁ、最悪、Cassandraという最終手段が...本当に最終手段だけど

ってことで、色々と検証してはいるものの、なかなかもって、いい手だてがない。

頑張りますか…

iPhoneから送信

Clebert SuconicClebert Suconic 2012/07/11 02:57 I don't understand japanese beyond what google translate is telling me. But you're possibly doing something easily wrong. If you post on forums or talk to me on IRC, I can possibly help you.

igarashitmigarashitm 2012/07/11 04:14 こんにちは

・受信したメッセージを消さないでおくには、CLIENT_ACKNOWLEDGEモードでacknowledge()せずに閉じる
・あるQueueから受信して別のQueueへ移し替えるには、受信と送信を一つのトランザクション内で行う

このどちらかでは解決しない問題なのでしょうか。よろしければもう少し詳しいユースケースを教えていただけませんでしょうか?お手伝いできるか分かりませんが、少し気になったもので・・・

poad1010poad1010 2012/07/11 08:47 > igarashitmさん
仰られるとおり、単独であれば、acknowlege()で解決は出来ますし、別のキューへ移すのも、同一トランザクションです。

今の問題は、1つのキューに別々のプロセスからアクセスして、それぞれメッセージを受け取りたい(AとBのメッセージがキューイングされていれば、プロセス1はA、もう片方のプロセスはBを…と入っている順に処理したい)のですが、どうも、上手くいかないんです。

Producerが1に対して、Consumerが複数、Queueは1つというのは動かないんですかねぇ…。

poad1010poad1010 2012/07/11 09:38 > Clebert Suconic
Thank you for comment! Since he is poor at English, I can talk by neither a forum nor IRC. 
If surely needed, I will contribute to a forum. 

The machine translation of this text was carried out.

igarashitmigarashitm 2012/07/18 09:53 Consumerが複数いることは問題ないです。
ひょっとして、プロセス1のConsumerのバッファにメッセージが入っていてそれがプロセス2から見えないことが問題でしょうか?
consumer-window-sizeを 0 にして、クライアントバッファを無効にすると期待した動作になりませんでしょうか?

同梱されている examples の no-consumer-buffering を参照してみてください。
http://docs.jboss.org/hornetq/2.2.14.Final/user-manual/en/html/examples.html#examples.no-consumer-buffering

日本語のJBossユーザフォーラムもできたようなので、よろしければ参加してみませんか?私もたった今登録しました。
https://community.jboss.org/groups/japan-jbug?view=discussions

poad1010poad1010 2012/07/18 10:04 > igarashitmさん
いえ、そういうのでは無く、JMSの問題として、一度受信したものを、先頭に戻すといったようなことをしたいのですが、それが出来ないので、アドバイス頂いたとおり、acknowledgeを返さないことで、消さずに受信させて出来ないかと思ったのですが、複数プロセスからの受信動作が競合すると、同じメッセージが受信されてしまうので困っています。
今回はJMSは使えなさそうです

iPhoneから送信

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/poad1010/20120709/1341842315
リンク元