2011-09-09 5 views
6

이 사용 사례가 있습니다.스프링 통합 : 2 명의 액티베이터간에 트랜잭션이 어려움

첫 번째 체인 : 모든 위대한 노력

@Override 
@Transactional(propagation = Propagation.REQUIRES_NEW) 
public EventMessage<ModificaOperativitaRapporto> activate(EventMessage<InserimentoCanale> eventMessage) { 
    ... 
    // some Database changes 
    dao.save(myObject); 
} 

:

<int:chain input-channel="inserimentoCanaleActivate" output-channel="inserimentoCanalePreRouting">  
    <int:service-activator ref="inserimentoCanaleActivator" method="activate" />     
</int:chain> 

이 상대적 코드입니다. 스플리터 I로되도록

@Override 
public EventMessage<CensimentoCliente> activate(EventMessage<CensimentoCliente> eventMessage) { 
    ... 
    // some Database changes 
    dao.save(myObject); 
} 

후술하는 바와 같이 CensimentoCliente 페이로드는 제 체인의 페이로드의 List 있습니다

<int:chain id="onlineCensimentoClienteChain" input-channel="ONLINE_CENSIMENTO_CLIENTE" output-channel="inserimentoCanaleActivate"> 
    <int:service-activator ref="onlineCensimentoClienteActivator" method="activate" /> 
    <int:splitter expression="payload.getPayload().getCanali()" /> 
</int:chain> 

상대 활성제 : 다음

I 다른 체인을 목록에서 분리하고 첫 번째 체인의 코드를 다시 사용하십시오.

public interface CensimentoCliente extends Serializable { 

    Collection<? extends InserimentoCanale> getCanali(); 

    void setCanali(Collection<? extends InserimentoCanale> canali); 
    ... 
} 

그러나

모든 활성 나는 트랜잭션이 분리되어 사용 사례를 (첫 번째는 두 번째 없이는 살 수 있기 때문에) 자신의 트랜잭션 정의를 얻을 수 있기 때문이다.

목표는 두 트랜잭션 체인의 db 수정을 수행하는 것입니다.

어떤 도움이 필요합니까?

종류는 마시모

+0

혹시 해결책을 찾았나요 관한 조금 명확히하기 위해? – dMcNavish

+0

아니요 ........... –

답변

0

에게 안부 이러한 수정이 별도의 관계형 데이터베이스가 있습니까? 그렇다면 XA 트랜잭션을 검토 중입니다. 이제 tomcat과 같은 XA가 아닌 컨테이너에서이 작업을 실행하는 경우 트랜잭션 관리자가 감시하는 단일 스레드에서이 작업을 수행해야합니다. (실제로 이러한 이벤트를 트리거하는 트랜잭션 관리자를 피기 백해야합니다. 트랜잭션 관리자는 일부 데이터 소스에 대한 JMS 메시지 또는 폴러가 될 수 있습니다. 또한 스프링이 단일 트랜잭션에서 전체 프로세스를 실행하는 데 도움이되도록이 처리를 단일 스레드에서 수행해야합니다.

마지막으로, 서비스 활성기간에 스레드 풀/큐를 삽입하지 마십시오. 이것은 활성제는 별도의 스레드

에서 실행 될 수 있습니다 TransactionTemplate의 콜백 실행에 메시지 발송을 래핑하는 사용자 지정 채널을 생성하여이 작업을 수행 할 수 있습니다 (또는 다른 사용자 정의 구성 요소를, 그러나 이것은 가장 간단한 방법입니다)
3

:

t 귀하의 예를 들어

<bean id="transactionalChannel" class="com.stackoverflow.TransactionalChannel"> 
     <constructor-arg> 
      <bean class="org.springframework.transaction.support.TransactionTemplate"> 
       <property name="transactionManager" ref="transactionManager"/> 
       <property name="propagationBehavior" value="#{T(org.springframework.transaction.TransactionDefinition).PROPAGATION_REQUIRES_NEW}"/> 
      </bean> 
     </constructor-arg> 
    </bean> 

, 당신은 아마도 전달하는 브리지를 사용할 수 있습니다 : 당신의 XML에서

public class TransactionalChannel extends AbstractSubscribableChannel { 

    private final MessageDispatcher dispatcher = new UnicastingDispatcher(); 
    private final TransactionTemplate transactionTemplate; 

    TransactionalChannel(TransactionTemplate transactionTemplate) { 
     this.transactionTemplate = transactionTemplate; 
    } 

    @Override 
    protected boolean doSend(final Message<?> message, long timeout) { 
     return transactionTemplate.execute(new TransactionCallback<Boolean>() { 
      @Override 
      public Boolean doInTransaction(TransactionStatus status) { 
       return getDispatcher().dispatch(message); 
      } 
     }); 
    } 

    @Override 
    protected MessageDispatcher getDispatcher() { 
     return dispatcher; 
    } 

} 

, 당신은 당신의 채널 및 트랜잭션 템플릿을 정의하고 그냥 다른 모든 채널로 사용자 정의 채널을 참조 할 수 있습니다 새로운 채널을 통해 그가 메시지 :

<int:bridge input-channel="inserimentoCanaleActivate" output-channel="transactionalChannel" /> 
<int:chain input-channel="transactionalChannel" output-channel="inserimentoCanalePreRouting">  
    <int:service-activator ref="inserimentoCanaleActivator" method="activate" />     
</int:chain> 
2

당신이 서비스 방법에 <service-activator>@Transactional이이 트랜잭션은 해당 메소드 호출에 묶여됩니다. 전체 메시지 흐름 (또는 그 일부)에 대한 원동력을 원할 경우 TX 어프 리케이션을 이전에 선언해야합니다. 채널이 직접적인 경우 모든 서비스 호출이 동일한 트랜잭션으로 래핑됩니다. 가장 간단한 방법으로 귀하의 희망을 이루기 위해 인터페이스를 @Transactional으로 작성하고 메시지 흐름의 시작 부분부터 호출하십시오.

트랜잭션 Understanding Transactions in Message flows

+0

몇 가지 코드 예제를 게시하거나 링크 할 수 있습니까? 나는 같은 문제를 겪고있다. 감사! –

+0

SI에있는 TX에 대한 링크를 내 대답에 추가했습니다. –

+0

이 문서를 읽었지만 여전히 의문 사항이 있습니다. 내 사례를 http://stackoverflow.com/questions/18901510/keep-transaction-within-spring-integration-flow에 게시합니다. –