- - PR -
MessageQueueにアイテム追加された時のイベントが欲しい
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-13 08:47
いつもお世話になっております。
MessageQueueを使おうと調べているところです。 「マシンAがキューにオブジェクトをSendするとイベントが発生して、それをリッスンしたマシンBがオブジェクトをReceiveする」というシナリオを思い描いていたのですが、MessageQueueのメンバに適当なイベントが見当たりません。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemmessagingmessagequeuememberstopic.asp 非同期のReceiveやPeekが完了したことを知らせるイベントはあるようです。 新しいアイテムが追加されたことを知らせる良い方法は無いのでしょうか?ポーリング用の別スレッドを用意するのはあまり良い方法だとは思えず、困っています。 どうぞよろしくお願いします。 | ||||||||||||
|
投稿日時: 2005-12-13 10:09
??? メッセージが到達されて初めて意味を成すので、 ReceiveCompleted イベントで十分だと思いますけど...
"メッセージ到達前に" というように聞こえるのですが、 MessageQueue が担うべきでない仕事を任せようとしていませんか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2005-12-13 11:22
じゃんぬねっとさん、アドバイスありがとうございます。
私の説明が悪かったか、私が何か激しい勘違いをしてるかのどちらかなようです…。
上記リンクから、ReceiveCompleted を引用すると
とのことなので、このイベントは「キューから自分にメッセージをReceiveするのが終わった」ことを知らせてくれるものだと思っています。 では、いつReceiveを開始すればいいのでしょうか?キューが空ならばReceiveしても意味が無いので、だれかがキューにメッセージをSendした時に、Receive出来るメッセージが来たことを知るにはどうすれば良いのでしょうか?という質問をしたかったのです。
MessageQueueから「メッセージあるよ」というお知らせを貰いたいのですが、それは責任範囲外になるのでしょうか?MessageQueue にMessageが届いたことをポーリング以外で知る方法は無いのでしょうか?イベントが用意してあるとMessageQueueの設計的にもスッキリするかと思ったのですが、実際はそうなっていないようです。そして、何故そうなっていないか理解できていません(ので、なにか大きく誤解している気がしてきました)。 済みませんが、よろしくお願いします。 | ||||||||||||
|
投稿日時: 2005-12-13 11:51
そうですね。
ご自分が引用された内容をもう 1 度見直してください。 BeginReceive メソッドが何のためにあるのか、ですね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2005-12-13 11:54
私が質問内容を勘違いしているんでしょうか?
監視するなら非同期になるのは当然でしょうし ??? 状態です。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2005-12-13 14:33
私は詳しくありませんが、ヘルプを見ている限りメールボックスだと思ってよいのではないでしょうか。 キューはメールチェッカのように常駐して監視通知するようなサービスではないということです。 したがって継続的にBeginRecieveを繰り返すことになるのではないでしょうか。 RecieveCompletedイベントはその単語の意味からは混乱してしまいますね。 ヘルプのRecieveCompletedイベントの例を見るとすっきりしましたが。 | ||||||||||||
|
投稿日時: 2005-12-14 04:12
じゃんぬねっとさん、まどかさん、どうも有り難うございました。
自分が何を誤解していたのかが分かりました。 お礼に(なるかどうかは分かりませんが)私の誤解を説明しますと、 「キューが空の時にBeginReceiveを呼んだ場合は何もReceive出来ない(空のMessageかMessage無いよというReceiveCompletedが呼ばれる)ので、いつSendされるか分からない時には定期的にBeginReceiveを呼ぶ必要がある(ポーリング)」 と思い込んでいました。実際は 「キューが空の時にBeginReceiveを呼んだ場合、誰かがそのキューにSendするまで何も起こらず、誰かがSendすれば直ちにReceiveがスタートして、完了後にReceiveCompletedが呼ばれる」 ということでした。 BeginReceiveが非同期である理由を「大きなサイズのデータ転送に時間がかかるため」としか考えていませんでした。「キューにメッセージが届くまで時間がかかるため」という理由もあったのですね。 BeginReceiveでやりたかったことが出来そうです。ありがとうございました。 | ||||||||||||
|
投稿日時: 2005-12-14 09:48
今回、私がハマってしまった部分はここです。(^^;)
非同期を理解されている前提で話していたのがまずかったようです。
到着してもいないようなものを監視するの? というスレ違いが生まれたようです。
BeginRecieve メソッドのオーバーロードにもよりますね。 たいてはタイムアウトものを使ったりしますけどね。(^^) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |