Реализация исходящего шлюза с интегрированной пружиной
Как указать реализацию сервиса для исходящего шлюза в Spring Integration? Если исходящие шлюзы предназначены для двунаправленной связи и обычно используются для обеспечения интеграции с внешними системами, а активаторы услуг - для локальных вызовов служб, то как реализовать исходящий шлюз для пользовательской транспортной / внешней системы? Пространство имен шлюза позволяет настроить интерфейс службы для входящего шлюза, но как насчет реализации службы для исходящего шлюза?
<int:gateway id="cafeService"
service-interface="org.cafeteria.Cafe"
default-request-channel="requestChannel"
default-reply-channel="replyChannel"/>
1 ответ
Самый простой механизм - реализовать интерфейс службы в виде POJO и вызывать его из
<service-activator input-channel="..." output-channel="..."
ref="myPojo" method="process" />
где
public class MyPoJo {
public Bar process(Foo foo) {
...
}
}
Если вы хотите сделать это более формально, вы можете продлить AbstractReplyProducingMessageHandler
, И оберните его в конечную точку потребителя, но большинство предпочитают маршрут POJO, потому что тогда у вас не будет никаких каркасных зависимостей.
РЕДАКТИРОВАТЬ:
Если вы используете Spring Tool Suite (основанный на Eclipse), существует стартовый проект, который поможет вам построить полноценный шлюз с использованием шаблона; включает в себя начальные классы для анализаторов пространства имен и все (New | Spring | Spring Project | Integration ...
). Шаблон размещен здесь. Они немного устарели (например, требуется обновление SI, и мы больше не используем docbook - по крайней мере, на master - мы используем asciidoc), но это займет у вас долгий путь. Вы также можете посмотреть на стандартные парсеры для помощи с пространством имен.
Если вы считаете, что ваш шлюз может иметь широкую привлекательность, рассмотрите возможность добавления его в расширения.
EDIT2:
Из вашего комментария...
Насколько я понял, исходящие шлюзы используются для обеспечения интеграции с внешними системами, а активаторы услуг - для локальных вызовов служб.
Обычно это так, но ничто не мешает вам вызывать внешнюю службу через <service-activator/>
- это вопрос личных предпочтений, и нет реальной причины создавать официальный адаптер, если вы не хотите публиковать его для использования в своей организации и / или вносить в сообщество более формальным образом.