.Net NMS.ActiveMQ 我应该存储消息发送调用之间的会话和连接吗

Posted

技术标签:

【中文标题】.Net NMS.ActiveMQ 我应该存储消息发送调用之间的会话和连接吗【英文标题】:.Net NMS.ActiveMQ should I store session and connection between message send calls 【发布时间】:2012-12-01 10:15:26 【问题描述】:

我刚开始接触 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 秒发送一条消息) 我应该重用连接、会话或生产者实例,我应该如何应对连接失败?这种情况下的常见模式是什么?

【问题讨论】:

【参考方案1】:

NMS.ActiveMQ 像 java 客户端一样提供故障转移传输,如果连接丢失,它将自动尝试重新连接到代理。您可以使用它来最小化您的故障处理代码。对 AMQ 中的故障转移传输主题进行一些 Google 搜索。

重新创建连接和相关资源不是一个轻量级的操作,因此最好的办法是缓存它们并在需要该连接时重复使用它们。结合故障转移,您可以可靠地反复重用同一个 MessageProducer。

NMS 的模型与 JMS 非常相似,因此对 JMS 进行一些阅读应该会有所启发。

【讨论】:

【参考方案2】:

大概您正在为此使用 NMS? 作为一个建议,您可能需要考虑使用阻塞队列来限制消息,然后批量发送 n 条消息的块......然后您可以保留您的代码并发布批次,同时在处理您的连接、会话和生产者时你已经完成了你正在做的......

至于连接失败 - 您应该能够将异常侦听器连接到您的会话,以便收到任何问题的通知。

【讨论】:

以上是关于.Net NMS.ActiveMQ 我应该存储消息发送调用之间的会话和连接吗的主要内容,如果未能解决你的问题,请参考以下文章

.NET下的使用ActiveMQ

ActiveMq NMS 大约 30 秒后断开连接

ActiveMQ NMS:当代理关闭时,connection.start() 使用故障转移协议挂起

ActiveMQ 未找到连接的 IConnectionFactory 实现

我应该将消息存储在我的数据库中还是每次都查询系统 SMS 数据库?

ASP.NET SignalR - 无法将存储在数据库中的消息列表发送给用户