2012-04-03 5 views
8

wir eine Anwendung mit folgenden Eigenschaften entwickeln:AMQP, SQL Server und XA

  • eigenständige Feder 3.1.0.RELEASE Anwendung
  • JPA mit Hibernate 3.6.7.Final
  • AMQP (RabbitMQ als Server, Frühling AMQP als Client)
  • SQL Server 2008 mit jTDS Treiber

Wir brauchen Transaktionen zwischen RabbitMQ eines synchronisieren nd SQL Server, also versuchen wir, XA mit Atomikos einzurichten. Das Problem ist, dass wir keine einzige Spring-Beispielkonfigurationsdatei für diese Situation finden können, die tatsächlich funktioniert. Wir haben so viele Kombinationen mit Samples aus Spring-Dokumentation, Google, Foren usw. ausprobiert. Irgendwas fehlt immer.

Könnte uns bitte jemand eine solche Datei zur Verfügung stellen, damit wir sie als Vorlage für unsere Konfiguration verwenden können.

P.S. Brauchen wir wirklich XA?

Danke.

+0

Einige Dokumente lesen, es scheint, dass Rabbitmq XA nicht unterstützt. Jetzt bin ich wirklich neugierig darauf, was eine "perfekte" Lösung wäre ... –

+0

Haben Sie für die Synchronisationsschicht [Change Data Capture] (https://en.wikipedia.org/wiki/Change_data_capture) in Betracht gezogen? [This thread] (http://stackoverflow.com/questions/9918519/generating-events-from-sql-server) geht etwas ausführlicher in die Prosa ein, aber es deckt Ihre Lösung weder in der Tiefe noch im Code ab. Wenn Sie Lust haben, werde ich Ihnen hier gerne antworten. :) – MrGomez

Antwort

1

Nach dem Durchsuchen der verschiedenen Kandidaten-Lösungen (Verwendung von Change Data Capture, Adapter für SQL Server Service Broker und mögliche Konvertierungen von MSMQ zu RabbitMQ), kam ich zu einer Lösung, die für Sie arbeiten sollte.

Es stellt sich heraus, dass Sie WCF Clients und Serviceverträge an SQL Server binden können. Von hier aus können Sie RabbitMQ's AMQP binding for WCF verwenden, um Nachrichten wie die oben verlinkten PDF-Dokumente sehr detailliert zu übersetzen.

Ich bin unklar, ob ein zusätzlicher Transaktionsmanager wie XA hier erforderlich sein wird, aber wenn Sie Probleme mit Transaktionsduplizierung, Schleifen und Mismessen haben, lohnt es sich, als Vermittler für die Verbindung zu untersuchen. Wenn Sie diese Route verwenden, müssen Sie diese auf dieselbe Weise in Ihr Gateway einbinden, wie Sie es in der Problembeschreibung definiert haben. Wenn dies geklärt werden muss, würde ich mich hierauf freuen.

Viel Glück mit Ihrer Anwendung. Es klingt wie eine Integration Hydra von außen, aber sobald Sie alles miteinander reden, sollte es gut funktionieren.

+0

Unsere Anwendung ist Java-basiert, also weiß ich nicht wie (und warum) sollten wir WCF verwenden. Derzeit erstellen wir eine benutzerdefinierte Gruppe von Klassen zur Steuerung von Datenbank- und Nachrichten-Commits. –

+0

@bosnic Die Idee hier ist die Verwendung der WCF-Standardfunktionen für SQL Server als Schnittstelle zu RabbitMQs AMQP-Bindungen, mit denen Sie die Kommunikation zwischen RabbitMQ und SQL Server überbrücken können. Dies ist [sehr gut dokumentiert] (http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v1.5.1/rabbitmq-dotnet-client-1.5.1-wcf-service-model.pdf), und Es ermöglicht Ihnen, die gesamte Anwendungsprogrammierung in Java auf der RabbitMQ-Seite zu behalten. Zumindest sehe ich das so, wenn ich deine Ziele richtig verstehe? – MrGomez

0

Wie ich weiß RabbitMQ nicht Unterstützung XA Stil Transaktionen.

Und ja Sie es in Java tun können:

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; 

Einfaches Beispiel von Sende:

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

..und erhalten:

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

Ähm ... wenn ich das OP richtig verstehe, ist das genau die Dokumentation, die sie vorher angesehen haben und bestimmt nicht ihre Bedürfnisse erfüllt haben. Das Problem besteht darin, dass Sie nicht einfach von "SingleConnectionFactory" zu einer JMS-Verbindung zu SQL Server wechseln können, ohne dass eine der Lösungen, die zumindest aus einem flüchtigen Lesevorgang angezeigt wird, nicht unterstützt wird. Es stellt sich die Frage, ob das Team von @bosnic derzeit die [JDBC-Treiber für SQL Server] (http://msdn.microsoft.com/en-us/sqlserver/aa937724) verwendet und diese einfach nach ihren Bedürfnissen nachrüsten (wie von vorherige Korrespondenz). – MrGomez