В моем верблюжьем маршруте я хочу отправить часть вывода (путь json $._attachments
) в другую конечную точку.Это работает.Однако в некоторых угловых случаях кажется, что некоторые объекты json не имеют этого элемента.Я предположил, что это приведет к тому, что CamelSplitSize будет 0, и попытался проверить это;однако, DefaultErrorHandler, кажется, начинает, а не завершает маршрут.Что я здесь не так делаю?
public class DiscoverAttachmentsFromCouchResponseRoute extends RouteBuilder {
@Override
public void configure() throws Exception
{
JsonPathExpression jsonPathExpression = new JsonPathExpression("$._attachments");
Predicate no_attachments = header("CamelSplitSize").isEqualTo("0");
errorHandler(
deadLetterChannel("broker1:queue:dlq.jsonobject.queue")
.maximumRedeliveries(3)
);
from("broker1:queue:input.jsonobject.queue")
.routeId("DiscoverAttachmentsFromCouchResponseRoute")
.threads(2)
.split(jsonPathExpression)
.marshal().json(JsonLibrary.Jackson,true)
.to("broker1:queue:with.attachments.queue")
.choice()
.when(no_attachments)
.log("No attachments found.")
.to("broker1:queue:no.attachments.queue")
.otherwise()
.log("A grand total of '${header.CamelSplitSize}' attachments were found.")
.endChoice();
}
}
Редактировать иногда ответ слишком очевиден ... Я искал не в том месте.Почему я всегда нахожу ответ через несколько минут после того, как я его спросил?Мне крайне нужна резиновая утка.
Я немного изменил маршрут;Вместо того, чтобы обрабатывать проблему после разделения, я должен сделать это до разделения:
.choice()
.when().jsonpath("$._attachments", true)
.to("vm://withattach")
.otherwise()
.to("vm://withoutattach")
.endChoice();
Тогда мне нужно было только два новых потребителя из vm://*
и выполнить логику там.Это похоже на работу.В jsonpath я могу пропустить исключение, которое я не могу сделать ни в выражении JsonPathExpression, ни в split ();