gpt4 book ai didi

java - 如何使 Spring Integration HTTP outbound-channel-adapter 参与 Global Transaction

转载 作者:行者123 更新时间:2023-11-29 07:06:38 28 4
gpt4 key购买 nike

我有以下 Spring Integration 配置。我在这里所做的是dequeuing 来自主题的消息并在转换后将其发送到某个 HTTP 位置。

JMS 连接工厂 配置如下:

<bean id="inboundCF" 
class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg index="0">
<jee:jndi-lookup jndi-name="java:comp/resource/ABC_AQ/XATopicConnectionFactories/XATCF" />
</constructor-arg>
<property name="sessionCacheSize" value="3" />
</bean>
<bean id="txInboundCF"
class="org.springframework.jms.connection.TransactionAwareConnectionFactoryProxy">
<property name="targetConnectionFactory" ref="inboundCF" />
<property name="synchedLocalTransactionAllowed" value="true" />
</bean>

Message Listener Container配置如下:

<bean id="jmsInboundContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer"
destroy-method="destroy">
<property name="connectionFactory" ref="txInboundCF" />
<property name="destination" ref="inboundDestination" />
<property name="pubSubDomain" value="true" />
<property name="sessionTransacted" value="true" />
<property name="errorHandler" ref="errorHandlerService" />
<property name="subscriptionDurable" value="true" />
<property name="durableSubscriptionName" value="mySub" />
<property name="cacheLevel" value="3" />
</bean>
<int-jms:message-driven-channel-adapter channel="jmsInChannel"
container="jmsInboundContainer" acknowledge="transacted" />

HTTP出站适配器配置如下:

<int-http:outbound-channel-adapter channel="httpOutChannel" url="http://www.example.com/test" http-method="POST" charset="UTF-8" />

在愉快的情况下它工作正常。但是,它不会回滚 http post 消息,但 jms 消息会在 topic 中回滚,以防之后发生任何异常。因此,http:outbound-channel-adapter 不参与全局事务。

我怎样才能做到这一点。感谢这方面的任何帮助。

其次,我可以在我的日志文件中找到以下日志条目,但消息已成功出队。

[23/09/2013 14:27:51] WARN [Thread-102] CachingConnectionFactory.onException(301) | Encountered a JMSException - resetting the underlying JMS Connection
javax.jms.JMSException: java.sql.SQLException: ORA-00942: table or view does not exist

at oracle.jms.AQjmsExceptionListener.run(AQjmsExceptionListener.java:222)
[23/09/2013 14:27:51] WARN [jmsInboundContainer-9] DefaultMessageListenerContainer.handleListenerSetupFailure(821) | Setup of JMS message listener invoker failed for destination 'MY_TOPIC' - trying to recover. Cause: JMS-115: Consumer is closed

最佳答案

这不是 <int-http:outbound-channel-adapter> 的问题.根据定义,HTTP 协议(protocol)不是事务性的。所以,如果你向某个 URL 发送请求并得到 200 OK,这意味着你的请求已成功传递到远程服务器。然而,Spring Integration 为您提供了一些技巧:Transaction Synchronization它可能看起来像这样:

<jms:inbound-channel-adapter>
<int:poller>
<int:transactional synchronization-factory="syncFactory"/>
</int:poller>
</jms:inbound-channel-adapter>

<int:transaction-synchronization-factory id="syncFactory">
<int:after-commit channel="httpOutboundChannel"/>
</int:transaction-synchronization-factory>

还有你的<jms:inbound-channel-adapter>可能会向一些空的处理程序发送消息,例如nullChannel

关于java - 如何使 Spring Integration HTTP outbound-channel-adapter 参与 Global Transaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18957096/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com