1

我正在设计一个独立的应用程序(没有应用程序服务器),它将每 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);
4

3 回答 3

0

在 ActiveMQ 中,使用一个连接是可能的,并且可能是一个很好的解决方案,但当然这取决于应用程序。ActiveMQ 提供的库提供了可以在应用程序中使用的连接池机制。您使用 PooledConnectionFactory 而不是使用标准的 ActiveMQConnectionFactory,并且在幕后,您的应用程序使用的 Connection 实例是为您池化的。

每次你需要一个连接时,工厂可以从池中返回一个未使用的连接,并且每个连接都可以有一组会话也汇集在其中,进一步降低了启动连接和会话所需的分配量和线级聊天。

您可以探索一些有关该主题的有趣博客。

在 ActiveMQ 中使用带有 Spring的 ActiveMQ 中的池连接

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

于 2013-02-17T17:30:16.213 回答
0

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

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

只要外部循环到位,您的应用程序就可以连续运行,而不管消息引擎端的连接丢失。(我使用“消息引擎”来避免使用特定于供应商的术语,例如此回复的通用部分的队列管理器。)

如果您要使用 WebSphere MQ,则可以在应用程序运行时使用多实例 HA QMgr 执行升级 QMgr 之类的操作。该应用程序将无缝重新连接到 QMgr 的运行部分,无需更改代码,如果您需要两阶段提交,您可以使用 XA。如果重新连接轮询超过了您配置的阈值而没有找到实时 QMgr,则应用程序会收到一个错误代码,然后您可以使用该代码引发警报。

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

于 2013-02-18T22:16:27.517 回答
0

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

  1. 特殊情况(断开连接、跌倒等)可能会导致您的听众跌倒(不再听)。

  2. Java 的内存消耗可能会达到不需要的水平。

  3. 程序总是需要改变,所以使用一个连接不是那么动态的。

队列的最大优点是它得到的消息可以保留多久,所以如果你的程序可以以非同步方式工作,就没有理由继续连接。

于 2013-02-17T13:36:22.923 回答