Любые ошибки в процессе выполнения в JMS-приложении приводят к генерации исключения javax.jms.JMSException. Класс JMSException является корневым классом для всех исключений JMS API.
Класс JMSException содержит следующую информацию.
• Специфичную для провайдера строку описания ошибки.
• Специфичную для провайдера строку с кодом ошибки.
• Ссылку на другое исключение.
Исключение JMSException обычно является результатом генерации другого исключения в базовом JMS-провайдере. Класс JMSException позволяет клиентским JMSприложениям обращаться к исходному исключению, используя метод getLinkedException. Такое связанное исключение может использоваться для определения основной причины проблемы в JMS-провайдере.
Реализация класса JMSException не включает вложенное исключение в выходные данные метода toString. Следовательно, необходимо явным образом проверить вложенное исключение и вывести его, как показано в примере 8.10.
Пример 8.10. Обработка исключения javax.jms.JMSException
try
{
// код, который может сгенерировать исключение JMSException
}
catch (JMSException exception) {
System.err.println(«Exception caught: « + exception);
Exception linkedException = exception.getLinkedException(); if (linkedException != null)
{
System.err.println(«Linked exception: « + linkedException);
}
}
Однако при использовании получателя запросов для асинхронного получения сообщений, код приложения не может перехватывать исключения, вызываемые ошибками получения сообщений. Это объясняется тем, что код приложения не производит явного вызова методов объекта-получателя, которые получают сообщения.
JMS API предлагает для решения этой проблемы интерфейс javax.jms.Exception Listener. Этот получатель исключений позволяет уведомлять клиента о проблеме в асинхронном режиме. JMS-клиент должен зарегистрировать объект, реализующий этот интерфейс, в объекте-соединении, используя метод setExceptionListener. После регистрации экземпляра получателя исключений, JMS-провайдер будет вызывать его метод onException для отправки уведомления о проблеме.
Интерфейс javax.jms.ExceptionListener показан в примере 8.11.
Пример 8.11. Интерфейс javax.jms.ExceptionListene r
package javax.jms;
public interface ExceptionListener {
public void onException(JMSException exception);
}
Простой класс, реализующий интерфейс javax.jms.ExceptionListener, показан в примере 8.12.
Пример 8.12. Простая реализация класса слушателя сообщений package com.ibm.itso.jms;
import javax.jms.ExceptionListener; import javax.jms.JMSException;
public class SimpleExceptionListener implements ExceptionListener {
public void onException(JMSException exception) {
System.err.println(«Exception caught: « + exception);
Exception linkedException = exception.getLinkedException(); if (linkedException != null)
{
System.err.println(«Linked exception: « + linkedException);
}
}
}