Spring 带有事务的SourcePollingChannelAdapter
我希望在实现轮询时使用SourcePollingChannelAdapter和所需的事务传播,以便在发生错误时回滚所有操作。方法setTransactionSynchronizationFactory未被注释。。。 非常感谢你的帮助 在XML中,我可以做到:Spring 带有事务的SourcePollingChannelAdapter,spring,spring-integration,spring-transactions,Spring,Spring Integration,Spring Transactions,我希望在实现轮询时使用SourcePollingChannelAdapter和所需的事务传播,以便在发生错误时回滚所有操作。方法setTransactionSynchronizationFactory未被注释。。。 非常感谢你的帮助 在XML中,我可以做到: <int:poller fixed-rate="5000"> <int:transactional transaction-manager="transactionManager" propagation="REQUI
<int:poller fixed-rate="5000">
<int:transactional transaction-manager="transactionManager" propagation="REQUIRED" />
</int:poller>
当调用bean源时,删除数据库中的一个元素,创建一条消息并在outputchannel中发送;但是,如果在ouputchannel之后流中出现错误,我希望恢复数据库并返回元素。。。一个简单的事务实际上是传播的。我不明白你是怎么做到的
输出通道为:
<int:channel id="channel" >
<int:queue />
</int:channel>
<int-http:outbound-gateway request-channel="channel"
url="http://localhost:8081/icopitole-ws/baseactive" http-method="GET"
reply-channel="reresponseVersionChannel" expected-response-type="java.lang.String" />
当URL没有响应时,会引发异常,但不会执行回滚,尽管我已经添加了DefaultTransactionSynchronizationFactory和TransactionInterceptor,如您所说:(如果我正确理解您的意思,您需要使用此选项: 下面是如何配置它的快照:
SourcePollingChannelAdapter adapter = new SourcePollingChannelAdapter();
ExpressionEvaluatingTransactionSynchronizationProcessor syncProcessor =
new ExpressionEvaluatingTransactionSynchronizationProcessor();
syncProcessor.setBeanFactory(mock(BeanFactory.class));
PollableChannel queueChannel = new QueueChannel();
syncProcessor.setBeforeCommitExpression(new SpelExpressionParser().parseExpression("#bix"));
syncProcessor.setBeforeCommitChannel(queueChannel);
syncProcessor.setAfterCommitChannel(queueChannel);
syncProcessor.setAfterCommitExpression(new SpelExpressionParser().parseExpression("#baz"));
DefaultTransactionSynchronizationFactory syncFactory =
new DefaultTransactionSynchronizationFactory(syncProcessor);
adapter.setTransactionSynchronizationFactory(syncFactory);
事务边界包含在SourcePollingChannelAdapter#adviceChain
中,因此应如下配置:
TransactionInterceptor txAdvice =
new TransactionInterceptor(transactionManager,
new MatchAlwaysTransactionAttributeSource(new DefaultTransactionAttribute()));
adapter.setAdviceChain(Collections.singletonList(txAdvice));
因此,现在每个“轮询”都将用事务包装,您的
syncFactory
将完成这些工作。抱歉,信息不足。轮询器可以标记为
。这里,请:我根据最新信息更新了我的答案我更新了我的问题,谢谢您的时间。首先,您的问题看起来很糟糕。您应该展示一下所有信息都从一开始。现在我知道发生了什么:您的通道是队列,因此http请求将由单独的线程处理,并且您的事务将在消息放入队列时成功提交。将其更改为直接通道,evrything就可以了。请让问题更具信息性-节省我们的时间!非常抱歉(因为我的英语也不好),我是第一次发帖,所以下次我会尽全力。我认为这个频道应该是一个受欢迎的频道。有了Direct频道,它就成功了。非常感谢大家!
TransactionInterceptor txAdvice =
new TransactionInterceptor(transactionManager,
new MatchAlwaysTransactionAttributeSource(new DefaultTransactionAttribute()));
adapter.setAdviceChain(Collections.singletonList(txAdvice));