2012-04-03 4 views
8

мы разрабатываем приложение со следующими характеристиками:AMQP, SQL Server и XA

  • автономный весна 3.1.0.RELEASE приложение
  • JPA с Hibernate 3.6.7.Final
  • AMQP (RabbitMQ, как Сервер, Spring AMQP в качестве клиента)
  • SQL Server 2008 с драйвером jTDS

Нам необходимо синхронизировать операции между RabbitMQ а SQL Server, поэтому мы пытаемся настроить XA с atomikos. Проблема в том, что мы не можем найти один файл конфигурации образца пружины для этой ситуации, которая действительно работает. Мы пробовали так много комбинаций, используя образцы из документации Spring, google, форумов и т. Д. Что-то вообще отсутствует.

Не могли бы предоставить нам такой файл, чтобы мы могли использовать его в качестве исходного шаблона для нашей конфигурации.

P.S. Нам действительно нужен XA?

Спасибо.

+0

Чтение некоторых документов кажется, что rabbitmq не поддерживает XA. Теперь мне действительно интересно узнать, что будет «идеальным» решением ... –

+0

Для уровня синхронизации вы рассмотрели [Change Data Capture] (https://en.wikipedia.org/wiki/Change_data_capture)? [Эта тема] (http://stackoverflow.com/questions/9918519/generation-events-from-sql-server) в деталях прозаика немного подробнее, но она не охватывает ваше решение в глубину или в коде. Если это ваша фантазия, я буду рад ответить на это здесь. :) – MrGomez

ответ

1

После копаться различных вариантов решения (использование Change Data Capture, адаптеры для SQL Server Service Broker и возможные переходы от MSMQ к RabbitMQ), я пришел к решению, которое должно работать для вас.

Оказалось, что вы можете связывать клиентов и контракты на обслуживание с SQL-сервером с WCF. Отсюда вы можете использовать RabbitMQ's AMQP binding for WCF, чтобы переводить сообщения взад и вперед, как в PDF-документах.

Непонятно, нужен ли здесь дополнительный диспетчер транзакций, такой как XA, но если у вас возникли проблемы с дублированием транзакций, циклами и ошибками, стоит изучить как посредник для подключения. Если вы идете по этому маршруту, вам нужно сварить это в своем шлюзе так же, как вы определили в заявлении проблемы. Если это потребует разъяснений, я был бы рад расширить это здесь.

Удачи вам в применении. Это звучит как интегральная гидра снаружи, но как только вы получите все разговоры вместе, она должна работать хорошо.

+0

Наше приложение основано на Java, поэтому я не знаю, как (и почему) использовать WCF. На данный момент мы создаем пользовательский набор классов для управления базами данных и сообщениями. –

+0

@bosnic Идея здесь состоит в том, чтобы использовать стандартные средства WCF для SQL Server в качестве интерфейса для привязок AMQP RabbitMQ, что позволит вам связывать связь между RabbitMQ и SQL Server. Это [очень хорошо документировано] (http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v1.5.1/rabbitmq-dotnet-client-1.5.1-wcf-service-model.pdf) и это позволяет вам сохранять все прикладные программы в Java на стороне RabbitMQ. По крайней мере, так я вижу это, если правильно понимаю ваши цели? – MrGomez

0

Как я знаю RabbitMQ не поддержка XA стиль сделка.

И да, вы можете сделать это в Java:

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

Ум ... если я правильно понимаю ОП, то именно документация, которую они смотрели ранее и решительно, не соответствовала их потребностям. Проблема в том, что вы не можете легко перейти от «SingleConnectionFactory» к JMS-подключению к SQL Server, не используя одно из решений, которое появляется, по крайней мере, из беглого чтения, чтобы быть неподдерживаемым. Он ставит под сомнение, если команда @ bosnic в настоящее время использует [JDBC-драйверы для SQL Server] (http://msdn.microsoft.com/en-us/sqlserver/aa937724) и просто обновляет их для удовлетворения своих потребностей (как предполагалось предыдущий соответствует). – MrGomez