Что необходимо для отправки POJO с помощью Camel ProducerTemplate # sendBody () - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь отправить POJO, используя ProducerTemplate # sendBody (), но получаю следующую ошибку:

org.apache.camel.language.bean.RuntimeBeanExpressionException: Failed to invoke 
  method: [searchId] on app.FsiRequest due to: 
  java.lang.IndexOutOfBoundsException: Key: searchId not found in bean: 
  app.FsiRequest@5c2d65cf of type: app.FsiRequest using OGNL path [[searchId]]

    at org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:119) ~[camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:135) ~[camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.model.language.ExpressionDefinition.evaluate(ExpressionDefinition.java:127) ~[camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.model.language.ExpressionDefinition.evaluate(ExpressionDefinition.java:119) ~[camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.builder.ExpressionBuilder$40.evaluate(ExpressionBuilder.java:1004) ~[camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:36) ~[camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.builder.SimpleBuilder.evaluate(SimpleBuilder.java:92) ~[camel-core-2.22.1.jar:2.22.1]

Класс, который я отправляю (упрощенно):

public class FsiRequest {
    public String getSearchId() {
        return searchId;
    }

    public void setSearchId(String searchId) {
        this.searchId = searchId;
    }

    private String searchId;

    public FsiRequest(Map<String, String> request) {
        searchId = request.get("searchId");
    }
}

Вот мой призыв:

private final ForkJoinPool routeExecutorPool = new ForkJoinPool(1024);

@Override
public void configure() {
    from("servlet://" + SEARCH_REQUEST)
            .process(exchange -> {
                FsiRequest request = createRequestMap(exchange);
                sendRequestToAllProviderRoutes(exchange, request);
            })
            .transform()
            .constant("OK");
}

private void sendRequestToAllProviderRoutes(Exchange exchange, FsiRequest request) {
    try {
        ProducerTemplate tmpl = exchange.getContext().createProducerTemplate();
        routeExecutorPool.execute(() -> getRoutes(exchange).parallelStream().forEach(
                route -> tmpl.sendBody(route, request)
        ));
    } catch (RejectedExecutionException | RuntimeCamelException e) {
        log.error("FSI Servlet failed to send request to provider routes", e);
    }
}

getRoutes() извлекает соответствующие маршруты путем фильтрации exchange.getContext().getRouteDefinitions().

sendBody() отлично работает, когда я использую HashMap<String, Object> вместо класса FsiRequest.

1 Ответ

0 голосов
/ 02 ноября 2018

Эта проблема возникла из-за ошибки с нашей стороны. Маршрут получения был таким:

.setHeader(SEARCH_ID_KEY, simple("${body[searchId]}"))

Переход на body.searchId решил проблему.

...