質問
Apache.NMSおよびApcahe.NMS.ActiveMQ(バージョン1.0)ライブラリを使用してWindowsサービスを作成しました。このサービスは、ベンダーサーバーからActiveMQからのメッセージを消費します。
サービスは接続をスピンアップし、メッセージをリッスンします(OnMessageイベントを処理します)
接続はトランザクション接続なので、各メッセージの後にコミットを呼び出します。
サービスが開始されると、すべてが非常にうまく機能し、しばらくは機能します。ただし、しばらく実行した後は、メッセージを消費しなくなります。サービスをリセットしても。通常、サービスを再開するために、ベンダーサーバー(tomcat)を再起動する必要があります。ベンダーは、彼らの側に何も悪いことはないと主張しています。
どちらの側(クライアントまたはサーバー)でも例外はスローされません-それは単に「スタック」しています。
Spring.Messaging.Nmsの使用を検討すべきですか?
解決
問題を発見しました。接続とメッセージリスナを確立した後、サービスはThread.Sleep(500)でループに入りました。ダム。 OnStartですべてを起動し、OnStopで破棄するようにサービスをリファクタリングしました。
それを行うことで、すべてが完全に実行されます。
キーボードと椅子の間で発生するクラシックID-10-Tエラー。
他のヒント
気にせず、ここで見つけました:
私のコードは少し異なります。ループでポーリングする代わりに、「OnMessage」に応答するリスナーを設定しました。イベント。私のコードは以下のコードに似ています。私の実際のコードには無関係なものがたくさんありますが、精神は同じです-これが役立つことを願っています。
factory = new Apache.NMS.ActiveMQ.ConnectionFactory("tcp://activemq:61616");
connection = factory.QueueConnection(factory, "MyQueue", AcknowledgementMode.AutoAcknowledge)
consumer = connection.Session.CreateConsumer(connection.Queue, "2 > 1"); //Get every msg
consumer.Listener += new MessageListener(OnMessage);
private void OnMessage(IMessage message)
{
//Process message here.;
}
ActiveMQと通信する.Netサービスを使用してまったく同じ問題に遭遇しましたが、約10〜20のメッセージが配信されるだけでロックアップします。
スプリングフレームワークを使用して、または使用せずに試してみましたが、(フレームワークを想像している場合を除いて)わずかに優れています。
このコードを確認し、自分のコードと似ているかどうかを教えてください。
ConnectionFactory connectionFactory = new ConnectionFactory("tcp://activemq:61616");
Connection connection = (Connection)connectionFactory.CreateConnection();
connection.Start();
Session session = (Session)connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
IDestination queue = session.GetQueue("test.queue");
MessageConsumer consumer = (MessageConsumer)session.CreateConsumer(queue);
for (int i = 0; i < 1000; i++)
{
IMessage msg = consumer.Receive();
if (msg != null)
Console.WriteLine((msg as ITextMessage).Text);
}