java - java MDB 中处理异常的最佳方法是什么?

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

我得到了这个用例:

该图代表一个企业模型。 Weblogic 10.3 上的 Java EE 技术,利用 Spring 框架实现 IoC 和 AOP,利用 Spring jpatemplate 实现 JPA 持久化,利用 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 中的所有运行时异常?

亲切的问候 马西莫

最佳答案

Which is the best way to handle exceptions in this scenario? Catch all the runtimeExceptions in the MDB?

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

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

简而言之,您希望 MDB 具有事务性吗?

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

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

关于java - java MDB 中处理异常的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4826155/

相关文章:

Java - 如何为类外变量抛出 IllegalArgumentException

java - android fragment 中的textview中不显示全文

java - 只需要在列表中添加父类对象,限制子类对象

c++ - 如何在 bash 文件异常退出时捕获异常?

c# - 防止出现未处理的异常对话框

jakarta-ee - EJB2 和 EJB3 可以共存于一个应用程序中吗?

java - 如何在 EJB 3.0 中声明预期异常?

c# - 向流畅的界面构建器添加 fork

C++ 基本字符串异常

java - EJB 3.0 异常处理