Camel Java DSL - routage sur ENUM en-tête - routeur à base de contenu ou d'un routeur dynamique
-
27-10-2019 - |
Question
I ai un bean qui produit des objets et les envoie à une file d'attente en utilisant le SEDA ProducerTemplate en chameau.
J'envoyer un corps et un en-tête:
producerTemp.sendBodyAndHeader(document, "sourceSystem", sourceSys);
Ici, le nom d'en-tête est sourceSystem
et la valeur de l'objet d'en-tête est un ENUM (sourceSys
) qui contient la source de l'objet document
contenant un certain nombre de attribs differnt.
Je veux tirer des messages d'une manière simultanée de la file d'attente SEDA et les envoyer à différents critères d'évaluation en fonction de la valeur de la sourceSys ENUM.
Quel est le plus efficace EIP en chameau et utiliser ce que quelqu'un a un exemple en utilisant Java DSL, je ne sais pas comment je peux tester la valeur du Enum?
Je pense que je fais quelque chose comme ceci:
from("seda:a")
.choice()
.when(header("foo").isEqualTo(SourceSysEnum.SYSTEM1))
.to("seda:b")
.when(header("foo").isEqualTo(SourceSysEnum.SYSTEM2))
.to("seda:c")
.otherwise()
.to("seda:d");
..?
La solution
Vous pouvez utiliser la liste des destinataires EIP http://camel.apache.org/recipient-list.html
Et puis utiliser par exemple un haricot java pour calculer les uri où le message devrait aller.
from("seda:a")
.recpientList().method(MyBean.class, "whereToGo");
Et dans le haricot, vous pouvez utiliser le paramètre haricot obligatoire.
- http://camel.apache.org/bean-binding.html
- http://camel.apache.org/parameter-binding-annotations.html
Vous pouvez lier l'en-tête comme suit:
public class MyBean {
public String whereToGo(String body, @Header("foo") SourceSysEnum sys) {
...
}
}
Si vous ne avez pas besoin du corps de message, vous pouvez omettre ce paramètre.
Autres conseils
Vous pouvez utiliser un Processor
combiné avec un Routing Slip
pour y parvenir à l'aide d'une instruction switch. Je ne sais pas comment cela sera beaucoup plus efficace à moins que vous avez une tonne de valeurs ENUM. Il, cependant, vous donner plus de flexibilité si vous avez besoin d'ajouter une logique plus complexe à l'avenir.
from("seda:a")
.process(new SourceSysRoutingSlipProvider())
.routingSlip(SourceSysRoutingSlipProvider.HEADER_NAME);
public class SourceSysRoutingSlipProvider : Processor {
public static String HEADER_NAME="sourceSystemRoutes";
public void process(Exchange exchange) throws Exception {
Message in = exchange.getIn();
switch( in.getHeader("sourceSystem") ) {
case SourceSysEnum.SYSTEM1:
in.setHeader(HEADER_NAME, "seda:b");
break;
case SourceSysEnum.SYSTEM2:
in.setHeader(HEADER_NAME, "seda:c");
break;
...
default:
in.setHeader(HEADER_NAME, "seda:d");
break;
}
}
}