質問

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);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top