哪个是处理java MDB异常的最佳方法?

时间:2011-01-28 08:14:38

标签: java exception-handling ejb-3.0 message-driven-bean java-ee-5

我得到了这个用例:

此图表示企业模型。 Weblogic 10.3上的Java EE技术,具有针对IoC和AOP的spring框架,JPA针对spring jpatemplate的持久性,针对交互框架的spring集成。 正如您所看到的,服务和网关之间没有耦合,因为Spring集成添加了所需的所有神奇糖。

现在我必须处理异常处理。所有链都没有检查异常:数据访问也没有检查异常,因为jpatemplate在运行时异常中包装了所有sql异常。

因此我处理的唯一检查异常是在MDB上

@Override
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void onMessage(Message message) {
        try {
            TextMessage textMessage = (TextMessage) message;
            String stringMessage = textMessage.getText();

            OnlineEventMessage<? extends Serializable> event = eventMessageParser.parse(stringMessage);

            legacyEventMessageService.handle(event);
        } catch (JMSException e) {
            logger.error("si e' verificato un errore JMS nel processamento dell'evento {}", message, e);
        }
    }

我注意到,如果我在链的某个组件上获得NPE,则消息将在JMS队列上回滚,并且该进程将被循环回来。

在这种情况下,哪种方法可以处理异常? 捕获MDB中的所有runtimeExceptions?

亲切的问候 马西莫

1 个答案:

答案 0 :(得分:1)

  

在这种情况下,哪种方法可以处理异常?捕获MDB中的所有runtimeExceptions?

这取决于你想要达到的目标。如果从您的描述中感觉到您希望阻止消息被回滚。是吗?

在这种情况下,捕获所有运行时异常只会让你到目前为止。系统也可能抛出错误,然后你就不会发现错误。所以你必须抓住Throwable。但是,交易仍然可能超时,导致回滚。

简而言之,您希望MDB完全是交易性的吗?

另请注意,发件人的事务上下文不会传播到MDB。

稍微偏离主题,但你真的确定需要jpatemplate吗?似乎每个人都同意JPA API本身很好并且不需要Spring的任何“增强”,包括SpringSource本身。