在JMS中,很容易发现连接是否丢失,发生异常.但是我怎么知道连接是否再次存在?
场景:我使用JMS与我的服务器通信.现在我的连接断开(服务器关闭),这导致异常.到现在为止还挺好.如果服务器再次启动并重新建立连接,我该如何知道?
我没有看到任何能够提供此类信息的听众.
T.R*_*Rob 16
啊......旧的异常处理/重新连接难题.
有些传输提供商会自动为您重新连接您的应用程序,以及一些使应用程序驱动器重新连接的应用程序.通常,重新连接会将异常隐藏在应用程序之外.缺点是,如果所有远程消息传递节点都关闭,您不希望应用程序永久挂起,因此最终必须包含一些重新连接逻辑.
现在这里是有趣的部分 - 您如何以提供商中立的方式处理异常?JMS例外实际上毫无价值.例如,"安全性异常"可能是Java安全策略过于严格,文件系统权限过于严格,LDAP凭据失败,传输连接失败,队列或主题打开失败或其他几十个与安全相关的问题.这是链接的异常,它具有来自传输提供程序的详细信息,可以帮助调试问题.我的客户一般采取三种不同的方法之一......
在您的情况下,队列和主题对象可能仅在原始连接的上下文中有效.假设提供者自动重新连接您获得异常的事实意味着重新连接失败,并且无法恢复队列和主题对象的上下文.关闭所有对象并重新连接.
您是否想要做更多特定于提供者的事情,例如区分瞬态错误和永久性错误,这是"依赖"的事情之一,您必须根据具体情况来解决这个问题.
监视连接异常的最佳方法是设置异常监听器,例如:
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("jmsContextName");
connection = connectionFactory.createConnection();
connection.setExceptionListener(new ExceptionListener() {
@Override
public void onException(JMSException exception) {
logger.error("ExceptionListener triggered: " + exception.getMessage(), exception);
try {
Thread.sleep(5000); // Wait 5 seconds (JMS server restarted?)
restartJSMConnection();
} catch (InterruptedException e) {
logger.error("Error pausing thread" + e.getMessage());
}
}
});
connection.start();
Run Code Online (Sandbox Code Playgroud)
JMS 规范没有描述任何传输协议,它没有说明任何关于连接的内容(即代理应该让它们保持活动状态还是为每个会话建立一个新连接)。所以,我想你的意思
现在我的连接中断(服务器关闭),导致异常。
是您尝试发送消息并且收到 JmsException。
我认为,查看代理是否已启动的唯一方法是尝试发送消息。
| 归档时间: |
|
| 查看次数: |
26537 次 |
| 最近记录: |