2012-12-13 17 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); 
      } 
     } 
    } 
} 

只會有一個這個類將被注入的構造函數的參數的實例。

我擔心連接,會話和生產者創建的開銷,因爲消息會經常發送(通常每10秒鐘發送一條消息) 我應該重用連接,會話還是生產者實例,以及我應該如何對連接失敗?這種情況下常見的模式是什麼?

回答

2

NMS.ActiveMQ與java客戶端一樣提供故障轉移傳輸,當連接丟失時它將自動嘗試重新連接到代理。你可以使用它來最小化你的失敗處理代碼。在AMQ上搜索有關故障轉移傳輸的主題。

重新創建連接和關聯的資源不是一個輕量級的操作,所以你最好打賭是緩存它們並重用它們,只要你需要連接。結合故障轉移,您可以反覆重複使用相同的MessageProducer。

NMS的模型與JMS非常相似,所以在JMS上做一些閱讀應該提供啓發。

1

大概你在爲此使用NMS? 作爲一個建議,您可能需要考慮使用阻塞隊列來限制消息,然後在批處理中發送大量n條消息...然後,您可以保留代碼並只發布批處理,同時處理連接,會話和生產者當你完成了你正在做的...

至於連接失敗 - 你應該能夠把異常監聽器連接到你的會話,以便你得到任何問題的通知。