2012-04-03 53 views
8

我们正在开发具有以下特点的应用程序:AMQP,SQL Server和XA

  • 独立弹簧3.1.0.RELEASE应用
  • JPA与Hibernate 3.6.7.Final
  • AMQP(RabbitMQ的作为服务器,春AMQP作为客户端)
  • 的SQL Server 2008 JTDS司机

我们需要同步的RabbitMQ之间的交易nd SQL Server,所以我们试图用atomikos来设置XA。问题是,我们无法找到适用于实际工作情况的单个spring样本配置文件。我们尝试了很多使用Spring文档,谷歌,论坛等的样本的组合。

是否有人可以为我们提供这样的文件,以便我们可以将其用作我们配置的起始模板。

P.S. 我们真的需要XA吗?

谢谢。

+0

阅读一些文档,似乎rabbitmq不支持XA。现在我真的很好奇什么是'完美'解决方案...... – 2012-04-12 00:41:56

+0

对于同步层,你考虑过[Change Data Capture](https://en.wikipedia.org/wiki/Change_data_capture)吗? [This thread](http://stackoverflow.com/questions/9918519/generating-events-from-sql-server)在散文中进行了一些更详细的介绍,但它并未深入或在代码中涵盖您的解决方案。如果这是你的想象,我很乐意在这里回答这个问题。 :) – MrGomez 2012-04-13 23:49:14

回答

1

在挖掘了各种候选解决方案(使用Change Data Capture,适配器为SQL Server Service Broker,并且可能从MSMQ转换到RabbitMQ)后,我找到了一个适合您的解决方案。

事实证明,您可以将WCF客户端和服务合约绑定到SQL Server。从这里,您可以使用RabbitMQ's AMQP binding for WCF来回翻译消息,如上述PDF文档的详细介绍。

我不清楚是否需要像XA这样的额外事务管理器,但是如果您遇到事务重复,循环和误判的问题,那么作为连接的中介是值得研究的。如果你走这条路线,你需要按照你在问题陈述中定义的方式将它焊接到你的网关上。如果需要澄清,我很乐意在这里进一步介绍。

祝您的应用程序好运。这听起来像是从外面看到的一体化水龙头,但是一旦你把所有的东西都联系起来了,它应该很好地工作。

+0

我们的应用程序是基于Java的,所以我不知道我们应该如何(以及为什么)使用WCF。 现在,我们正在构建一组用于控制数据库和消息提交的自定义类。 – 2012-04-15 01:25:54

+0

@bosnic这里的想法是使用SQL Server的标准WCF工具作为RabbitMQ的AMQP绑定的接口,这将允许您桥接RabbitMQ和SQL Server之间的通信。这是[很好的文档](http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v1.5.1/rabbitmq-dotnet-client-1.5.1-wcf-service-model.pdf),和它允许你在RabbitMQ方面保留Java中的所有应用程序编程。至少,这是我如何看待它,如果我正确理解你的目标? – MrGomez 2012-04-15 01:35:12

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

嗯......如果我正确理解了OP,这正是他们以前看过的文档,并且确定不符合他们的需求。麻烦的是,你不能轻易地从'SingleConnectionFactory'到一个到SQL Server的JMS连接,而不使用出现的解决方案之一,至少从粗略的读取来看,它是不受支持的。它怀疑bosnic团队目前是否正在使用[SQL Server的JDBC驱动程序](http://msdn.microsoft.com/zh-cn/sqlserver/aa937724),并且只是对其进行改进以满足其需求(如先前的对应)。 – MrGomez 2012-04-15 21:27:20