2009-08-12 5 views
4

MSMQを使用してメッセージ(一連のレコードを含むXMLファイル)を送信するJava WebServiceがあります。サービスとしての.netのMSMQ

これらのメッセージを選択して読み込み、SQLデータベースに挿入するVB.netを使用して.NETで小さなアプリケーションを構築する必要があります。

皆さんお気軽にお問い合わせください。どのようにしてリアルタイムでMSMQメッセージを読むことができますか?

すべてのリソースやリンクは大きな助けになります。

答えて

5

はここ

using System.Messaging; 
using System.IO; 


MessageQueue l_queue = new MessageQueue(this.MessageQueuePath); 
     l_queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(System.String) }); 

     if (!l_queue.CanRead) 
     { 
      e.Result = MessageQueueError.InsufficientPermissions; 
      return; 
     } 

     while (true) 
     { 
      // sleep 2 seconds between checks to keep this from overloading CPU like a madman 
      System.Threading.Thread.Sleep(2000); 

      Message l_msg = null; 
      string l_msgID = String.Empty; 

      // try and receive the message - a IOTimeout exception just means that there aren't any messages - move on 
      try { l_msg = l_queue.Receive(TimeSpan.FromSeconds(5)); } 
      catch (MessageQueueException ex) 
      { 
       if (ex.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout) 
        // log error 
       else 
        continue; 
      } 
      catch (Exception ex) { // log error 
      } 

      if (l_msg == null) 
      { 
       //log error 
       continue; 
      } 

      // retrieve and log the message ID 
      try { l_msgID = l_msg.Id; } 
      catch (Exception ex) { // log error 
      } 

      // do whatever with the message... 
     } 
+9

タイムアウトとスリープを削除してみませんか?ちょうど「受け取り」と呼んで待ってください。メッセージが到着すると、キューからメッセージを受け取り、続行します。 –

9

System.Messaging名前空間に.NETで使用できるMSMQの完全な管理実装があります。メッセージキューにBeginReceiveを呼び出すと、メッセージが到着するまで非同期に待機します。それができたら、EndReceive,にメッセージを処理し、BeginReceiveをもう一度呼び出すと、次のメッセージを待つ(またはキュー内の次のメッセージを処理する)ことができます。

+4

このアプローチを使用する場合は、BeginRecieveを再度呼び出す前に、EndRecieveをRecieveCompletedイベントで呼び出すことを忘れないでください。私がこれを理解する前にいくつかの不快な振る舞いをしていました。 –

+0

@トルブ:絶対に;ありがとう!私は答えを修正しました。 –

6

...あなたを得るのを助けるかもしれサンプルC#.NETコードのビットは、キューからの読み取りを開始するWCFを使用している.NETでMSMQメッセージを処理する最善方法です。 Justin Wilcoxには偉大なチュートリアルhereがあります。

しかし、MSMQ + WCFを試すことを強くお勧めします。それはとても良いことですし、WCFについてもっと学びます。これはすばらしいものです。

簡単な方法は、JustinDが示唆するようなことをすることです。 System.Messaging名前空間は非常に使いやすいです。唯一違うのは、タイムアウトを指定せずにReceiveメソッドを呼び出すことです。これにより、キューにメッセージが表示されるまでスレッドが待機し、その時点でメッセージが受信されます。