Camel Java DSL - routage sur ENUM en-tête - routeur à base de contenu ou d'un routeur dynamique

StackOverflow https://stackoverflow.com/questions/6832375

  •  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");

..?

Était-ce utile?

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.

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;
    } 
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top