2012-12-13 5 views
5

私はActiveMQのことから始めました。.Net NMS.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つのメッセージよりも多く)送信されるため、接続、セッション、プロデューサの作成にオーバーヘッドが発生します。 接続、セッション、またはプロデューサのインスタンスを再利用する必要があります。接続障害?そのようなシナリオで共通のパターンは何ですか?

答えて

2

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

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

NMSのモデルはJMSとほぼ同じです。そのため、JMSでの読み上げには啓発が必要です。

1

これはNMSを使用していると思われますか? メッセージを抑制するためにブロッキングキューを使用し、次にバッチでn個のメッセージのチャンクを送信することをお勧めします。コードを保持し、バッチをパブリッシュしながら接続とセッションとプロデューサを破棄することができますあなたがしているときに完了したら...

接続の失敗に関しては、あなたが何か問題を通知されるように例外リスナーをあなたのセッションに接続することができます。

関連する問題