Tengo la siguiente situación:
- Hay un número fijo de grupos.
- Hay un flujo TCP de mensajes entrantes. Cada mensaje está relacionado con exactamente un grupo.
Comienzo a la ruta del camello de la siguiente manera:
public class MyMessage implements Runnable {
public void run() {
// omitted here
}
}
from("netty:tcp://localhost:7777?textline=true&sync=false")
... // omitted here: parse message to pojo MyMessage, set header "group-identifier"
.to(seda:process);
Esta ruta Camel consume los TCP corriente, lo analiza y convierte la carga útil de cada mensaje entrante a un MyMessage
POJO y establece el group-identifier
encabezado en la bolsa que se corresponde con un mensaje ...
Ahora quiero consumir seda:process
de la siguiente manera:
- Los mensajes que pertenecen al mismo grupo no pueden ser ejecutados simultáneamente.
- Los mensajes que pertenecen a diferentes grupos se pueden ejecutar concurrentemente.
- Cada mensajes deben ser ejecutadas por llamar
run()
. Quiero dar / definir unaExecutorService
para esto, para que pueda controlar el número de hilos.
¿Qué empresa de inserción patrones puedo aplicar aquí? ¿Cómo puedo asignar estos conceptos a camello?
Aprendí que ActiveMQ tiene el concepto de grupos de mensajes ( http://activemq.apache.org/message-groups.html ). Esto podría proporcionar una manera de asegurarse de que dos mensajes del mismo grupo nunca serán ejecutadas al mismo tiempo. Sin embargo, no estoy seguro de que la introducción de ActiveMQ sólo para esto no es una exageración. ¿Puede esto también se logra con 'núcleo' Camel / Java?
Es bastante fácil de hacer esto en ActiveMQ. El siguiente fragmento de código simula la ejecución de los mensajes según sea necesario:
- Los mensajes que pertenecen al mismo grupo se ejecutan secuencialmente.
- Los mensajes pertenecen a diferentes grupos se ejecutan simultáneamente.
Esto se basa en grupos de mensajes ActiveMQ como se explica en http://activemq.apache.org/message-groups.html .
final CamelContext context = new DefaultCamelContext();
context.addComponent("activemq", ActiveMQComponent.activeMQComponent("vm://localhost?broker.persistent=false"));
context.addRoutes(new RouteBuilder() {
@Override
public void configure() {
from("activemq:queue:q?concurrentConsumers=5")
.process(exchange -> {
System.out.println(Thread.currentThread() + " - " + exchange.getIn().getBody());
Thread.sleep(5000);
});
}
});
context.start();
for (int i = 0; i < 1000; ++i) {
context.createFluentProducerTemplate()
.withBody("This is a message from group : " + (i % 5))
.withHeader("JMSXGroupID", "" + (i % 5))
.to("activemq:queue:q")
.send();
}
Dicho esto, yo (todavía) pregunto si esto se podría hacer con los PIE puros / Camel-núcleo.