Как связать роутер после кастом сплиттера в Camel

Я хотел бы извлечь документы из полезной нагрузки JSON и отправить их на разные процессоры в зависимости от их местоположения.

JSON:

{
    "email" : {
        "documents" : [{
                "name" : "Document 1",
                "id" : "1111"
            }, {
                "name" : "Document 2",
                "id" : "222"
            }
        ]
    },
    "sms" : {
        "documents" : [{
                "name" : "Document 3",
                "id" : "3333"
            }, {
                "name" : "Document 4",
                "id" : "4444"
            }
        ]
    }
}

Я думал достичь этого, делая что-то вроде этого:

from("servlet:///doc").unmarshal()
  .json(JsonLibrary.Jackson, DocumentRequest.class)
  .split().method("docSplit", "split")
  .choice()
    .when().header("mode").isEqualTo("email")
      .to("direct:email")
    .when().header("mode").isEqualTo("sms")
      .to("direct:sms");

Мой сплиттер может получить DocumentRequest и вытащить все документы... но я не знаю, как установить заголовок "mode" для будущей маршрутизации.

Как мне установить заголовок "mode"?

Есть ли лучший общий подход?

1 ответ

Решение

Вы всегда можете поместить собственную логику разделения в собственный процессор и использовать ProducerTemplate

Например:

    from("servlet:///doc").unmarshal()
              .json(JsonLibrary.Jackson, DocumentRequest.class)
              .process(new Processor()  {
                    @Override
                    public void process(Exchange exchange) throws Exception {
                        ProducerTemplate producer=exchange.getContext().createProducerTemplate();

                        String mode;
                        for (Document doc: // split and set mode logic goes here ) {
                            if (mode.compareToIgnoreCase("email") ==0) {
                                producer.sendBody("direct:email", doc);
                            } else 
                            if (mode.compareToIgnoreCase("sms") ==0) {
                                producer.sendBody("direct:sms", doc);
                            }
...
                        }
                    }
              });
Другие вопросы по тегам