javax.jms.ExceptionListener vs try {} catch(JMSException){}

时间:2013-11-19 20:22:30

标签: java exception-handling try-catch activemq

我会尽量详细说明。也就是说,这是我的第一篇文章,所以请随意批评表格/结构/不管,谢谢!

我正在实现MessageListenerjavax.jms.MessageListener),当我开始时,我的IDE(Netbeans)请求我设置ExceptionListener。代码如下:

public class MessageQueueListener implements MessageListener
{
  public void run()
  {
   ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(<ActiveMQ-address>);
   Connection connection = connectionFactory.createConnection();
   connection.setExceptionListener(new ExceptionListener()      
   {
      @Override
      public void onException(JMSException jmse)
      {
          //Handle Exception
      } 
    });

    Session session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    Destination destination = session.createQueue("NotificationMessageQueue");
    Consumer consumer = _session.createConsumer(destination);
    consumer.setMessageListener(this);
    connection.start();
  }
}

我当时并没有多想,因为为潜在的连接问题设置一个监听器是有意义的。但是,当我继续执行我的实现时,我在次要方法上添加了try/catch语句,这些语句更具体地针对我的用例。

例如:

public boolean postNotification(Message message)
{
    String urlParameters = "dummy=dummy";

    try
    {
        postRequest(urlParams); //Below
    }
    catch (MalformedURLException mfe)
    {
       //Handle Exception
    }
    catch (IOException ioe)
    {
        String eMessage = ioe.getMessage();
        if(eMessage.contains("401"))
        {
             //Handle Exception
        }
        return false;
    }

    return true;
}

public void postRequest(String urlParams) throws MalformedURLException, IOException
{
        URL url = new URL(<url-to-post-to>);

        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.addRequestProperty("Authorization", "Basic " + encodedLogin);
        con.setRequestMethod("POST");
        con.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes(urlParams);
        wr.flush();
        wr.close();


        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) 
        {
            System.out.println(inputLine);
        }
        in.close();

        con.disconnect();
} 

无论如何,现在我的run()方法正在请求try/catch,项目开头的ExceptionListener不再有用。使用try/catch es似乎一切正常,所以我很好奇发生了什么变化。我试图自己发现原因,但没有运气。

因此,所有这些都是要问的背景:使用ExceptionListenertry/catch之间的区别是什么?使用其中一个是否有优势,至少对于像我这样的实现?

2 个答案:

答案 0 :(得分:2)

他们不是替代品。消费者需要ExceptionListener因为它是MessageListener,并且不调用连接上的任何方法,因此无法知道连接失败。但是,当您调用抛出已检查异常的方法时,您必须捕获它。编译器会让你。

答案 1 :(得分:0)

try/catch是Java构造的基础之一。它用于处理意外错误。所以,你会经常使用try/catch

  

通过提供一个或,将异常处理程序与try块关联   try块后直接捕获更多块。之间没有代码   try块的结束和第一个catch块的开始。

     

尝试{

     

} catch(ExceptionType名称){

     

} catch(ExceptionType名称){

     

}

     

每个catch块都是一个异常处理程序并处理其类型   其论点表明的例外情况。参数类型,ExceptionType,   声明处理程序可以处理的异常类型,必须是   从Throwable类继承的类的名称。该   handler可以引用带有名称的异常。

另一方面,ExceptionListener仅适用于JMS:

  

如果JMS提供程序检测到Connection对象出现严重问题,   它通知Connection对象的ExceptionListener,如果有的话   注册。它通过调用侦听器的onException方法来完成此操作,   传递一个描述问题的JMSException参数。一个   异常监听器允许客户端收到问题通知   异步。有些连接只消耗消息,所以他们会这样做   没有其他方法可以了解他们的连接失败了。   JMS提供程序应尝试自行解决连接问题   在它通知客户之前。

在您的情况下,您必须同时使用try/catchExceptionListenerExceptionListener是特定于JMS的,因此您不会使用它。 try/catch是Java的基础。