DOBON.NET DOBON.NETプログラミング掲示板過去ログ

メッセージキューについて

環境/言語:[VS2003 WindowsXp]
分類:[.NET]

毎回本掲示板にはお世話になっております。
今回はメッセージキューについてお聞きしたいことがありますので
よろしくお願い致します。

メッセージキューで非同期受信を行っています。
実装プログラムとしては、MSDNのReceiveCompletedイベントのサンプルと同様
に実装しています。
ex)事前にBeginReceiveをコール済み
Private Shared Sub MyReceiveCompleted(ByVal [source] As _
[Object], ByVal asyncResult As ReceiveCompletedEventArgs)

Dim mq As MessageQueue = CType([source], MessageQueue)

' ↓今回問題となっている処理
Dim m As Message = mq.EndReceive(asyncResult.AsyncResult)

' ↓実際はメッセージを画面に表示しています
Console.WriteLine(("Message: " + CStr(m.Body)))

mq.BeginReceive()

Return

End Sub 'MyReceiveCompleted

EndReceiveで非同期処理を完了し、受信したメッセージをキューから
取得しようとしていますが、まれにEndReceiveをコールした後で
処理が停止してしまい処理が継続して実行されません。
(非同期処理を完了することができないのでしょうか??)

常に発生する訳ではなく、数十回実施して1回発生するかどうかの頻度
です。

過去に同じような事象が発生した方もしくは、何か思い当たることが
ある方は教えていただけないでしょうか??

申し訳ございませんがよろしくお願い致します。
■No24496に返信(zonoさんの記事)
> 毎回本掲示板にはお世話になっております。
> 今回はメッセージキューについてお聞きしたいことがありますので
> よろしくお願い致します。
>
> メッセージキューで非同期受信を行っています。
> 実装プログラムとしては、MSDNのReceiveCompletedイベントのサンプルと同様
> に実装しています。
> ex)事前にBeginReceiveをコール済み
> Private Shared Sub MyReceiveCompleted(ByVal [source] As _
> [Object], ByVal asyncResult As ReceiveCompletedEventArgs)
>
> Dim mq As MessageQueue = CType([source], MessageQueue)
>
> ' ↓今回問題となっている処理
> Dim m As Message = mq.EndReceive(asyncResult.AsyncResult)
>
> ' ↓実際はメッセージを画面に表示しています
> Console.WriteLine(("Message: " + CStr(m.Body)))
>
> mq.BeginReceive()
>
> Return
>
> End Sub 'MyReceiveCompleted
>
> EndReceiveで非同期処理を完了し、受信したメッセージをキューから
> 取得しようとしていますが、まれにEndReceiveをコールした後で
> 処理が停止してしまい処理が継続して実行されません。
> (非同期処理を完了することができないのでしょうか??)
>
> 常に発生する訳ではなく、数十回実施して1回発生するかどうかの頻度
> です。
>
> 過去に同じような事象が発生した方もしくは、何か思い当たることが
> ある方は教えていただけないでしょうか??
>
> 申し訳ございませんがよろしくお願い致します。
>

捕捉ですが、上記事象が発生した時、[コントロールパネル]→[管理ツール]→
[コンピューターの管理]のサービスとアプリケーションに表示されるメッセージ
キュー(専用キュー)で停止しているメッセージキューの中身を参照
すると受信するはずのメッセージを確認することができる状態です。
■No24497に返信(zonoさんの記事)
> ■No24496に返信(zonoさんの記事)
>>毎回本掲示板にはお世話になっております。
>>今回はメッセージキューについてお聞きしたいことがありますので
>>よろしくお願い致します。
>>
>>メッセージキューで非同期受信を行っています。
>>実装プログラムとしては、MSDNのReceiveCompletedイベントのサンプルと同様
>>に実装しています。
>>ex)事前にBeginReceiveをコール済み
>>Private Shared Sub MyReceiveCompleted(ByVal [source] As _
>> [Object], ByVal asyncResult As ReceiveCompletedEventArgs)
>>
>> Dim mq As MessageQueue = CType([source], MessageQueue)
>>
>> ' ↓今回問題となっている処理
>> Dim m As Message = mq.EndReceive(asyncResult.AsyncResult)
>>
>> ' ↓実際はメッセージを画面に表示しています
>> Console.WriteLine(("Message: " + CStr(m.Body)))
>>
>> mq.BeginReceive()
>>
>> Return
>>
>>End Sub 'MyReceiveCompleted
>>
>>EndReceiveで非同期処理を完了し、受信したメッセージをキューから
>>取得しようとしていますが、まれにEndReceiveをコールした後で
>>処理が停止してしまい処理が継続して実行されません。
>>(非同期処理を完了することができないのでしょうか??)
>>
>>常に発生する訳ではなく、数十回実施して1回発生するかどうかの頻度
>>です。
>>
>>過去に同じような事象が発生した方もしくは、何か思い当たることが
>>ある方は教えていただけないでしょうか??
>>
>>申し訳ございませんがよろしくお願い致します。
>>
>
> 捕捉ですが、上記事象が発生した時、[コントロールパネル]→[管理ツール]→
> [コンピューターの管理]のサービスとアプリケーションに表示されるメッセージ
> キュー(専用キュー)で停止しているメッセージキューの中身を参照
> すると受信するはずのメッセージを確認することができる状態です。
>
>
>
もう少し解析を進めてみましたが、行き詰まってしまいました・・・
スレッドが影響しているのかと思い、正常時と不具合時を比較してみましたが、
割り込み等は発生していませんでした。

処理時間も特に負荷がかっているとも思えない状態です。

EndReceiveの処理で停止するということは、非同期処理が完了しない
ことだと思っていますが、何が影響しているのでしょうか?

しつこいようで申し訳ないのですが、何か思いつくことでもありましたら
よろしくお願い致します。
> EndReceiveの処理で停止するということは、非同期処理が完了しない
> ことだと思っていますが、何が影響しているのでしょうか?

  過去、似た話をみかけたのですが、現時点では発見できません
  でした。

  因みに、他PCとのMSMQ通信ですか?
  あと、MSMQには脆弱性対策でパッチが出ていますが、それらの
  適用状態は?WinXP SPは?

  パーソナルファイアウォールやWindowsファイアウォール、
  Windows Defender とか導入されてます?

  MSMQの通信ポートがふさがっていたら、最初から通信できませ
  んが、何等かの事象で途中で止められるとか・・・

※ 考えにくいですが、スイッチハブやLANカード、正常動作し
  ているかどうか・・・パケット衝突起こしていたら可能性はあ
  りますが・・・確認する方法が大変・・・

あくまで、参考まで。
■No24622に返信(オショウさんの記事)
>>EndReceiveの処理で停止するということは、非同期処理が完了しない
>>ことだと思っていますが、何が影響しているのでしょうか?
>
>   過去、似た話をみかけたのですが、現時点では発見できません
>   でした。
>
>   因みに、他PCとのMSMQ通信ですか?
>   あと、MSMQには脆弱性対策でパッチが出ていますが、それらの
>   適用状態は?WinXP SPは?
>
>   パーソナルファイアウォールやWindowsファイアウォール、
>   Windows Defender とか導入されてます?
>
>   MSMQの通信ポートがふさがっていたら、最初から通信できませ
>   んが、何等かの事象で途中で止められるとか・・・
>
> ※ 考えにくいですが、スイッチハブやLANカード、正常動作し
>   ているかどうか・・・パケット衝突起こしていたら可能性はあ
>   りますが・・・確認する方法が大変・・・
>
> あくまで、参考まで。

オショウ様いつもお世話になっております。
返信の方ありがとうございます。

>因みに、他PCとのMSMQ通信ですか?
いいえ。PC内のプロセス間通信で使用してます。

>あと、MSMQには脆弱性対策でパッチが出ていますが、それらの
>適用状態は?WinXP SPは?
脆弱性対策のバッチはしりませんでした。
くわしく教えていただけないでしょうか?
OSはWindowsXP SP2です。

>パーソナルファイアウォールやWindowsファイアウォール、
>Windows Defender とか導入されてます?
Windowsファイアウォールは解除しています。
> いいえ。PC内のプロセス間通信で使用してます。

  自マシン・・・CPUスペックは?
  搭載メモリは?

> 脆弱性対策のバッチはしりませんでした。
> くわしく教えていただけないでしょうか?
> OSはWindowsXP SP2です。

  教えるも何も、マイクロソフトで公開しているので検索すれば
  いくらでもヒットします。

  http://www.microsoft.com/japan/technet/security/Bulletin/MS07-065.mspx

> Windowsファイアウォールは解除しています。

  他は?
  ノートンのアンチウイルス導入しているとか・・・

以上。
■No24624に返信(オショウさんの記事)
>>いいえ。PC内のプロセス間通信で使用してます。
>
>   自マシン・・・CPUスペックは?
>   搭載メモリは?
>
>>脆弱性対策のバッチはしりませんでした。
>>くわしく教えていただけないでしょうか?
>>OSはWindowsXP SP2です。
>
>   教えるも何も、マイクロソフトで公開しているので検索すれば
>   いくらでもヒットします。
>
>   http://www.microsoft.com/japan/technet/security/Bulletin/MS07-065.mspx
>
>>Windowsファイアウォールは解除しています。
>
>   他は?
>   ノートンのアンチウイルス導入しているとか・・・
>
> 以上。
>
返信の方ありがとうございます。


>自マシン・・・CPUスペックは?
>搭載メモリは?
CPUがPentium4(2.80GHz)でメモリが512MBです。

>他は?
>ノートンのアンチウイルス導入しているとか・・・
他のセキュリティーソフトはインストールしていません。
> CPUがPentium4(2.80GHz)でメモリが512MBです。

  同一マシン上で送受信を行う場合、PC-PC間よりも当然
  負荷は高くなります。

  通信時のタスクマネージャでのCPU負荷の変動状態を
  確認されては?

  尚、常駐している他ソフトの都合で、512MB搭載でも空き
  メモリはかなり少ない・・・と思います。200MB空いてな
  いかも・・・

  1GBは積まないと・・・と思いますが。

※ 私の環境はDB(SQL Server)もありますので、32ビットOSで
  MAXの3GB(実際は4GB)搭載しても・・・空きは1.3GBくらい
  いろいろ乗せすぎ・・・なんですが、DBの分に食われているのが
  大きい・・・別PC立てればいいんですが・・・

> 他のセキュリティーソフトはインストールしていません。

  不用心だね・・・
  そんな環境で動作しても、最終環境にはいろいろソフトが搭載
  されていたら、動かないことが多分にあります。

  自分のスカスカ環境で動作しているから・・・と言い訳にもな
  らないかと。

※ 敢えて言うならノートンは重過ぎ・・・負荷かかったら異常終了
  するから私はノートン使いません。

● どうしてもMSMQ使わないといけないのでしょうか?
  .NETリモートや普通のソケット通信なら軽量コンパクト。
  MSMQのサービス(エンジン)をわざわざ動かさないでも済むし・・・

以上。
■No24635に返信(オショウさんの記事)
>>CPUがPentium4(2.80GHz)でメモリが512MBです。
>
>   同一マシン上で送受信を行う場合、PC-PC間よりも当然
>   負荷は高くなります。
>
>   通信時のタスクマネージャでのCPU負荷の変動状態を
>   確認されては?
>
>   尚、常駐している他ソフトの都合で、512MB搭載でも空き
>   メモリはかなり少ない・・・と思います。200MB空いてな
>   いかも・・・
>
>   1GBは積まないと・・・と思いますが。
>
> ※ 私の環境はDB(SQL Server)もありますので、32ビットOSで
>   MAXの3GB(実際は4GB)搭載しても・・・空きは1.3GBくらい
>   いろいろ乗せすぎ・・・なんですが、DBの分に食われているのが
>   大きい・・・別PC立てればいいんですが・・・
>
>>他のセキュリティーソフトはインストールしていません。
>
>   不用心だね・・・
>   そんな環境で動作しても、最終環境にはいろいろソフトが搭載
>   されていたら、動かないことが多分にあります。
>
>   自分のスカスカ環境で動作しているから・・・と言い訳にもな
>   らないかと。
>
> ※ 敢えて言うならノートンは重過ぎ・・・負荷かかったら異常終了
>   するから私はノートン使いません。
>
> ● どうしてもMSMQ使わないといけないのでしょうか?
>   .NETリモートや普通のソケット通信なら軽量コンパクト。
>   MSMQのサービス(エンジン)をわざわざ動かさないでも済むし・・・
>
> 以上。

>● どうしてもMSMQ使わないといけないのでしょうか?
既存システムがMSMQを使用している為です。
(今回の事象は既存システムから発生した不具合です。)


セキュリティに関しては外部と接続するような要件が無いため、
ファイアウォール等の設定を解除しています。
(専用マシンとしています)
一般的な問題かどうかということで、少し時間をかけて検索してみる限りは情報を拾えていません。
MessageQueueを使っていないと出会わないトラブルか、そのシステムに特化した問題かは分かりません。

既に切り分け等の作業をされているかもしれませんが、考えたこととして載せておきます。
もし、既に検討済みであり、余計な投稿となってしまった場合は、申し訳ありません。

■既存のシステムの潜在不具合でしょうか?
潜在不具合であって、今回新たに発覚したと言うことであれば、システムの拡張かハードの増強、何らかの設定変更によって引き起こされているのかもしれません。
(前回のテストで検出できなかったという可能性もあります)
不具合を解析して取り去るのが綺麗な解決法ですが、現状糸口が見えていないということですので、別の対策がないかというのも考えていかないといけません。
(期間が伸ばせるか、要件を調整できるか、経験者を招き寄せるか等)

ところで、この既存システムは改修可能な代物なのでしょうか?

■別のアプリでもその環境であれば発生するのでしょうか?
テスト用のMessageQueueを送受信するアプリを動かした場合にも再現するのでしょうか?
アプリが問題か、環境が問題かの切り分けです。
テストアプリでも起きるのであれば、既存システム・テストアプリで共通した誤りがあるか、環境に問題があるか、フレームワークにバグがあるか等の可能性を疑っていくことになります。


大変かもしれませんが、どこら辺に問題があるかと疑っていくために、切り分けられる要素は色々と試していきましょう。


# 引用される際は必要な部分だけ残しませんか?
# 関係ないところが残っていると、長くなって読みやすさが損なわれるかもしれません。
ご質問に対する回答ではないことをご了承ください。

先に No24606 の投稿で指摘させていただきましたが、オショウさんの No24624 や No24635 のご投稿には、同じような危うさを感じてしまいます。例えば、 No24624 の

>  教えるも何も、マイクロソフトで公開しているので検索すれば
>  いくらでもヒットします。

や No24624 の

>  不用心だね・・・

といった表現です。

たぶん No24606 の私の投稿をお読みになっていないのだろうと思いましたので、指摘させていただきました。何度も面倒なことをお願いして申し訳ありませんが、ご協力をお願いいたします。

DOBON.NET | プログラミング道 | プログラミング掲示板