Camel: onException против перехватаSendToEndpoint

Я использую верблюд 2.10 с JPA. У меня есть 2 маршрута в моем контексте. Маршрут 1 использует конечную точку JPA (таблицу базы данных), выполняет некоторую обработку (в bean-компоненте), а затем перенаправляет сообщение на маршрут 2. Если во время обработки что-то пойдет не так, bean-компонент возвращает NULL.

Первое, что я хочу сделать на маршруте 2, это проверить, не является ли тело (перенаправленное с маршрута 1) NULL. Таким образом, я вижу 2 возможности: 1) использование проверки в маршруте 2

<route id="route2">
...
<validate>
  <simple>${body} != null</simple>
</validate>

2) используя interceptSendToEndpoint, чтобы вообще избежать отправки сообщения NULL на маршрут 2:

<interceptSendToEndpoint uri="toRoute2" skipSendToOriginalEndpoint="true">
  <when><simple>${body} == null</simple></when>
  <transform>
    <constant>Error Message</constant>
  </transform>
  <to uri="direct:logError"/>
</interceptSendToEndpoint> 

как вы думаете, как лучше?

спасибо за ваши предложения!

БР Матиас


person Matthias    schedule 12.11.2012    source источник


Ответы (1)


Ну, это вопрос интерфейсов.

Если полезная нагрузка NULL считается ошибкой, я бы вместо этого выдал исключение. Обычно путем изменения компонента обработки и throw new RuntimeException("some error msg"); вместо return null;. Если это невозможно, вы всегда можете обернуть bean-компонент в другой бросок bean-компонента вместо возврата null - или, по сути, сделать то, что вы делаете в 1. Исключения также подключаются к обычным обработчикам ошибок, если вы хотите вести журнал ошибок и т. д.

Использование перехватов может быть очень мощным, но также делает маршрут менее очевидным — когда вы пересматриваете код через несколько лет. Это немного избыточно для такого простого сценария.

person Petter Nordlander    schedule 12.11.2012
comment
Привет, Петтер, спасибо за отзыв! Я не могу модифицировать (все) bean-компоненты и генерировать исключения напрямую, но обернуть их в другой bean-компонент звучит как хорошая идея! если я правильно вас понял, вы также предпочли бы этот подход моей первой предложенной идее 1) с использованием проверки на маршруте 2? - person Matthias; 13.11.2012
comment
Ну, зависит. Если вы используете bean-компонент в нескольких местах, может быть лучше исключение warpper +, вы также можете настроить исключение (конкретное сообщение об ошибке, а что нет). Однако проверка лучше, если вы хотите, чтобы вся логика находилась внутри XML-кода верблюжьего маршрута. - person Petter Nordlander; 13.11.2012