EIP / Apache Camel - Cómo mensaje de proceso al mismo tiempo, pero atómicamente por grupo?

pbillen:

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 MyMessagePOJO y establece el group-identifierencabezado en la bolsa que se corresponde con un mensaje ...

Ahora quiero consumir seda:processde 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 una ExecutorServicepara 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?

pbillen:

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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=136831&siteId=1
Recomendado
Clasificación