5

私は ActiveMQ のことを始めたばかりで、いくつか質問を受けました。

ActiveMQ を使用してメッセージを送信する必要があります

私が今やったこと:

public class ActiveMQSender
{
    private readonly Uri connectionUri;
    private readonly IConnectionFactory connectionFactory;

    private readonly string destinationName;

    public ActiveMQSender()
    {
        this.connectionUri = new Uri("activemq:tcp://localhost:61616");
        this.connectionFactory = new NMSConnectionFactory(this.connectionUri);
        this.destinationName = "queue://testQ";
    }

    public void Send(string msg)
    {
        using (var connection = this.connectionFactory.CreateConnection())
        using (var session = connection.CreateSession())
        {
            var destination = SessionUtil.GetDestination(session, this.destinationName);

            using (var producer = session.CreateProducer(destination))
            {
                connection.Start();
                var message = session.CreateTextMessage(msg);
                producer.Send(message);
            }
        }
    }
}

コンストラクターのパラメーターとして注入されるこのクラスのインスタンスは 1 つだけです。

メッセージが頻繁に送信されるため (多くの場合、10 秒ごとに 1 つのメッセージ)、接続、セッション、およびプロデューサーの作成のオーバーヘッドが心配です。接続、セッション、またはプロデューサーのインスタンスを再利用する必要がありますか? そのようなシナリオで一般的なパターンは何ですか?

4

2 に答える 2

2

JavaクライアントのようなNMS.ActiveMQは、接続が失われた場合にブローカーへの再接続を自動的に試行するフェイルオーバートランスポートを提供します。これを使用して、コードの失敗処理を最小限に抑えることができます。AMQのフェイルオーバートランスポートのトピックについてGoogleで検索してください。

接続と関連するリソースの再作成は軽量な操作ではないため、それらをキャッシュして、その接続が必要な限り再利用することをお勧めします。フェイルオーバーと組み合わせることで、同じMessageProducerを何度も確実に再利用できます。

NMSのモデルはJMSとほとんど同じであるため、JMSで何らかの読み取りを行うと、啓蒙が可能になります。

于 2012-12-13T23:48:07.923 に答える
1

おそらく、これにNMSを使用していますか?提案として、ブロッキング キューを使用してメッセージを調整し、n 個のメッセージのチャンクをバッチで送信することを検討することをお勧めします。その後、接続とセッションとプロデューサーを破棄しながら、コードを保持してバッチを公開することができます。あなたはあなたがやっているように終わった...

接続の失敗については、例外リスナーをセッションに接続して、問題が発生したことを通知できるようにする必要があります。

于 2012-12-13T15:31:11.030 に答える