2012-12-13 16 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条消息...然后,您可以保留代码并只发布批处理,同时处理连接,会话和生产者当你完成了你正在做的...

至于连接失败 - 你应该能够把异常监听器连接到你的会话,以便你得到任何问题的通知。