2015-01-23 3 views
0

Я использую Spring Integration 4. Я надеялся определить контракт на различные интеграции, посредством которого интеграции необходимо реализовать общий интерфейс, как:Spring Integration: Работа с обработчиками без MessageProducer

public interface Integration { 
    Object execute(Map<String, Object> inputs); 
} 

Тогда определяет интеграцию вы определяете шлюз:

<int:gateway service-interface="com.whatever.Integration" ... > 

Я получил эту работу, но я застрял, пытаясь понять, как обрабатывать возвращаемое значение execute метода. Первая интеграция, которую я построил, отправляет электронное письмо и поэтому на самом деле не имеет возвращаемого значения, т. Е. Последний элемент рабочего процесса является отправителем почты не MessageProducer: <int-mail:outbound-channel-adapter ... >.

Если я изменяю тип возвращаемого метода execute на void, то интеграция выполняется нормально, но как только я изменю его на Object, интеграция запускается, но никогда не возвращается. Я предполагаю, что это потому, что он ждет что-то на канале ответа.

Для такого типа интеграционных процессов, не являющихся результатом, существует ли способ принудительно вернуть значение true или что-то еще? Я думал о попытке чего-то вроде <int:transformer expression="true">, но я не могу поместить это в свою цепочку после <int-mail:outbound-channel-adapter>, потому что позже не дает значения и поэтому не может предшествовать чему-либо в цепочке.

Таким образом, я немного смущен тем, как обрабатывать не MessageProducer элементов в целом. Буду признателен за любую оказанную помощь.

p.s. Если у кого-нибудь есть отзывы об архитектуре интеграции, предложенной выше, не стесняйтесь отвечать на это и в комментариях.

+0

Почему вы изобретаете отражение? Одним из важных аспектов интеграции Spring является то, что вы можете объявлять строго типизированные методы обслуживания и позволить Spring адаптировать ваше сообщение к ним. – chrylis

+0

@chrylis Не пытайтесь изобретать отражение, просто пытаясь создать единый интерфейс, из которого может быть выполнено множество интеграций (построенных и динамически загруженных после развертывания базового приложения). Я открыт для предложений по лучшему пути. – Marplesoft

+0

Просто используйте сильную печать. Spring Integration адаптирует сигнатуры метода. – chrylis

ответ

0

TBH ваш клиент должен знать, ожидается ли ответ. В этом случае добавьте второй метод, который возвращает void.

Или добавьте ответ-timeout = 0 в gw, и вы получите нулевой возврат.

Проблема с последним заключается в том, что вы не можете определить, не истечет ли время ожидания ответа, требующего ответа = false или конечный потребитель никогда не вернет ответ.

+0

Конечно, я мог бы создать два метода или два интерфейса, чтобы вызывающий абонент знал, есть ли возвращаемое значение - справедливое предложение. Так что я должен предположить, что когда используется обработчик не-MessageProducer, он должен быть последним обработчиком в этом конкретном «пути», и после него ничего не может произойти? Возможно, электронная почта - это крошечный кейс, потому что большинство вещей вернет что-то вроде конечной точки HTTP. – Marplesoft

+0

Если вы хотите вернуть ответ на такой поток, сделайте последний канал перед конечным потребителем (канальным адаптером) ''; вы можете затем подписаться на что-то, чтобы вернуть ответ после успешной отправки почты. '' (используйте 'order = "1" на адаптере канала). Трансформатор будет вызываться после адаптера почты и возвращает 'OK' в метод шлюза. Вам не нужны два интерфейса; вы можете иметь несколько методов на интерфейсе с разными настройками для каждого в ''. –

Смежные вопросы