Проблем при използването на jdbc:outbound-gateway, когато заявката връща празен набор от резултати

Забелязах следното неочаквано поведение и мога да го възпроизведа с пробата на Spring Integration basic/jdbc

Стартирайте примера за пролетна интеграция basic/jdbc и незабавно се опитайте да намерите име, което не съществува, т.е. стартирайте с помощта на примера за пролетна интеграция basic/jdbc, стартирайте Main.java, въведете 1, за да намерите човек, въведете Марк

Получава се изключение 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 към JDBC шлюзът request-handler-advice-chain. Задайте свойството returnFailureExpressionResult на true, което кара резултатът от onFailureExpression да бъде върнат към извикващата нишка, вместо да хвърля изключението.
person Gary Russell    schedule 12.10.2014
comment
russel: Опитвам се да добавя атрибут 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