2013-10-17 113 views
0

我想使用一個SourcePollingChannelAdapter與事務傳播實現輪詢時需要,以回滾所有操作,如果發生錯誤。 setTransactionSynchronizationFactory方法未被評論... 非常感謝您的幫助!SourcePollingChannelAdapter與交易

在XML中我可以這樣做:

<int:poller fixed-rate="5000"> 
    <int:transactional transaction-manager="transactionManager" propagation="REQUIRED" /> 
</int:poller> 

我想用這樣的交易程序與SourcePollingChannelAdapter和PeriodicTrigger,但我不知道怎麼辦。

我有這樣的:

SourcePollingChannelAdapter adapter = new SourcePollingChannelAdapter(); 
adapter.setSource(source); 
adapter.setTrigger(new PeriodicTrigger(5, TimeUnit.SECONDS)); 
adapter.setOutputChannel(channel); 
adapter.setBeanFactory(ctx); 
adapter.start(); 

當豆源被調用時,在數據庫中的一個元素被刪除,創建一個消息,並在發送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像你說的:(

+1

對不起,沒有足夠的信息。 'poller'可以標記爲''。在這裏,請:http://docs.spring.io/spring-integration/docs/2.2.6.RELEASE/reference/html/transactions.html#transaction-synchronization –

+0

我根據新鮮信息更新了我的答案 –

+0

我更新了我的問題, 謝謝你的時間。 –

回答

0

如果我理解正確的話,你需要使用這一個:DefaultTransactionSynchronizationFactory

這裏是一個快照如何配置它:

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會做的東西。