Проблема с использованием jdbc: исходящий шлюз, когда запрос возвращает пустой набор результатов

Я заметил следующее неожиданное поведение и могу воспроизвести его с помощью примера Spring Integration basic / jdbc.

Запустите пример Spring Integration sample basic / jdbc и сразу же попытайтесь найти имя, которое не существует, то есть запустить с использованием Spring Integration sample basic / jdbc run Main.java, введите 1 в поле Find person, введите Mark

Выдается исключение ReplyRequiredException, поскольку строка не найдена. Если я изменю определение int-jdbc: outbound-gateway в spring-integration-context.xml на использование requiresReply = "false", то вызов findPersonByName будет блокироваться до тех пор, пока int: gateway не истечет по истечении заданных 5 секунд.

Это очень типичная операция, когда я хочу использовать Spring Integration jdbc: outbound-gateway для возврата списка из 0 или более элементов. Кажется, он отлично работает для размеров результата 1 или более. Однако при обнаружении 0 результатов любое поведение нежелательно. Мне не нужно исключение, потому что иногда такое поведение ожидается, и я также не хочу блокировать до истечения времени ожидания. В случае исключения я могу использовать try / catch, но фреймворк регистрирует исключение на уровне WARN, и я не хочу обрабатывать ожидаемое поведение, возвращено 0 элементов, с обработкой исключений, try / catch. Есть ли способ настроить поток в Spring Integration sample basic / jdbc для возврата без блокировки или выдачи исключения, когда имя не найдено, т.е. просто вернуть пустой список?


person Mark    schedule 11.10.2014    source источник


Ответы (2)


Об этом просили несколько пользователей, и мы рассмотрим это.

А пока есть пара обходных путей.

  1. Добавьте error-channel в какой-либо компонент восходящего потока (например, <gateway/>) для обработки исключения.
  2. Добавьте ExpressionEvaluatingRequestHandlerAdvice в request-handler-advice-chain. Установите для этого свойства returnFailureExpressionResult значение true, в результате чего результат onFailureExpression будет возвращен вызывающему потоку вместо генерации исключения.
person Gary Russell    schedule 12.10.2014
comment
Рассел: Я пытаюсь добавить атрибут error-channel в int-jdbc: outbound-gateway, но он говорит, что error-channel не может появляться в этом элементе. - person mayur tanna; 23.12.2018
comment
Не задавайте новых вопросов в комментариях к старым ответам; особенно когда ему 4 года. Вместо этого задайте новый вопрос. Как я сказал в этом ответе, каналы ошибок определяются на входящих конечных точках, а не на исходящих; или вы можете добавить выражение оценки совета исходящим конечным точкам. - person Gary Russell; 23.12.2018
comment
Спасибо @gary russel за ответ. Я позабочусь о том, чтобы в следующий раз опубликовать новый вопрос вместо того, чтобы добавлять вопрос в качестве комментария. - person mayur tanna; 31.12.2018

Еще один вариант - использовать вместо service activator jdbcTemplate. Таким образом, вы сами контролируете реакцию.

Очевидно, что это не идеальный подход, но он, возможно, чище, чем прибегать к использованию каналов ошибок или советов обработчика для того, что кажется нормальным сценарием ответа. Один потенциальный недостаток (хотя я еще не исследовал это подробно) заключается в том, что вы можете потерять некоторые дополнительные готовые инструменты, предоставляемые фреймворком для шлюза jdbc (например, дополнительные JMX свойства / раскрытие методов и т. Д.)

person leeor    schedule 20.04.2016
comment
Спасибо за ответ. Поскольку мне нужно использовать только шлюз исходящей почты, указанный выше вариант недоступен. - person mayur tanna; 31.12.2018