Доступ к телу разделенной записиУстановить в Apache Camel - PullRequest
2 голосов
/ 28 января 2020

Тело моего сообщения содержит HashMap.

Я разделил это сообщение по его записи. Набор:

.from(FROM)
   .aggregate(...)

   // create an iterable
   .transform(simple("${in.body.entrySet()}"))

   // split over the Iterable
   .split(body())
      .process(new ReadMapEntry())
      .to(TO)
   .end()
.end();

Теперь пытаюсь получить эти записи в процессоре. Ближайший я пытался это разыграть. Я нашел похожие примеры с использованием ArrayList, но я не могу заставить их работать для этого ... в работах такого рода, но это вызвало непроверенное предупреждение о приведении типов из-за обобщений Map.Entry.

public void process(final Exchange ex) throws Exception
{     
   Map.Entry<A, B> entry = (Map.Entry<A, B>) ex.getIn().getBody(Map.Entry.class);
   (...)
}

Решение

Моя цель здесь состояла в том, чтобы избежать предупреждения, связанного с приведением к наследуемому классу. В итоге я использовал ключевое слово simple. Таким образом, я мог передать значение карты в процессор (таким образом, избегая необязательного предупреждения приведения) и получить доступ к ключу через заголовок.

.from(FROM)
   .aggregate(...)

   .split(simple("${in.body.entrySet}"))
      .setHeader(KEY_VALUE_AS_HEADER, simple("${body.getKey}"))
      .setBody(simple("${body.getValue}"))
      .process(new ReadMapEntry())
      .to(TO)
   .end()
.end();
public void process(final Exchange ex) throws Exception
{     
   A value = ex.getIn().getBody(A.class);
   B key = ex.getIn().getHeader(KEY_VALUE_AS_HEADER, B.class);
   (...)
}

1 Ответ

2 голосов
/ 29 января 2020

Вы можете попробовать использовать простой Бин и напрямую ввести Тело с правильным типом.

// simple POJO, does not implement Processor interface
public void readMap(@Body Map.Entry<A, B> mapEntry) {     
     // use mapEntry (message body) directly instead of extracting it from Exchange
     mapEntry.[whatever]
}

Затем вы вызываете его по маршруту

.method(new ReadMapEntryBean()) // if Bean contains only 1 method

или

.method(new ReadMapEntryBean(), "readMap") // if there are other methods

Интерфейс процессора довольно старый, неуклюжий и его трудно проверить. POJO намного проще в использовании, и они очень хорошо работают с Camel.

См. Аннотации привязки параметров и Интеграция компонентов из документации Camel для получения более подробной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...