8

我们正在开发具有以下特点的应用程序:

  • 独立的 spring 3.1.0.RELEASE 应用程序
  • JPA with Hibernate 3.6.7.Final
  • AMQP(RabbitMQ 作为服务器,Spring AMQP 作为客户端)
  • 带有 jTDS 驱动程序的 SQL Server 2008

我们需要在 RabbitMQ 和 SQL Server 之间同步事务,因此我们正在尝试使用 atomikos 设置 XA。问题是我们无法为这种情况找到一个实际有效的 spring 示例配置文件。我们使用来自 Spring 文档、谷歌、论坛等的示例尝试了很多组合。总是缺少一些东西。

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

PS 我们真的需要 XA 吗?

谢谢。

4

2 回答 2

1

在深入研究了各种候选解决方案(使用Change Data CaptureSQL Server Service Broker的适配器以及从MSMQ到 RabbitMQ的可能转换)之后,我找到了一个适合您的解决方案。

事实证明,您可以将WCF客户端和服务合同绑定到 SQL Server。从这里,您可以使用RabbitMQ 的 WCF 的 AMQP 绑定来来回翻译消息,就像前面链接的 PDF 文档一样详细。

我不清楚这里是否需要像 XA 这样的额外事务管理器,但如果您遇到事务重复、循环和错误消息的问题,那么值得作为连接的中介进行调查。如果您走那条路线,则需要以与问题陈述中定义的相同方式将其焊接到网关中。如果这需要澄清,我很乐意在这里扩展。

祝你的申请好运。从外部看,这听起来像是一个集成的 hydra,但是一旦你把所有东西都放在一起,它应该可以很好地工作。

于 2012-04-14T22:07:04.610 回答
0

据我所知,RabbitMQ支持 XA 样式的事务。

是的,你可以用 Java 做到这一点:

测试配置.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);
    }
}
于 2012-04-15T18:05:14.603 回答