独立客户端中的JMS连接

独立客户端中的JMS连接,jms,activemq,message-queue,ibm-mq,Jms,Activemq,Message Queue,Ibm Mq,我正在设计一个独立的应用程序(没有应用程序服务器),它将每5分钟调用两个计时器并发送(基于控制器中是否存在文件)和从队列接收消息。此应用程序计划连续运行很长时间(年) 现在我有一个难题:是否只创建一次JMS连接并一直使用它。。或者每5分钟连接一次并关闭它们。。。(完成业务逻辑后) 对设计有什么建议会有帮助吗?如果我使用单连接(并使用JMS MessageListenr),如果队列管理器关闭并且在一两天后出现,将会发生什么 我用ActiveMQ尝试了一个示例。。。一旦我杀了活跃的mq代理和制作人。

我正在设计一个独立的应用程序(没有应用程序服务器),它将每5分钟调用两个计时器并发送(基于控制器中是否存在文件)和从队列接收消息。此应用程序计划连续运行很长时间(年)

现在我有一个难题:是否只创建一次JMS连接并一直使用它。。或者每5分钟连接一次并关闭它们。。。(完成业务逻辑后)

对设计有什么建议会有帮助吗?如果我使用单连接(并使用JMS MessageListenr),如果队列管理器关闭并且在一两天后出现,将会发生什么

我用ActiveMQ尝试了一个示例。。。一旦我杀了活跃的mq代理和制作人。。。侦听器线程(只创建一次conn并使用MessageListener)应用程序在几分钟后自动结束

//下面是侦听器代码

    connectionFactory = new ActiveMQConnectionFactory(
            ActiveMQConnection.DEFAULT_USER,
             ActiveMQConnection.DEFAULT_PASSWORD,
            ActiveMQConnection.DEFAULT_BROKER_URL);
     connection = connectionFactory.createConnection();
     connection.start();
     session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE);
     destination = session.createQueue("mmy first active mq queue");

    MessageConsumer consumer = session.createConsumer(destination);
    MyListener mylistener = new MyListener();
    consumer.setMessageListener(mylistener);
    connection.setExceptionListener(mylistener);

在我看来,单一连接将是一个非常糟糕的选择,原因如下:

  • 特殊情况(断开连接、摔倒等)可能会导致您的听众摔倒(不再倾听)

  • Java的内存消耗可能达到不需要的水平

  • 程序总是需要更改,因此使用一个连接不是那么动态

  • 队列的最大优点是,它得到的消息可以保留我们想要的时间,所以如果
    您的程序可以以非同步方式工作,没有理由使用on连接。

    在ActiveMQ中,使用一个连接是可能的,也是一个很好的解决方案,但这当然取决于应用程序。ActiveMQ提供了一个库,该库提供了一种可以在应用程序中使用的连接池机制。不使用标准ActiveMQConnectionFactory,而是使用PooledConnectionFactory,在封面下,应用程序使用的连接实例将为您进行池化

    每次需要连接时,工厂都可以从池中返回一个未使用的连接,并且每个连接中也可以有一组会话池,这进一步降低了加速连接和会话所需的分配量和线路级聊天量

    有一些关于这个主题的有趣的博客,你可以探索


    另一个查找代码示例的地方是ActiveMQ源代码本身,该模块有几个单元测试来显示池的运行情况。

    对于任何消息传递系统,您总是需要让程序在某个点重试连接时超时,以便发出警报。例如,如果您的QMgr实际上已关闭一两天,您可能希望应用程序在连接丢失后几分钟内记录该事件,而不是在没有警告的情况下阻止重新连接尝试等待两天

    考虑到这一需求,首先要做的是将应用程序设计为在一个序列上循环,该序列包括到消息传递引擎的连接尝试和异常处理。在该循环中,您可以假设存在连接,并根据需要维护队列句柄或打开和关闭队列。要么在这个内部循环中驱动轮询,要么在每次迭代中干净地退出,让外部循环根据需要重新驱动连接

    只要外部循环处于适当位置,您的应用程序就可以连续运行,而不管消息引擎端的连接是否中断。(我使用“消息传递引擎”是为了避免使用特定于供应商的术语,例如本回复的通用部分中的队列管理器。)

    如果要使用WebSphere MQ,则可以通过使用多实例HA QMgr在应用程序运行时升级QMgr。该应用程序将无缝地重新连接到正在运行的QMgr的一半,而无需更改代码。如果需要两阶段提交,您可以使用XA。如果重新连接轮询超过您配置的阈值而未找到实时QMgr,则应用程序将收到一个错误代码,您可以使用该代码发出警报

    最后,应用程序是否应该每5分钟重新连接一次的问题对WMQ QMgr本身没有影响。即使使用TLS通道,QMgr上的额外负载也可以忽略不计。主要考虑的是频道启动时间,但5分钟的轮询不太可能成为问题。其他交通工具可能有问题,也可能没有问题,但我没有资格与他们交谈。就WebSphereMQ而言,没有任何问题。即使是一个小的QMgr也可以同时处理数千个连接。在嘈杂的网络环境中,重新连接每个轮询方法的优点是抛出的错误更少。这是因为与在不稳定的网络上保持连续连接相比,简单地获得连接并干净地退出要容易得多。因此,如果应用程序和服务器位于同一个数据中心,则两个选项中的任何一个都有效。如果它们通过广域网连接,并且受到防火墙超时和其他中断的影响,那么连接越短越好