2014-11-12 5 views
0

SI 처리에서 중간에 새 트랜잭션을 시작하기 위해 게이트웨이/서비스 활성화자를 삽입하는 것에 대한 이전 답변에 이어 왔습니다. 코드 아래에서 시도했지만 어떤 이유로 작동하지 않습니다.이 구성에서 오류를 지적 할 수 있으면 바랍니다.트랜잭션 시작을위한 게이트웨이 사용

모든 스레드가 발생하는 것을 기다리고있는 것처럼 보입니다. 그리고 sp 아웃 바운드 게이트웨이는 호출되지 않지만 무엇을 파악할 수 없습니다.

여기에있는 아이디어는 새 트랜잭션의 스레딩 풀에서 스플리터가 생성 한 각 작업을 처리하는 것입니다.

<int:splitter...output-channel="taskChannel"/> 
<int:channel id="taskChannel"> 
     <int:dispatcher task-executor="taskExecutor"/>    
</int:channel>  
<int:gateway id="txGw" service-interface="com.some.test.StartTransactionalGateway" 
    default-request-channel="taskChannel" default-reply-channel="individualTask">        
    </int:gateway>  
<int:service-activator ref="txGw" 
      input-channel="taskChannel" 
      output-channel="individualTask" 
      method="startTx" 
      auto-startup="true"> 
</int:service-activator>    

<int-jdbc:stored-proc-outbound-gateway ...request-channel="individualTask" ..... 

interface StartTransactionalGateway { 
    @Transactional 
    Message<?> startTx(Message<?> m); 

} 

답변

1

게이트웨이가 자신에게 메시지를 보내고 있습니다.

하위 채널의 채널을 주 채널과 함께 사용할 수 없습니다. 당신은

<int:splitter...output-channel="taskChannel"/> 

<int:channel id="taskChannel"> 
    <int:dispatcher task-executor="taskExecutor"/>    
</int:channel>  

<int:service-activator ref="txGw" 
     input-channel="taskChannel" 
     output-channel="whereWeWantTheResultsToGo" 
     method="startTx" 
     reply-timeout="0" 
     auto-startup="true" /> 

<int:gateway id="txGw" service-interface="com.some.test.StartTransactionalGateway" 
    default-request-channel="toStoredProc" />        

<int-jdbc:stored-proc-outbound-gateway ...request-channel="toStoredProd" ..... 

당신은 default-reply-channel 필요가 없습니다 ... 같은 뭔가가 필요; 저장된 proc 게이트웨이에서 reply-channel을 생략하면 응답이 자동으로 되돌아갑니다.

+0

고마워, 게리, 당신이 제안한대로 작동하지만 SP 호출이 반환 할 때 트랜잭션이 커밋되면 이제는 어떻게 든 나머지 처리를 가져와야합니다. – Mark1234

+1

스레드가 게이트웨이로 리턴 할 때 커밋이 발생하므로 tx 범위 내에서 원하는 모든 것이 게이트웨이의 다운 스트림에서 발생해야합니다. 구성 요소 연결 - stored proc'reply-channel'은 다음 구성 요소에 연결합니다. __last__ 구성 요소에서'reply-channel' 또는'output-channel'을 생략하면 tx가 커밋합니다. 또는 단순히''안에 모든 것을 넣고'output-channel '을 넣지 마십시오. –

+0

감사합니다 게리, 전 옵션을 시도, 그것을 작동합니다. 이후 나는 어떤 처리 (아웃 바운드 어댑터에서 끝나는)이 처리의 끝에 무효로 게이트웨이 인터페이스를 변경 그래서 내가 필요로 작동하는 것 같습니다. 나중에 옵션을 시도해 보겠습니다. – Mark1234

1

글쎄, 당신은 단지 @Transactional 주석을 사용하지 않는 것이 transactional를 표시 할 수 있음을 잊지 마십시오. XML 선언에는 <tx:advice>이 있습니다.

<int-jdbc:request-handler-advice-chain> 
    <tx:advice> 
     <tx:attributes> 
      <tx:method name="*"/> 
     </tx:attributes> 
    </tx:advice> 
</int-jdbc:request-handler-advice-chain> 

을 다른 측면에서 코드가 작동하지 않을 수 있습니다 : 당신은 TX 단지 해당 <int-jdbc:stored-proc-outbound-gateway>에 포장해야하는 경우

은 어떤 Advice에 기본 구성 요소의 handleRequestMessage을 감싸는 <request-handler-advice> 하위 요소를가 <int-jdbc:stored-proc-outbound-gateway>이 결과를 반환하지 않을 수 있습니다. 절차는 one-way입니다. 그러나 <gateway> 인터페이스는 request-reply입니다.

UPDATE

여기 Keep transaction within Spring Integration flow 내 대답을 참조하십시오. 다운 스트림 흐름을 트랜잭션으로 만드는 또 다른 트릭입니다.

<gateway>을 사용하면 트랜잭션 하위 흐름이 replyChannel으로 끝나야합니다. 또는 ... 단방향 동작을 수행하려면 게이트웨이 방법을 void으로 설정하십시오.

+0

좋은 지적; 동일한 트랜잭션에서 여러 개의 엔드 포인트를 호출하려는 경우 실제로는 tx 게이트웨이 만 필요합니다. –

+0

감사합니다. 하지만 나는 후속 처리가 진행 중입니다. SP 호출은 작업에 대한 더 많은 데이터를 얻고 처리를 시작하고 마지막으로 JMS 메시지를 보내는 첫 번째 단계 일뿐입니다. 그 후 나는 다른 db 호출을하고 결국 모든 트랜잭션이 잘 롤백 된 것을 알리는 트랜잭션을 커밋합니다. – Mark1234

+0

내 대답 업데이트 됨 –

관련 문제