След като използвам Spring Integration в проект, моето наблюдение е да използвам jdbc адаптер или шлюз само в началото или в края на потока. Ако ги използваме в средата на потока, той ще стане твърде многословен и сложен.
Например:
<jdbc:outbound-gateway
query="select * from foo where
c1=:headers[c1] AND
c2=:headers[c2] AND
c3=:headers[c3] AND
c4=:headers[c4]"
row-mapper="fooMapper" data-source="myDataSource" max-rows-per-poll="100000" />
<int:service-activator ref="serviceActivator" method="processFoo" />
В горния <jdbc:outbound-gateway>
трябва да предадем всички контейнери (c1, c2, c3, c4) в заглавката на съобщението. Трябва да погледнем напред и назад в кода на Java и xml файла за всяка промяна в условието where или когато има твърде много клаузи where.
Освен това е предразположен към грешки. Например, ако сме написали грешно :headers[c1]
до :headers[d1]
, то няма да хвърли изключение и ще замени :headers[d1]
с null
.
Ако заявката не върне нито един ред, тя ще хвърли изключение по подразбиране. Така че трябва да използваме requires-reply="false"
, за да променим поведението по подразбиране.
Ако искаме да продължим, когато заявката не върне никаква стойност, тогава трябва да добавим съвет към шлюза, както е показано по-долу:
<jdbc:outbound-gateway ... >
<jdbc:request-handler-advice-chain>
<bean class="com.service.NullReplyAdvice" />
</jdbc:request-handler-advice-chain>
</jdbc:outbound-gateway>
Моля, поправете ме, ако има недостатъци в разбирането на концепцията.