【问题标题】:Spring integration inbound jms adapter error-channel does not invokeSpring集成入站jms适配器错误通道不调用
【发布时间】:2014-10-23 13:29:34
【问题描述】:

场景是入站 jms 适配器 -> 服务激活器(数据库搜索、业务逻辑、插入或更新)

<int-jms:message-driven-channel-adapter id="swiftAdapterInput" channel="mt950"
        connection-factory="connectionFactory" destination-name="${integration.swift.jms.queue.from}" pub-sub-domain="false"
        auto-startup="false" error-channel="errorChannel" transaction-manager="transactionManager" acknowledge="transacted" />

<int:service-activator input-channel="errorChannel" ref="errorHandler" />

<bean id="errorHandler" class="nest.integration.utils.error.ErrorHandler" />


<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

当在我的 servcie 激活器期间引发异常时,我的 errorHandler 工作正常,但异常在最后(提交后),例如 db unique constrat 异常,消息不会进入错误通道,而是仅回滚到 jms 队列。

但在这种情况下我还需要我的 errorHander,因为我需要发送电子邮件异常等。

坦克提前 最美好的祝愿,塔马斯

【问题讨论】:

  • 你得到了什么异常?
  • 请为org.springframework.integration类别打开DEBUG并在此处显示有关此事的日志
  • 调试处于活动状态。没有关于错误通道的调试消息。
  • WARN MessageListenerContainer#1-7 org.springframework.jms.listener.DefaultMessageListenerContainer 目标“Consumer.Lime.VirtualTopic.SWIFT.Interface.Test1”的 JMS 消息侦听器调用程序设置失败 - 试图恢复。原因:无法提交 JPA 事务;嵌套异常是 javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException 内部异常: java.sql.SQLException: ORA-00001 : a(z) (NEST.LIME_MT950_DETAIL_PK) egyediségre vonatkozó megszorítás nem tel
  • 例外是ok pk unique constarit,但我想在errorHandler中处理这个以发送电子邮件等。

标签: spring jms integration


【解决方案1】:

我认为您的问题是您必须在 errorHandler 中回滚 TX,但不要提交。

这就是你从DefaultMessageListenerContainer 得到egyediségre vonatkozó megszorítás nem tel 的原因,因为该数据库错误是在提交时引起的。

请看这里:Exceptions in Spring Integration: How to log but not intercept

【讨论】:

  • Spring 在最后提交事务而不是我。问题是我的错误处理程序没有被调用。
  • > 在我的服务激活器期间抛出异常时,我的 errorHandler 工作正常
  • 你的话。所以,或者你必须从你的errorChannel 重新抛出异常,或者只是手动回调它。 Spring 确实尝试提交 TX,但由于约束问题它不能。约束是服务激活器异常的结果。
  • 对不起,我忘了提到这是我的服务激活器抛出的另一个异常,例如检查一些业务检查并在必要时抛出自定义异常。在这种情况下,我的 errorHander 收到消息,我可以发送电子邮件等。但是当 dao.save 并且有 db pk constrait 异常时,我的 errorHandler 没有收到任何消息,而是回滚到队列中。对不起我的英语不好:-(
  • 请在 DEBUG 上将 org.springframework.jms.listener 类别从 handleListenerSetupFailure 切换到 StackTrace。
猜你喜欢
  • 2011-08-29
  • 2015-07-11
  • 2023-03-21
  • 2016-07-19
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
相关资源
最近更新 更多