2012-04-03 19 views
8

rozwijamy aplikację z następujących cech:AMQP, SQL Server i XA

  • samodzielny wiosna 3.1.0.RELEASE aplikacja
  • JPA z hibernacji 3.6.7.Final
  • AMQP (RabbitMQ jako serwer, Wiosna AMQP jako Client)
  • SQL Server 2008 z kierowcą jTDS

Musimy zsynchronizować transakcje między RabbitMQ a nd SQL Server, więc staramy się skonfigurować XA z atomikos. Problem polega na tym, że nie możemy znaleźć pojedynczego pliku konfiguracji próbki sprężyny dla tej sytuacji, która faktycznie działa. Próbowaliśmy wielu kombinacji przy użyciu próbek z dokumentacji Spring, google, forów itp. Coś brakuje.

Czy ktoś mógłby podać nam taki plik, abyśmy mogli go użyć jako szablonu początkowego dla naszej konfiguracji.

P.S. Czy naprawdę potrzebujemy XA?

Dzięki.

+0

Odczyt niektórych dokumentów wydaje się, że rabbitmq nie obsługuje XA. Teraz jestem naprawdę ciekawy, co byłoby "idealne" rozwiązanie ... –

+0

Dla warstwy synchronizacji, czy brałeś pod uwagę [Change Data Capture] (https://en.wikipedia.org/wiki/Change_data_capture)? [Ten wątek] (http://stackoverflow.com/questions/9918519/generating-events-from-sql-server) idzie trochę bardziej szczegółowo w prozie, ale nie obejmuje twojego rozwiązania w głąb ani w kodzie. Jeśli to twoje upodobanie, z przyjemnością odpowiem na to tutaj. :) – MrGomez

Odpowiedz

1

Po wykopaniu przez różnych rozwiązań kandydujących (wykorzystanie Change Data Capture, adaptery do SQL Server Service Broker i możliwe konwersje z MSMQ do RabbitMQ), doszedłem do rozwiązania, które powinny pracować dla Ciebie.

Okazuje się, że można powiązać klientów i umowy serwisowe z SQL Server. Z tego miejsca można użyć tłumaczenia RabbitMQ's AMQP binding for WCF, aby tłumaczyć wiadomości w tę iz powrotem, jako szczegółowo powiązane dokumenty PDF.

Nie jestem pewien, czy wymagany będzie dodatkowy menedżer transakcji, taki jak XA, ale jeśli masz problemy z duplikowaniem transakcji, pętlami i błędami, warto sprawdzić, czy jest to pośrednik połączenia. Jeśli wybierzesz tę trasę, musisz spawać ją ze swoją bramą w taki sam sposób, jaki zdefiniowałeś w opisie problemu. Jeśli wymaga to wyjaśnienia, chętnie pomogę w tym zakresie.

Powodzenia z aplikacją. Brzmi to jak hydra integracyjna z zewnątrz, ale gdy już wszystko zacznie się rozmawiać, powinno działać ładnie.

+0

Nasza aplikacja jest oparta na Javie, więc nie wiem jak (i ​​dlaczego) powinniśmy używać WCF. Na razie budujemy niestandardowy zestaw klas do kontrolowania bazy danych i zatwierdzeń wiadomości. –

+0

@bosnic Pomysł polega na użyciu standardowych funkcji WCF dla SQL Server jako interfejsu do powiązań AMQP RabbitMQ, które pozwolą na połączenie komunikacji pomiędzy RabbitMQ i SQL Server. Jest to [bardzo dobrze udokumentowane] (http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v1.5.1/rabbitmq-dotnet-client-1.5.1-wcf-service-model.pdf), oraz pozwala ci zachować wszystkie aplikacje w Javie po stronie RabbitMQ. Przynajmniej tak to widzę, jeśli dobrze rozumiem twoje cele? – MrGomez

0

Jak wiem, RabbitMQ nie obsługuje transakcji w stylu XA w postaci.

I tak można to zrobić w Javie:

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; 

Prosty przykład wysyłania:

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

..i otrzymują:

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 ... jeśli dobrze rozumiem OP, to właśnie dokumentacja, którą sprawdzili wcześniej i zdeterminowana, nie spełniała ich potrzeb. Problem polega na tym, że nie można łatwo przejść z "SingleConnectionFactory" do połączenia JMS z SQL Server, bez użycia jednego z rozwiązań, które pojawiają się, przynajmniej od pobieżnego odczytu, aby nie były obsługiwane. Zadaje sobie pytanie, czy zespół @ bosnic używa obecnie [sterowników JDBC dla SQL Server] (http://msdn.microsoft.com/en-us/sqlserver/aa937724) i po prostu modernizuje je, aby spełnić ich potrzeby (jak przypuszcza poprzednia korespondencja). – MrGomez