JMS ExceptionListener

时间:2015-05-28 08:38:46

标签: java jms

我正在使用javax.jms.Connection发送&从JBoss501接收jms消息。我也在使用Connection.setExceptionListener()。我想知道是否需要在连接启动之前设置异常监听器(Conneciton.start())?任何重现JBoss连接异常的想法都会确认是否调用了异常监听器。

2 个答案:

答案 0 :(得分:1)

使用Jboss 5.0.1,即使在启动连接后设置异常监听器也能正常工作。正如“MrSimpleMind”所提到的,异常监听器在启动连接之前提供更好的服务 - 实际上 - 只要从ConnectionFactory创建连接就最好。

即使没有启动连接,异常监听器也是有效的 - 如果是Jboss 501。

 //Main       
 try {
        connection = getConnection();
        connection.setExceptionListener(new MyExceptionListener());
       //Exception listener is effective even before connection is started.
        //connection.start(); 
        while(true){
            try {
                Thread.sleep(1000 * 5);
                Log.l("Kill the JMS provider any time now. !! Observe if the JMS listener works.");
            } catch (InterruptedException e) {
                //do nothing.
            }
        }
    } catch (NamingException e) {
        e.printStackTrace();
    } catch (JMSException e) {
        e.printStackTrace();
    }

    //Exception Listener
    public class MyExceptionListener implements ExceptionListener {

    @Override
    public void onException(JMSException e) {
            Log.l("Exception listener invoked");
    }
    }

为了重现触发/调用ExceptionListener的场景,我使用了JBoss Management Console并使用Jboss mgmt console公开的mx bean停止了ConnectionFactory。

答案 1 :(得分:0)

来自规范:

  

如果JMS提供程序检测到Connection对象存在严重问题,则会通知Connection对象的ExceptionListener(如果已注册)。它通过调用侦听器的onException方法,向它传递一个描述问题的JMSException参数来实现这一点。

     

异常侦听器允许客户端异步通知问题。有些连接只消耗消息,因此没有其他方法可以了解它们的连接是否失败。

请记住,这里有供应商特定实施的地方,关于如何处理异常。一些供应商试图修复"如果可能的话。

现在关于在设置异常监听器之前或之后启动连接... 始终在启动连接之前设置异常侦听器。

关于复制,我认为你可以

  • 启动使用者,应该运行connection.start。等待消息。
  • 马上关闭jboss。
  • 重启jboss。

我也知道使用Eclipse或其他开发工具将帮助您在调试模式下启动,并且您可以在调试器显示状态时的任何特定时间中止jboss服务器并重新启动它。