独立客户端中的JMS连接

时间:2013-02-17 12:03:51

标签: jms activemq message-queue ibm-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);

3 个答案:

答案 0 :(得分:0)

在我看来,单一联系将是一个非常糟糕的选择因为severel原因:

  1. 特殊情况(断线,坠落等)可能会导致听众摔倒(而不是再次听)。

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

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

  4. 队列的一大优势就是它得到的消息可以保留我们想要的时间,所以如果 你的程序可以以非同步的方式工作,没有理由进行连接。

答案 1 :(得分:0)

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

每次需要连接时,工厂都可以从池中返回一个未使用的Connection,每个Connection都可以在其中汇集一组Sessions,从而进一步降低分配数量和启动连接和会话所需的线路级别聊天。

您可以探索一些有趣的博客。

Pooled Connections in ActiveMQ Using ActiveMQ with Spring

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

答案 2 :(得分:0)

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

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

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

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

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

相关问题