2012-04-03 12 views
8

estamos desarrollando una aplicación con las siguientes características:AMQP, SQL Server y XA

  • 3.1.0.RELEASE primavera aplicación independiente
  • JPA con Hibernate 3.6.7.Final
  • AMQP (como RabbitMQ servidor, primavera AMQP como cliente)
  • SQL Server 2008 con jTDS controlador

Tenemos que sincronizar las transacciones entre un RabbitMQ nd SQL Server, entonces estamos tratando de configurar XA con atomikos. El problema es que no podemos encontrar un solo archivo de configuración de muestra de primavera para esa situación que realmente funcione. Probamos tantas combinaciones usando muestras de la documentación de Spring, google, foros, etc. Siempre falta algo.

Podría alguien, por favor, denos un archivo para que podamos utilizarlo como una plantilla de partida para nuestra configuración.

P.S. ¿Realmente necesitamos XA?

Gracias.

+0

Leyendo algunos documentos parece que rabbitmq no es compatible con XA. Ahora tengo mucha curiosidad acerca de cuál sería una solución "perfecta" ... –

+0

Para la capa de sincronización, ¿ha considerado [Cambiar captura de datos] (https://en.wikipedia.org/wiki/Change_data_capture)? [Este hilo] (http://stackoverflow.com/questions/9918519/generating-events-from-sql-server) entra en un poco más de detalle en prosa, pero no cubre su solución en profundidad o en código. Si esta es tu fantasía, estaremos encantados de responder a esto aquí. :) – MrGomez

Respuesta

1

Después de cavar a través de las diversas soluciones candidatas (uso de Change Data Capture, adaptadores para SQL Server Service Broker, y las posibles conversiones de MSMQ a RabbitMQ), llegué a una solución que debería funcionar para usted.

Resulta que puede vincular WCF clientes y contratos de servicio a SQL Server. Desde aquí, puede usar RabbitMQ's AMQP binding for WCF para traducir mensajes de ida y vuelta, como los documentos PDF anteriormente mencionados en gran detalle.

No tengo claro si se requerirá un administrador de transacciones adicional como XA aquí, pero si tiene problemas con la duplicación de transacciones, bucles y mensajes incorrectos, vale la pena investigar como intermediario para la conexión. Si sigue esa ruta, debe soldar eso en su puerta de enlace de la misma manera que lo ha definido en la declaración del problema. Si esto necesita una aclaración, me gustaría ampliar esto aquí.

La mejor de las suertes con su aplicación. Suena como una hidra de integración desde el exterior, pero una vez que hable todo, debería funcionar bien.

+0

Nuestra aplicación está basada en Java, por lo que no sé cómo (y por qué) deberíamos usar WCF. Por ahora, estamos creando un conjunto personalizado de clases para controlar las confirmaciones de bases de datos y mensajes. –

+0

@bosnic La idea aquí es usar las instalaciones estándar de WCF para SQL Server como una interfaz en los enlaces AMQP de RabbitMQ, lo que le permitirá conectar la comunicación entre RabbitMQ y SQL Server. Esto está [muy bien documentado] (http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v1.5.1/rabbitmq-dotnet-client-1.5.1-wcf-service-model.pdf), y te permite mantener toda la programación de aplicaciones en Java en el lado RabbitMQ. Al menos, así es como lo veo, si entiendo tus objetivos correctamente? – MrGomez

0

Como sé, RabbitMQ no admite transacciones de estilo XA.

Y sí puede hacerlo en 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; 

ejemplo simple de envío:

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

..y recibir:

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 ... si entiendo el OP correctamente, esta es precisamente la documentación que habían examinado previamente y que no satisfacía sus necesidades. El problema es que no se puede pasar fácilmente de 'SingleConnectionFactory' a una conexión JMS a SQL Server, sin usar una de las soluciones que aparecen, al menos de una lectura superficial, para que no sea compatible. Cabe preguntarse si el equipo de @ bosnic está utilizando actualmente los [controladores JDBC para SQL Server] (http://msdn.microsoft.com/en-us/sqlserver/aa937724) y simplemente están actualizando para satisfacer sus necesidades (como conjetura correspondencia anterior). – MrGomez