2010-02-17 28 views
17

estoy en el proceso de ActiveMQ de aprendizaje y Camel, con el objetivo de crear un pequeño sistema prototipo que funciona más o menos así:distribuida ActiveMQ con Camel

alt text http://www.paulstovell.com/get/stackoverflow-questions/Queues.png (big)

Cuando se hace un pedido en el sistema de Órdenes, se envía un mensaje a cualquier suscriptor (un sistema de pub/sub), y pueden desempeñar su parte en el procesamiento del pedido. Pedidos, Envío y Las aplicaciones de facturación tienen sus propias instalaciones ActiveMQ, de modo que si alguno de los tres sistemas está fuera de línea, los demás pueden seguir funcionando. Algo se encarga de mover mensajes entre las instalaciones de ActiveMQ.

Obtener Apache Camel para mover mensajes de una cola a otra a través de las rutas es bastante fácil, si están en la misma instancia de ActiveMQ. Así que esto funciona para administrar las colas de suscripción.

El próximo reto es enviar mensajes de una instancia de ActiveMQ a otra, y es el aspecto en el que no estoy seguro de qué buscar a continuación.

  1. ¿Puede Camel enrutar entre las diferentes instalaciones de ActiveMQ? (No puedo entender cuál sería el URI del punto final JMI si están en máquinas diferentes).
  2. Entiendo que ActiveMQ tiene capacidades de store and forward. ¿Es esto lo que usaría para mover mensajes entre Pedidos y Envíos/Facturación?
  3. ¿O es esto lo que Apache ServiceMix está destinado a resolver?

Respuesta

19

Este es un asíncrono aplicación bastante sencillo, orientado a eventos que está bien adaptado para ActiveMQ y Camel.

En realidad lo hace no mover mensajes explícitamente de una instancia de ActiveMQ a otra. La forma en que funciona es usar lo que se conoce como network of brokers. En su caso, tendría tres intermediarios: ActiveMQ-purple, ActiveMQ-green y ActiveMQ-blue. ActiveMQ-purple crea una red de intermediario unidireccional con ActiveMQ-green y ActiveMQ-blue. Esto permite a ActiveMQ-purple almacenar y reenviar mensajes a ActiveMQ-green y ActiveMQ-blue según la demanda del consumidor.

La aplicación Pedidos acepta pedidos en la cola de pedidos en ActiveMQ-purple. La aplicación Pedidos utiliza Camel para consumir y procesar un mensaje para determinar si se trata de un mensaje de facturación o de envío. Camel enruta los mensajes a la cola de facturación o a la cola de envío en ActiveMQ-purple.

demanda de los consumidores proviene de la aplicación de facturación y la aplicación de envío. La facturación utiliza Camel para consumir mensajes de la cola de facturación en ActiveMQ-green. La aplicación de envío usa Camel para consumir mensajes de la cola de envío en ActiveMQ-blue. Debido a la red de intermediarios y debido a la demanda del consumidor en la cola de facturación de ActiveMQ-green y la cola ActiveMQ-blue.shipping, los mensajes se reenviarán de ActiveMQ-purple al intermediario y la cola apropiados. No es necesario enrutar mensajes explícitamente a un intermediario específico.

Espero que esto responda a sus preguntas. Avísame si tienes más.

Bruce

1

Hmmmm, solo he incursionado en el mejor de los casos, y no por un buen rato, pero intentaré ofrecer algo.

ActiveMQ puede enrutar entre diferentes instalaciones y solo utiliza URI estándar según mi conocimiento, por lo que no estoy seguro de cuál es el problema aquí. Pensaría que usando TCP estarías bien. Usando ServiceMix (lo mencionas más adelante), solo especificas una connectionFactory & y luego proporcionas el URI en eso. Este enlace muestra algunos ejemplos http://servicemix.apache.org/servicemix-jms-new-endpoints.html.

Camel tiene soporte para Suscriptor Durable si eso es lo que buscaba (http://camel.apache.org/durable-subscriber.html)? Este patrón asegurará que si el suscriptor está fuera de línea cuando el mensaje está listo, se mantendrá hasta que el suscriptor vuelva a estar en línea. Esto también es apoyado por ServiceMix (ver vínculo anterior y buscar 'subscriptionDurable'.

+0

Genial, gracias, esto me da una dirección! –