Jboss 如何处理到远程jms服务器的连接对象
我们使用的应用程序包含一个jboss@Service mbean,它封装了一个javax.jms.Connection对象 在mbean启动期间,通过初始化远程InitialContext、从该上下文查找ConnectionFactory并从该工厂创建连接来创建连接:Jboss 如何处理到远程jms服务器的连接对象,jboss,connection,jms,Jboss,Connection,Jms,我们使用的应用程序包含一个jboss@Service mbean,它封装了一个javax.jms.Connection对象 在mbean启动期间,通过初始化远程InitialContext、从该上下文查找ConnectionFactory并从该工厂创建连接来创建连接: @Service public class JMSPublisher extends etcc.... { private Connection connection; protected void startServ
@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
连接文档告诉我们一个对象代表一个套接字,因此由于不活动而导致的超时可能是正常的。但是我们如何在不为每条消息创建新连接的情况下处理它呢?您最好的选择是让JMSPublisher实现侦听器。实施一个connect()方法,该方法可以安全地在以下位置获取连接:
- 对于代码压缩,只需通过资源注入获取JMS连接工厂。连接工厂引用将在调用startService之前解析,并且还将充当隐式依赖项,使JMS连接工厂成为服务的依赖项
- 让JMSPublisher扩展并实现扩展的令牌MBean接口(JMSPublisherMBean)。这将确保在服务启动(和停止)时遵守依赖关系
@Resource(mappedName="ConnectionFactory")
private javax.jms.ConnectionFactory connectionFactory;
private volatile javax.jms.Connection connection;
修改的startService()
连接异常处理程序
public void onException(JMSException je) {
connect();
}
*安全连接初始值设定项(添加连接开始()*
这将不会自动处理通过丢失的连接分配的其他JMS资源,但是如果其他组件正在使用此组件保持的连接,则可以从JMSPublisher发布JMX通知,指示连接已丢失,并在通知接收上清除/重新获取
public void onException(JMSException je) {
connect();
}
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);
}
}