ActiveMQのメッセージ受信イベントセカンドごとに1つのだけのメッセージ?

StackOverflow https://stackoverflow.com/questions/390044

  •  23-08-2019
  •  | 
  •  

質問

私たちは、ActiveMQのに基づくアプリケーションインフラストラクチャを構築しました。

私たちは、送受信メッセージをうまく、そして大部分のものはかなり速いし、[OK]をしていることができます。

ActiveMQのは、かなり迅速にもう一方の端のサードパーティのアプリケーションにメッセージを取得すること、および、このアプリケーションが処理すること -

しかし、私たちは、「一度に」のメッセージのバッチを提出した場合、5000件のメッセージを言うことに気付きましたまた、かなり迅速に、そして、それはエン早くも裏ブローカーへの応答をキューイングすることを、分の下で言っています。

しかし、いくつかの理由で、最初の場所でメッセージを発信し、当社のVB.NETのEXEは時々かそこらして、時間の休憩を取って、時には毎秒約1やって、それが不規則受け取るリターンメッセージを処理しているように見えます毎秒1に戻っています。

Origin (VB.NET EXE which we manage) 
    -> Broker  (which we manage)
        -> (3rd party app) 
            -> back to the same broker 
                -> back to the origin app.

レシーバは多分9ヶ月前にActiveMQからダウンロードしたC#コードからイベントMessageListenerのを待っています:

Public Delegate Sub MessageListener(ByVal message As NMS.IMessage)
     Member of: NMS

私は何が起こっていることのMessageListenerだけでかむために私たちに一つのメッセージ(NMS.IMessage)を与え、そのためには、我々が処理するものだということだと思います。

「そこに他のメッセージが今キューにあり、それらすべてを行う場合のMessageListenerイベントでは、参照してください」と言うためにいくつかの方法がありますか?

役に立ちましたか?

解決

が判明し、私たちは、これが何であるか、今もう少し知っていると思います。

ActiveMQのDLLを使用して、当社のVB.NET WinFormsのアプリケーションは、最終的にクラッシュすると、それは数回週に行うために傾向がある、我々はゾンビを享受したWinternalsのpslistとpskillユーティリティを使用してウォッチドッグ・プログラムを持っているし、次に開始します新しいクライアント接続ます。

このような場合には、ブローカーを分析するためにJConsoleを使用してゾンビのセッションがまだ登録されていることを私たちに示しており、その新鮮な新しいクライアントです。

私の理論は今AMQ両方のセッションを見たとき、それは両方のセッション、ラウンドロビン形式にメッセージを配布開始しようとしていることです。 AMQが応答しないゾンビにメッセージを送信しようとします。一定の時間(おそらく1秒)後AMQはあきらめて、リスト内の次のセッション、新しい新鮮なクライアントになります。

いくつかの時点で、ブローカーまたはTCPスタックはおそらく、ゾンビが保たれていない、それはアクティブなTCP接続だと、それはあきらめることに気付きます。その後、動作が正常に戻ります。

そこで問題は、a)は死なない、またはb)の工程でのセッションをシャットダウンし、優雅に死ぬことをActiveMQのクライアントを作成する方法を、となり?

編集:ActiveMQの次のバージョンへのアップグレードは、これを解決しました。また、我々は送信と受信を行う単一のアプリを持っていたが、それはスレッドセーフではなかった - それは、これがクラッシュを引き起こした送信しようとしたときにそれを受信した場合。我々は2つのコンソールアプリケーション、データを受信したデータと1を送ったとして、それを再度書きました。これ以上のクラッシュしません。また、ActiveMQの古いバージョンのは、私たちのことを解決4.xにアップグレードし、優雅にクラッシュを処理していませんでした時に使用していた。

scroll top