Верблюд: Как сохранить результат агрегации при возникновении исключения? - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть маршрут, который многоадресная на 2 места. Если при вызове 1 места возникает исключение, я не могу сохранить результат агрегирования. Внутри процессора onException Map, которую я создал во время агрегации, нет. Я использую верблюда 2.25.

onException(RuntimeException.class)
    .process(new Processor() {
        @Override
        public void process(Exchange exchange) throws Exception {
            Map<String, String> results = exchange.getProperty(SimpleAggregationStrategy.RESULTS, Map.class);
            System.out.println(results);
        }
    });

from(DIRECT_FIRST)
    .log("First route")
    .setBody(constant("FIRST TEXT"));

from(DIRECT_SECOND)
    .log("Second route")
    .setBody(constant("SECOND TEXT"))
    .throwException(new RuntimeException("Dummy Exception"));

from(DIRECT_ENTRY)
    .multicast().stopOnException().aggregationStrategy(new AggregationStrategy() {
        public static final String RESULTS = "RESULTS";

        @Override
        public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
            System.out.println("INSIDE SimpleAggregationStrategy !!!!!!!!!!!!!!!!");
            Map<String, String> results;
            if (oldExchange != null) {
                results = oldExchange.getProperty(RESULTS, Map.class);
            } else {
                results = new HashMap<>();
            }
            results.put(newExchange.getIn().getBody(String.class), newExchange.getIn().getBody(String.class));
            return newExchange;
        }
    })
    .to(DIRECT_FIRST, DIRECT_SECOND);

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Решение проще, чем я думал. Нам нужно только создать exchangeProperty до шага многоадресной рассылки. Затем это свойство exchange может хранить результаты агрегирования даже в случае исключения при многоадресной передаче

0 голосов
/ 25 февраля 2020

Я предполагаю, что агрегатор прерывает обработку из-за stopOnException() и поэтому не возвращает (неполный) результат .

Вы можете попытаться поместить стратегию агрегации в управляемый контекстом bean-компонент и сделать Map переменной-экземпляром, доступной через метод получения.

В случае исключения вы можете попытаться получить неполную Карту от компонента. Но я понятия не имею, хранит ли он данные или очищается, когда обработка прерывается.

...