【问题标题】:AMQP, SQL Server and XAAMQP、SQL Server 和 XA
【发布时间】:2012-04-03 01:25:07
【问题描述】:

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

  • 独立 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 文档、谷歌、论坛等的示例尝试了很多组合。总是缺少一些东西。

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

附: 我们真的需要 XA 吗?

谢谢。

【问题讨论】:

  • 阅读一些文档似乎 rabbitmq 不支持 XA。现在我真的很好奇什么是“完美”的解决方案......
  • 同步层,有没有考虑Change Data CaptureThis thread 在散文中更详细地介绍了一些细节,但并未深入或在代码中涵盖您的解决方案。如果这是你喜欢的,我很乐意在这里回答这个问题。 :)

标签: amqp xa


【解决方案1】:

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

事实证明,您可以将WCF 客户端和服务合同绑定到 SQL Server。从这里,您可以使用RabbitMQ's AMQP binding for WCF 来回翻译消息,因为前面链接的PDF 文档非常详细。

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

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

【讨论】:

  • 我们的应用程序是基于 Java 的,所以我不知道我们应该如何(以及为什么)使用 WCF。目前,我们正在构建一组用于控制数据库和消息提交的自定义类。
  • @bosnic 这里的想法是使用 SQL Server 的标准 WCF 工具作为 RabbitMQ 的 AMQP 绑定的接口,这将允许您在 RabbitMQ 和 SQL Server 之间架起通信的桥梁。这是very well documented,它允许您在RabbitMQ 方面保留所有Java 应用程序编程。至少,如果我正确理解您的目标,我是这么看的?
【解决方案2】:

据我所知,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);
    }
}

【讨论】:

  • 嗯...如果我正确理解 OP,这正是他们之前查看并确定不满足他们需求的文档。问题是您不能轻易地从SingleConnectionFactory 转到与 SQL Server 的 JMS 连接,而不使用至少从粗略阅读看来不受支持的解决方案之一。值得怀疑的是,@bosnic 的团队目前是否正在使用 JDBC drivers for SQL Server 并且只是对其进行改造以满足他们的需求(如之前的通信所推测的那样)。
猜你喜欢
  • 2011-05-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2021-04-17
相关资源
最近更新 更多