【问题标题】:Which is the best way to handle exception in java MDB?在 java MDB 中处理异常的最佳方法是什么?
【发布时间】:2011-01-28 08:14:37
【问题描述】:

我得到了这个用例:

此图表示一个企业模型。 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?

亲切的问候 马西莫

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    有点跑题了,但是你确定你需要 jpatemplate 吗?似乎几乎每个人都同意 JPA API 本身就很好,不需要 Spring 的任何“增强”,包括 SpringSource 本身。

    【讨论】:

    • 我注意到你对这个话题的评论,我想知道使用 jpa 而不是 jpatemplate 的权衡是什么。
    • 与其他一些从 Spring 的模板中获益很多或至少一点点的 API 不同,JPA API 已经是一个设计良好的现代 API。使用 jpatemplate 的权衡是您正在使用另一个不需要 API 的 API。我想不出有什么好处,因此它看起来不像是一种权衡。
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多