Spring Integration Gateway с возвращаемым типом метода void: почему он не устанавливает NullChannel replyChannel автоматически?

У меня есть такой поток интеграции с использованием Spring Integration 4.3.x:

<int:gateway> => <int:transformer> => <int-http:outbound-gateway> => <int:transformer> => return to the gateway

Шлюз определяется интерфейсом с несколькими методами, некоторые из которых имеют возвращаемый тип, а некоторые нет. Действительно, я вызываю REST API через исходящий HTTP-шлюз, и некоторые методы возвращают что-то значимое, другие - ничего (например: пустой ответ + код состояния, который я просто использую для обнаружения ошибок).

Как только я вызываю какой-либо метод шлюза с возвращаемым типом, все работает нормально. Когда я вызываю один с типом возврата void, я получаю эту ошибку:

org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available

Я много искал, читал документацию SI и отлаживал, и в итоге я пришел к следующему: org.springframework.integration.gateway.GatewayProxyFactoryBean.invokeGatewayMethod(MethodInvocation, boolean), который по существу делает следующее: если ожидается ответ, выполните «sendAndReceive», в противном случае выполните простую «отправку». Первый устанавливает заголовок replyChannel, второй - нет.

В этом есть смысл, но ... почему бы просто не установить автоматически заголовок NullChannel replyChannel в последнем случае? Я не совсем понимаю, является ли это поведение (например, получение исключения всякий раз, когда поток дает ответ, который не может быть преобразован в ответ шлюза), желаемым, потому что я не могу найти никакого упоминания о нем в документация. Документы, похоже, предполагают, что любой ответ просто игнорируется, но это не тот случай, и теперь мне нужно поместить преобразователь в цепочку, который устанавливает заголовок NullChannel replyChannel всякий раз, когда я обнаруживаю, что фактический ответ не будет возвращен ... действительно, то, что я ожидал, что шлюз сделает за меня. В самом деле, похоже, что методы void в шлюзах могут работать "из коробки" только тогда, когда у вас есть адаптер в качестве конечной конечной точки потока.

Возможно, я что-то упускаю, поэтому вопрос в этом и заключается.


person Mauro Molinari    schedule 12.05.2020    source источник


Ответы (1)


Это интересное предложение (NullChannel в replyChannel) заголовок.

Придется подумать о том, могут ли быть какие-то непредвиденные последствия.

А пока вы сможете использовать

@Gateway(headers = @GatewayHeader(name = MessageHeaders.REPLY_CHANNEL,
    expression = "@nullChannel"))
void foo(String bar);
person Gary Russell    schedule 12.05.2020
comment
Поднимите вопрос: github.com/spring-projects/spring-integration/issues и мы подумаем об этом! - person Artem Bilan; 12.05.2020
comment
Спасибо, Гэри, это действительно то, что я делаю (хотя я делаю это позже, когда определяю, что ответа не ожидается ... это уже другая история). @ArtemBilan Я открыл github.com/spring-projects/spring-integration/issues/ 3280, спасибо! - person Mauro Molinari; 14.05.2020