2012-04-03 27 views
8

chúng tôi đang phát triển một ứng dụng với đặc điểm sau:AMQP, SQL Server và XA

  • 3.1.0.RELEASE mùa xuân độc lập ứng dụng
  • JPA với Hibernate 3.6.7.Final
  • AMQP (RabbitMQ như Server, mùa xuân AMQP như Client)
  • SQL Server 2008 với tài xế jTDS

Chúng ta cần phải đồng bộ hóa các giao dịch giữa RabbitMQ một nd SQL Server, vì vậy chúng tôi đang cố gắng thiết lập XA với atomikos. Vấn đề là chúng ta không thể tìm thấy một tệp cấu hình mẫu mùa xuân duy nhất cho tình huống thực sự hoạt động. Chúng tôi đã thử rất nhiều kết hợp bằng cách sử dụng các mẫu từ tài liệu Spring, google, diễn đàn, vv.

Ai đó, vui lòng cung cấp cho chúng tôi một tệp như vậy để chúng tôi có thể sử dụng nó làm mẫu bắt đầu cho cấu hình của mình.

P.S. Chúng ta có thực sự cần XA không?

Cảm ơn.

+0

Đọc một số tài liệu có vẻ như thỏmq không hỗ trợ XA. Bây giờ tôi thực sự tò mò về những gì sẽ là một giải pháp 'hoàn hảo' ... –

+0

Đối với lớp đồng bộ hóa, bạn đã xem [Thay đổi dữ liệu chụp] (https://en.wikipedia.org/wiki/Change_data_capture) chưa? [Chủ đề này] (http://stackoverflow.com/questions/9918519/generating-events-from-sql-server) đi vào chi tiết hơn một chút trong văn xuôi, nhưng nó không bao gồm giải pháp của bạn theo chiều sâu hoặc trong mã. Nếu đây là ưa thích của bạn, tôi sẽ rất vui khi trả lời câu hỏi này ở đây. :) – MrGomez

Trả lời

1

Sau khi đào bới trong các giải pháp ứng cử viên khác nhau (sử dụng Change Data Capture, adapter cho SQL Server Service Broker, và chuyển đổi có thể từ MSMQ để RabbitMQ), tôi đến một giải pháp mà nên làm việc cho bạn.

Hóa ra bạn có thể ràng buộc WCF khách hàng và hợp đồng dịch vụ với SQL Server. Từ đây, bạn có thể sử dụng RabbitMQ's AMQP binding for WCF để dịch thông báo qua lại, dưới dạng các tài liệu PDF được báo cáo chi tiết một cách chi tiết.

Tôi không rõ liệu một người quản lý giao dịch bổ sung như XA sẽ được yêu cầu ở đây hay không, nhưng nếu bạn gặp vấn đề với sao chép giao dịch, lặp lại và mismessaging, nó đáng để điều tra như một trung gian cho kết nối. Nếu bạn đi theo lộ trình đó, bạn cần phải hàn nó vào cổng của bạn theo cách tương tự như bạn đã xác định trong câu lệnh vấn đề. Nếu điều này cần làm rõ, tôi rất sẵn lòng mở rộng điều này ở đây.

Chúc bạn may mắn với ứng dụng của mình. Nghe có vẻ giống như một hydra tích hợp từ bên ngoài, nhưng một khi bạn nhận được tất cả mọi thứ nói chuyện với nhau, nó sẽ làm việc độc đáo.

+0

Ứng dụng của chúng tôi là dựa trên Java, vì vậy tôi không biết làm thế nào (và tại sao) chúng ta nên sử dụng WCF. Hiện tại, chúng tôi đang xây dựng một nhóm các lớp tùy chỉnh để kiểm soát cơ sở dữ liệu và các cam kết thông báo. –

+0

@bosnic Ý tưởng ở đây là sử dụng các tiện ích WCF tiêu chuẩn cho SQL Server như một giao diện kết nối AMQP của RabbitMQ, cho phép bạn kết nối giữa RabbitMQ và SQL Server. Đây là [tài liệu rất tốt] (http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v1.5.1/rabbitmq-dotnet-client-1.5.1-wcf-service-model.pdf) và nó cho phép bạn giữ tất cả các chương trình ứng dụng trong Java ở phía bên ThỏMQ. Ít nhất, đó là cách tôi nhìn thấy nó, nếu tôi hiểu mục tiêu của bạn một cách chính xác? – MrGomez

0

Như tôi biết RabbitMQ không hỗ trợ giao dịch kiểu XA.

Và có bạn có thể làm điều đó trong 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; 

dụ đơn giản của gửi:

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

..và nhận:

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

Um ... nếu tôi hiểu OP một cách chính xác, đây chính là tài liệu mà họ đã xem trước đây và được xác định không đáp ứng nhu cầu của họ. Vấn đề là bạn không thể dễ dàng đi từ 'SingleConnectionFactory' đến một kết nối JMS đến SQL Server, mà không sử dụng một trong các giải pháp xuất hiện, ít nhất là từ một đọc lướt, không được hỗ trợ. Nó đặt câu hỏi nếu nhóm @ bosnic hiện đang sử dụng [trình điều khiển JDBC cho SQL Server] (http://msdn.microsoft.com/en-us/sqlserver/aa937724) và đơn giản là trang bị thêm cho họ để đáp ứng nhu cầu của họ (như được phỏng đoán bởi thư trước đó). – MrGomez

Các vấn đề liên quan