我得到了这个用例:
此图表示企业模型。 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?
亲切的问候 马西莫
答案 0 :(得分:1)
在这种情况下,哪种方法可以处理异常?捕获MDB中的所有runtimeExceptions?
这取决于你想要达到的目标。如果从您的描述中感觉到您希望阻止消息被回滚。是吗?
在这种情况下,捕获所有运行时异常只会让你到目前为止。系统也可能抛出错误,然后你就不会发现错误。所以你必须抓住Throwable。但是,交易仍然可能超时,导致回滚。
简而言之,您希望MDB完全是交易性的吗?
另请注意,发件人的事务上下文不会传播到MDB。
稍微偏离主题,但你真的确定需要jpatemplate吗?似乎每个人都同意JPA API本身很好并且不需要Spring的任何“增强”,包括SpringSource本身。