1

我得到了这个用例:

此图表示企业模型。Weblogic 10.3 上的 Java EE 技术利用用于 IoC 和 AOP 的 spring 框架、用于持久性的 JPA 与 spring jpatemplate、用于交互框架的 spring 集成。如您所见,Service 和 Gateway 之间没有耦合,因为 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?

亲切的问候马西莫

4

1 回答 1

1

在这种情况下处理异常的最佳方法是什么?捕获 MDB 中的所有 runtimeExceptions?

这取决于您想要达到的目标。如果从您的描述中感觉到您想要防止消息被回滚。那正确吗?

在那种情况下,捕获所有运行时异常只会让你到目前为止。系统也可能会抛出错误,您将无法捕捉到这些错误。因此,您必须改为捕获 Throwable 。但是,事务仍然可能超时,导致回滚。

简而言之,您是否希望您的 MDB 完全具有事务性?

另请注意,来自发送方的事务上下文不会传播到 MDB。

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

于 2011-01-29T10:22:18.227 回答