2012-04-03 13 views
8

हम निम्नलिखित विशेषताओं के साथ एक आवेदन विकसित कर रहे हैं:AMQP, एसक्यूएल सर्वर और XA

  • स्टैंडअलोन वसंत 3.1.0.RELEASE आवेदन
  • हाइबरनेट 3.6.7.Final
  • AMQP साथ जेपीए (RabbitMQ के रूप में jTDS ड्राइवर के साथ सर्वर, स्प्रिंग AMQP ग्राहक के रूप में)
  • एसक्यूएल सर्वर 2008

हम RabbitMQ एक बीच लेन-देन सिंक्रनाइज़ करने की आवश्यकता एनडी एसक्यूएल सर्वर, तो हम atomikos के साथ एक्सए सेट करने की कोशिश कर रहे हैं। समस्या यह है कि हम उस स्थिति के लिए एक वसंत नमूना विन्यास फाइल नहीं ढूंढ सकते जो वास्तव में काम करता है। हमने स्प्रिंग प्रलेखन, गूगल, फ़ोरम इत्यादि के नमूनों का उपयोग करके इतने सारे संयोजनों की कोशिश की। कुछ भी गायब है।

कोई भी, कृपया हमें ऐसी फ़ाइल प्रदान कर सकता है ताकि हम इसे हमारे कॉन्फ़िगरेशन के लिए प्रारंभिक टेम्पलेट के रूप में उपयोग कर सकें।

पीएस क्या हमें वास्तव में एक्सए की आवश्यकता है?

धन्यवाद।

+0

कुछ दस्तावेज़ों को पढ़ना ऐसा लगता है कि खरगोश एक्सए का समर्थन नहीं करता है। अब मैं वास्तव में उत्सुक हूं कि 'सही' समाधान क्या होगा ... –

+0

सिंक्रनाइज़ेशन परत के लिए, क्या आपने [डेटा कैप्चर बदलें] (https://en.wikipedia.org/wiki/Change_data_capture) माना है? [यह धागा] (http://stackoverflow.com/questions/9918519/generating-events-from-sql-server) गद्य में थोड़ी अधिक जानकारी में जाता है, लेकिन यह आपके समाधान को गहराई से या कोड में शामिल नहीं करता है। यदि यह आपकी कल्पना है, तो मुझे इसका जवाब देने में खुशी होगी। :) – MrGomez

उत्तर

1

विभिन्न उम्मीदवार समाधान के माध्यम से खुदाई (संभव रूपांतरण MSMQ से RabbitMQ को Change Data Capture के उपयोग, SQL Server Service Broker के लिए एडेप्टर, और) के बाद, मैं एक समाधान है कि आप के लिए काम करना चाहिए के लिए आया था।

यह पता चला है कि आप WCF क्लाइंट और सेवा अनुबंध SQL सर्वर पर बाध्य कर सकते हैं। यहां से, आप RabbitMQ's AMQP binding for WCF का उपयोग संदेशों को आगे और आगे अनुवाद करने के लिए कर सकते हैं, जैसा कि उपरोक्त लिंक किए गए पीडीएफ दस्तावेज़ों में बहुत विस्तार से है।

मुझे पता नहीं है कि एक्सए जैसे अतिरिक्त लेनदेन प्रबंधक की आवश्यकता होगी, लेकिन यदि आपको लेनदेन नकल, लूप और मिस्सेसिंग के साथ समस्याएं आती हैं, तो कनेक्शन के लिए मध्यस्थ के रूप में जांच करना उचित है। यदि आप उस मार्ग पर जाते हैं, तो आपको उस समस्या के विवरण में परिभाषित करने के तरीके में अपने गेटवे में वेल्ड करना होगा। अगर इसे स्पष्टीकरण की आवश्यकता है, तो मुझे यहां विस्तार करने में खुशी होगी।

आपके आवेदन के साथ शुभकामनाएँ। यह बाहर से एकीकरण हाइड्रा की तरह लगता है, लेकिन एक बार जब आप सब कुछ एक साथ बात कर लेते हैं, तो इसे अच्छी तरह से काम करना चाहिए।

+0

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

+0

@bosnic यहां विचार है कि SQL सर्वर के लिए मानक WCF सुविधाओं का उपयोग RabbitMQ के AMQP बाइंडिंग में एक इंटरफेस के रूप में करना है, जो आपको RabbitMQ और SQL सर्वर के बीच संचार को पुल करने की अनुमति देगा। यह [बहुत अच्छी तरह से प्रलेखित] है (http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v1.5.1/rabbitmq-dotnet-client-1.5.1-wcf-service-model.pdf), और यह आपको चीजों के RabbitMQ पक्ष पर जावा में सभी एप्लिकेशन प्रोग्रामिंग रखने की अनुमति देता है। कम से कम, मैं इसे कैसे देखता हूं, अगर मैं आपके लक्ष्यों को सही ढंग से समझता हूं? – MrGomez

0

जैसा कि मुझे पता है कि RabbitMQ समर्थन XA शैली लेनदेन नहीं है।

और हां आप जावा में कर सकते हैं:

TestConfiguration.java

import org.springframework.amqp.core.Queue; 
import org.springframework.amqp.rabbit.config.AbstractRabbitConfiguration; 
import org.springframework.amqp.rabbit.connection.ConnectionFactory; 
import org.springframework.amqp.rabbit.connection.SingleConnectionFactory; 
import org.springframework.amqp.rabbit.core.RabbitTemplate; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class TestConfiguration extends AbstractRabbitConfiguration { 

    private String routingKey = "test.queue"; 
    private String testQueueName = "test.queue"; 

    public ConnectionFactory getConnectionFactory() { 
     SingleConnectionFactory connectionFactory = new SingleConnectionFactory("localhost"); 
     connectionFactory.setUsername("guest"); 
     connectionFactory.setPassword("guest"); 
     return connectionFactory; 
    } 

    @Override 
    public RabbitTemplate rabbitTemplate() { 
     RabbitTemplate rabbitTemplate = new RabbitTemplate(getConnectionFactory()); 
     rabbitTemplate.setRoutingKey(routingKey); 
     rabbitTemplate.setQueue(testQueueName); 
     return rabbitTemplate; 

भेजने का सरल उदाहरण:

import org.springframework.amqp.core.AmqpTemplate; 
import org.springframework.beans.factory.annotation.Autowired; 

public class MessageSender { 

    @Autowired 
    private AmqpTemplate template; 

    public void send(String text) { 
     template.convertAndSend(text); 
    } 
} 

..और प्राप्त करते हैं:

import org.springframework.amqp.core.Message; 
import org.springframework.amqp.core.MessageListener; 
public class MessageHandler implements MessageListener { 
    @Override 
    public void onMessage(Message message) { 
     System.out.println("Received message: " + message); 
    } 
} 
+0

उम ... अगर मैं ओपी को सही ढंग से समझता हूं, तो यह वही दस्तावेज है जिसे उन्होंने पहले देखा था और निर्धारित उनकी आवश्यकताओं को पूरा नहीं किया था। परेशानी यह है कि आप आसानी से 'सिंगलकनेक्शन फैक्ट्री' से एसक्यूएल सर्वर से जेएमएस कनेक्शन तक नहीं जा सकते हैं, कम से कम एक कर्सर पढ़ने से असमर्थित समाधानों में से एक का उपयोग किए बिना असमर्थित होने के लिए। यह पूछताछ करता है कि क्या @ बोस्निक की टीम वर्तमान में [SQL सर्वर के लिए जेडीबीसी ड्राइवर] का उपयोग कर रही है (http://msdn.microsoft.com/en-us/sqlserver/aa937724) और बस उनकी ज़रूरतों को पूरा करने के लिए उन्हें पुनः लोड कर रहे हैं (जैसा कि द्वारा अनुमानित पिछला पत्राचार)। – MrGomez

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