- PR -

MessageQueueにアイテム追加された時のイベントが欲しい

投稿者投稿内容
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 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が完了したことを知らせるイベントはあるようです。

新しいアイテムが追加されたことを知らせる良い方法は無いのでしょうか?ポーリング用の別スレッドを用意するのはあまり良い方法だとは思えず、困っています。

どうぞよろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-13 10:09
引用:

がらすさんの書き込み (2005-12-13 08:47) より:

MessageQueueのメンバに適当なイベントが見当たりません。
非同期のReceiveやPeekが完了したことを知らせるイベントはあるようです。
新しいアイテムが追加されたことを知らせる良い方法は無いのでしょうか?
ポーリング用の別スレッドを用意するのはあまり良い方法だとは思えず、困っています。


??? メッセージが到達されて初めて意味を成すので、
ReceiveCompleted イベントで十分だと思いますけど...

引用:

「マシンAがキューにオブジェクトをSendするとイベントが発生して、それをリッスンしたマシンBがオブジェクトをReceiveする」というシナリオを思い描いていたのですが、


"メッセージ到達前に" というように聞こえるのですが、
MessageQueue が担うべきでない仕事を任せようとしていませんか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2005-12-13 11:22
じゃんぬねっとさん、アドバイスありがとうございます。
私の説明が悪かったか、私が何か激しい勘違いをしてるかのどちらかなようです…。

引用:

じゃんぬねっとさんの書き込み (2005-12-13 10:09) より:

??? メッセージが到達されて初めて意味を成すので、
ReceiveCompleted イベントで十分だと思いますけど...



上記リンクから、ReceiveCompleted を引用すると
引用:

メッセージがキューから削除されると発生します。このイベントは、非同期操作 BeginReceive によって発生します。


とのことなので、このイベントは「キューから自分にメッセージをReceiveするのが終わった」ことを知らせてくれるものだと思っています。

では、いつReceiveを開始すればいいのでしょうか?キューが空ならばReceiveしても意味が無いので、だれかがキューにメッセージをSendした時に、Receive出来るメッセージが来たことを知るにはどうすれば良いのでしょうか?という質問をしたかったのです。

引用:

"メッセージ到達前に" というように聞こえるのですが、
MessageQueue が担うべきでない仕事を任せようとしていませんか?



MessageQueueから「メッセージあるよ」というお知らせを貰いたいのですが、それは責任範囲外になるのでしょうか?MessageQueue にMessageが届いたことをポーリング以外で知る方法は無いのでしょうか?イベントが用意してあるとMessageQueueの設計的にもスッキリするかと思ったのですが、実際はそうなっていないようです。そして、何故そうなっていないか理解できていません(ので、なにか大きく誤解している気がしてきました)。

済みませんが、よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-13 11:51
引用:

がらすさんの書き込み (2005-12-13 11:22) より:

上記リンクから、ReceiveCompleted を引用すると

引用:

メッセージがキューから削除されると発生します。このイベントは、非同期操作 BeginReceive によって発生します。


とのことなので、このイベントは「キューから自分にメッセージをReceiveするのが終わった」ことを知らせてくれるものだと思っています。


そうですね。

引用:

では、いつReceiveを開始すればいいのでしょうか?


ご自分が引用された内容をもう 1 度見直してください。
BeginReceive メソッドが何のためにあるのか、ですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-13 11:54
私が質問内容を勘違いしているんでしょうか?
監視するなら非同期になるのは当然でしょうし ??? 状態です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-12-13 14:33
引用:

では、いつReceiveを開始すればいいのでしょうか?キューが空ならばReceiveしても意味が無いので、だれかがキューにメッセージをSendした時に、Receive出来るメッセージが来たことを知るにはどうすれば良いのでしょうか?

MessageQueueから「メッセージあるよ」というお知らせを貰いたいのですが、それは責任範囲外になるのでしょうか?


私は詳しくありませんが、ヘルプを見ている限りメールボックスだと思ってよいのではないでしょうか。
キューはメールチェッカのように常駐して監視通知するようなサービスではないということです。
したがって継続的にBeginRecieveを繰り返すことになるのではないでしょうか。
RecieveCompletedイベントはその単語の意味からは混乱してしまいますね。
ヘルプのRecieveCompletedイベントの例を見るとすっきりしましたが。
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2005-12-14 04:12
じゃんぬねっとさん、まどかさん、どうも有り難うございました。
自分が何を誤解していたのかが分かりました。

お礼に(なるかどうかは分かりませんが)私の誤解を説明しますと、
「キューが空の時にBeginReceiveを呼んだ場合は何もReceive出来ない(空のMessageかMessage無いよというReceiveCompletedが呼ばれる)ので、いつSendされるか分からない時には定期的にBeginReceiveを呼ぶ必要がある(ポーリング)」
と思い込んでいました。実際は
「キューが空の時にBeginReceiveを呼んだ場合、誰かがそのキューにSendするまで何も起こらず、誰かがSendすれば直ちにReceiveがスタートして、完了後にReceiveCompletedが呼ばれる」
ということでした。

BeginReceiveが非同期である理由を「大きなサイズのデータ転送に時間がかかるため」としか考えていませんでした。「キューにメッセージが届くまで時間がかかるため」という理由もあったのですね。

BeginReceiveでやりたかったことが出来そうです。ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-14 09:48
今回、私がハマってしまった部分はここです。(^^;)

引用:

がらすさんの書き込み (2005-12-13 08:47) より:

非同期のReceiveやPeekが完了したことを知らせるイベントはあるようです。


非同期を理解されている前提で話していたのがまずかったようです。

引用:

新しいアイテムが追加されたことを知らせる良い方法は無いのでしょうか?
ポーリング用の別スレッドを用意するのはあまり良い方法だとは思えず、困っています。


到着してもいないようなものを監視するの? というスレ違いが生まれたようです。

引用:

まどかさんの書き込み (2005-12-13 14:33) より:

継続的にBeginRecieveを繰り返すことになるのではないでしょうか。


BeginRecieve メソッドのオーバーロードにもよりますね。
たいてはタイムアウトものを使ったりしますけどね。(^^)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)