2011-09-09 13 views
6

मैं इस का उपयोग मामला है के बीच लेन-देन के साथ कठिनाई।वसंत एकीकरण: 2 activators

प्रथम श्रृंखला:

@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> 

यह सापेक्ष कोड है।

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

और रिश्तेदार उत्प्रेरक:

तो मैं एक और श्रृंखला है

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

CensimentoCliente पेलोड के रूप में नीचे वर्णित पहले श्रृंखला के पेलोड के एक List है, एक विभाजक मैं के साथ ऐसा सूची में विभाजित करें और पहली श्रृंखला के कोड का पुन: उपयोग करें।

public interface CensimentoCliente extends Serializable { 

    Collection<? extends InserimentoCanale> getCanali(); 

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

लेकिन हर एक्टिवेटर (के बाद से पहले एक दूसरे के बिना रह सकते हैं) अपने लेन-देन परिभाषा हो जाता है के बाद से मैं एक प्रयोग मामले में जहां लेनदेन अलग होती है।

लक्ष्य एक ही लेन-देन का हिस्सा रहा दो श्रृंखलाओं के डाटाबेस को संशोधित करने के लिए है।

कोई मदद?

तरह का संबंध मास्सिमो

+0

क्या तुमने कभी एक समाधान मिला के बारे में थोड़ा स्पष्ट करने के लिए? – dMcNavish

+0

नहीं ........... –

उत्तर

0

इन संशोधित 2 अलग रिलेशनल डेटाबेस हैं? यदि ऐसा है तो आप एक एक्सए लेनदेन देख रहे हैं। अब अगर आप बिल्ला की तरह एक गैर XA कंटेनर पर इस चल रहे हैं, यह सब किसी एकल थ्रेड कि एक सौदे प्रबंधक द्वारा देखा गया से किया जाना चाहिए - (आप लेन-देन प्रबंधक है कि वास्तव में इन घटनाओं से चलाता है पर सूअर का बच्चा वापस करना होगा)। लेनदेन प्रबंधक कुछ डेटा स्रोत के खिलाफ एक जेएमएस संदेश या एक परामर्शदाता हो सकता है। इसके अलावा यह प्रसंस्करण एक थ्रेड में किया जाना चाहिए ताकि वसंत आपको एक ही लेनदेन में पूरी प्रक्रिया को चलाने में मदद कर सके।

एक अंतिम टिप्पणी के रूप में, सेवा activators के बीच threadpools/कतारों परिचय नहीं है। इस उत्प्रेरक अलग धागे

में चलाने के लिए पैदा कर सकता है
3

आपने कस्टम चैनल बनाकर ऐसा कर सकते हैं (या अन्य कस्टम घटक है, लेकिन इस सबसे आसान तरीका है) कि एक TransactionTemplate कॉलबैक निष्पादन में संदेश प्रेषण लपेटता:

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

} 

अपने XML में, आप अपने चैनल और लेन-देन टेम्पलेट को परिभाषित करने और अपने कस्टम चैनल संदर्भ बस के रूप में आप किसी भी अन्य चैनल कर सकते हैं:

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

अपने उदाहरण के लिए, आप शायद पारित करने के लिए एक पुल का इस्तेमाल कर सकते हैं टी वह नए चैनल के माध्यम से संदेश:

<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

मैंने अपने उत्तर में एसआई –

+0

में TX के बारे में एक लिंक जोड़ा है मैंने पहले इस दस्तावेज़ को पढ़ा है और अभी भी संदेह हैं। मैंने अपना केस http://stackoverflow.com/questions/18901510/keep-transaction-within-spring-Integration-flow में पोस्ट किया है –

संबंधित मुद्दे