2011-07-01 50 views
1

我们正在使用一个包含jboss @Service mbean的应用程序,它封装了一个javax.jms.Connection对象。如何处理连接对象到远程jms服务器

在连接过程中被初始化远程的InitialContext,从上下文中查找该连接工厂,并创建从工厂的连接创建的MBean的启动:

@Service 
public class JMSPublisher extends etcc.... { 
    private Connection connection; 
    protected void startService() { 
     Context ctx = getRemoteInitialContext(); 
     ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup("ConnectionFactory"); 
     connection = connectionFactory.createConnection(); 
    } 
} 

我的问题是:多久我们就可以应该保持这种联系?在实践中,我们看到当我们尝试在未定义的时间之后创建会话时,连接会抛出JMSException。

Connection的文档告诉我们一个对象表示一个套接字,因此由于不活动而超时可能是正常的。但是,我们如何处理它而无需为每条消息建立新的关系?

回答

3

最好的办法是让JMSPublisher实现javax.jms.Exception的收听者。实施连接()方法,安全地获取关于连接:

  1. startService
  2. onException的

一对夫妇加分:

  • 对于代码压缩,只需通过资源注入获取JMS连接工厂即可。在调用startService之前将解析连接工厂参考,并且还将作为隐含取决于,使JMS连接工厂成为您的服务的依赖项。

  • 有无JMSPublisher延伸org.jboss.system.ServiceMBeanSupport并实施延伸org.jboss.system.ServiceMBean令牌MBean接口(JMSPublisherMBean)。这将确保依赖关系在服务启动(和停止)中得到遵守。

资源注入JMS连接工厂

@Resource(mappedName="ConnectionFactory") 
private javax.jms.ConnectionFactory connectionFactory; 
private volatile javax.jms.Connection connection; 

改性startService()

public void startService() { 
    connect(); 
} 

连接异常处理程序

public void onException(JMSException je) { 
    connect(); 
} 

* 安全连接初始化程序(添加conn。启动())*

private void synchronized connect() { 
    log.info("Initializing Connection...."); 
    try { 
     if(connection!=null) { 
      try { connection.stop(); } catch (Exception e) {} 
      try { connection.close(); } catch (Exception e) {} 
     } 
     connection = connectionFactory.createConnection(); 
     connection.setExceptionListener(this); 
     connection.start(); 
    } catch (Exception e) { 
     log.error("Failed to intialize JMS connection", e); 
    } 
} 

这不会自动照顾通过空连接分配的其他JMS资源,但如果其他部件都采用此组件举行的连接,你可以从JMSPublisher发布JMX通知表示连接已丢失并清理/重新获取通知收据。

+0

谢谢,这会有很大帮助 – Tim