2013-10-17 2 views
0

오류가 발생하면 모든 작업을 롤백하기 위해 폴링이 실현 될 때 트랜잭션 전파가 필요한 SourcePollingChannelAdapter를 사용하고 싶습니다. 메서드 setTransactionSynchronizationFactory에 주석이 없습니다 ... 도움을 주셔서 대단히 감사합니다!트랜잭션이있는 SourcePollingChannelAdapter

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

내가 프로그래밍 SourcePollingChannelAdapter과 PeriodicTrigger와 같은 트랜잭션을 사용하고 싶습니다,하지만 난 방법을 모르는 :

XML에서 나는 할 수있다.

나는이있다 :

콩 소스를 호출
SourcePollingChannelAdapter adapter = new SourcePollingChannelAdapter(); 
adapter.setSource(source); 
adapter.setTrigger(new PeriodicTrigger(5, TimeUnit.SECONDS)); 
adapter.setOutputChannel(channel); 
adapter.setBeanFactory(ctx); 
adapter.start(); 

, 데이터베이스의 요소는 메시지가 생성되고 outputchannel에 전송 삭제됩니다; 하지만 ouputchannel 후 흐름에 오류가 있다면 나는 데이터베이스를 복원하고 요소가 돌아 왔으면 좋겠어 ... 실제로 전파와 간단한 거래. 나는 어떻게하는지 이해하지 못한다.

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이 응답하지 않는 경우, 당신은 :(

+1

죄송합니다. 정보가 충분하지 않습니다. 'poller'는''로 표시 될 수 있습니다. 여기, http://docs.spring.io/spring-integration/docs/2.2.6.RELEASE/reference/html/transactions.html#transaction-synchronization –

+0

신선한 정보에 따라 내 대답을 업데이트했습니다. –

+0

내 질문을 업데이트했습니다. , 시간 내 줘서 고마워. –

답변

0

을 말했듯이 나는 DefaultTransactionSynchronizationFactory과에 TransactionInterceptor를 추가해야하지만 예외가 throw됩니다하지만 롤백이 실행되지 않습니다 내가 제대로 이해하면 당신이 하나를 사용해야합니다 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는 물건을 할 것입니다.

관련 문제