2013-02-17 177 views
1

我正在设计一个独立的应用程序(无应用程序服务器),它将每隔5分钟调用两个定时器并发送(根据文件是否存在于导演中)并接收来自队列的消息。此应用程序计划连续运行很长时间(几年)....独立客户端中的JMS连接

现在我有一个困境是否只创建一次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); 

回答

0

在后自动结束我的意见单一连接将是一个非常糟糕的选择严重的原因:

  1. 特殊情况下(断开连接,跌倒等)可能会导致听众摔倒(而不是再听)。

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

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

队列的最大优点是thah它变得可以住,只要我们想要的信息,所以,如果 您的程序可以在非syncronus方式工作,没有理由对连接布莱恩。

0

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

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

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

Pooled Connections in ActiveMQ Using ActiveMQ with Spring

另一个地方寻找代码样本是在ActiveMQ的源本身的模块有几个单元测试,显示在行动池中。

0

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

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

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

如果要使用WebSphere MQ,可以执行诸如升级QMgr同时通过使用多实例HA QMgr运行应用程序。该应用将无缝地重新连接到QMgr的运行半部分,无需更改代码,如果您需要两阶段提交,则可以使用XA。如果重新连接轮询超过了配置的阈值而未找到活动的QMgr,则应用程序会收到一条错误代码,然后您可以使用该错误代码提醒警报。

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