2012-06-28 15 views
5

मेरे पास एक स्प्रिंग एप्लिकेशन है जो हाइबरनेट और पोस्टग्रेएसक्यूएल का उपयोग करता है। यह वसंत AMQP (RabbitMQ) का भी उपयोग करता है।वसंत AMQP/RabbitMQ और हाइबरनेट लेनदेन प्रबंधक

मैं हाइबरनेट लेन-देन प्रबंधक के रूप में विन्यस्त उपयोग कर रहा हूँ इस प्रकार है:

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
    p:sessionFactory-ref="sessionFactory" p:dataSource-ref="dataSource" /> 

मैं अतुल्यकालिक संदेश के स्वागत के लिए SimpleMessageListenerContainer उपयोग कर रहा हूँ के रूप में विन्यस्त:

@Resource(name="transactionManager") 
private PlatformTransactionManager txManager; 

@Autowired 
private MyListener messageListener; 

@Bean 
public SimpleMessageListenerContainer mySMLC() 
{ 
    final SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
    container.setConnectionFactory(rabbitConnectionFactory); 
    container.setQueueNames("myQueue"); 

    final MessageListenerAdapter adapter = new MessageListenerAdapter(messageListener); 
    adapter.setMessageConverter(converter); 
    container.setMessageListener(adapter); 
    container.setChannelTransacted(true); 
    container.setTransactionManager(txManager); 
    return container; 
} 

तो मूल रूप से मुझे लगता है कि स्वागत निर्दिष्ट किया है संदेशों के लेनदेन होना चाहिए। संदेश श्रोता एक ऐसी सेवा को कॉल करता है जिसमें @ ट्रान्सएक्शनल के साथ एनोटेटेड विधियां हो सकती हैं और संभवतः डीबी पर सीआरयूडी संचालन कर सकती हैं।

मेरा सवाल है, क्या SimpleMessageListenerContainer स्तर पर लेनदेन को प्रबंधित करने के लिए HibernateTransactionManager का उपयोग करने में कोई समस्या है? क्या RabbitMQ से संदेशों को प्राप्त करने के लिए डीबी लेनदेन प्रबंधक का उपयोग करने में कोई समस्या होगी?

मुझे यहां एक्सए की उम्मीद नहीं है। मैं बस यह सुनिश्चित करना चाहता हूं कि यदि सेवा द्वारा डीबी पर कोई भी संचालन विफल रहता है, तो संदेश खरगोश एमक्यू ब्रोकर को नहीं मिलता है।

उत्तर

1

स्प्रिंग स्रोतों के मुताबिक, संदेश लिस्टनर कोंटेनर के लेनदेन का मुख्य उद्देश्य प्रबंधक संपत्ति श्रोता कॉल से पहले प्राप्त संदेश पर लेनदेन शुरू करना है, और श्रोता वापसी के बाद प्रतिबद्ध या रोलबैक लेनदेन करना या अपवाद फेंकना है। इसलिए श्रोता पद्धतियों को बनाने की कोई ज़रूरत नहीं है @ लेनदेन के रूप में लेनदेन विधि से पहले ही लेनदेन शुरू हो जाएगा।

श्रोता में त्रुटि के मामले में, अपवाद फेंक दिया जाएगा, डीबी लेनदेन रोलबैक होगा, और संदेश ब्रोकर (जेएमएस लेनदेन रोलबैक) को कोई एक भेजा नहीं जाएगा। लेकिन एक्सए के बिना डुप्लिकेट संदेश हो सकते हैं। उदाहरण के लिए डीबी लेनदेन सफलतापूर्वक काम करता है, संदेश ब्रोकर रीसेट से कनेक्शन, और ब्रैक ब्रोकर को नहीं भेजा जा सका। पुन: कनेक्ट करने के बाद ब्रोकर डुप्लिकेट संदेश दे सकता है। यदि आप इसे स्वीकार करते हैं, तो एक्सए से निपटने की कोई आवश्यकता नहीं है।

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