Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 带有事务的SourcePollingChannelAdapter_Spring_Spring Integration_Spring Transactions - Fatal编程技术网

Spring 带有事务的SourcePollingChannelAdapter

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

我希望在实现轮询时使用SourcePollingChannelAdapter和所需的事务传播,以便在发生错误时回滚所有操作。方法setTransactionSynchronizationFactory未被注释。。。 非常感谢你的帮助

在XML中,我可以做到:

<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));