Работает ли Spring Integration ServiceActivator с типами Project Reactor? - PullRequest
0 голосов
/ 27 мая 2019

Я использую Spring Integration 5.1.5 (с RabbitMQ, используя spring-integration-amqp), и я прочитал в документах , что Spring Integration поддерживает типы проектный реактор (этимЯ имею в виду Mono, Flux и т. Д.).Но я не могу заставить это работать для ServiceActivator .Я пытаюсь что-то вроде этого:

@ServiceActivator
public Mono<Void> myMethod(List<Message> messages) {
   Mono<Void> result = myService.doServiceStuff(messages);
   return result;
}

(обратите внимание, что я также пытаюсь заставить myMethod работать с Flux<Message>, но это отдельная проблема).

Когда myMethod возвращает Mono<Void> Я получаю эту ошибку:

Caused by: org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:426)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.doProduceOutput(AbstractMessageProducingHandler.java:284)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:265)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:223)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:129)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:162)
    ... 42 common frames omitted

Изменение метода на:

@ServiceActivator
public void myMethod(List<Message> messages) {
   Mono<Void> result = myService.doServiceStuff(messages);
   result.subscribe(); // This is not what I want to do
}

и подписка на реактивный поток вручнуюзаставить это работать, однако это явно не то, что я хочу сделать.Я предпочел бы ожидать, что spring-integration Framework будет обрабатывать подписку.

Поддерживается ли это в Spring Integration?Если так, что я делаю не так?

1 Ответ

1 голос
/ 28 мая 2019

Что именно вы пытаетесь достичь, возвращая Mono<Void>?

Когда метод активатора службы возвращает какое-либо значение, это значение отправляется в выходной канал. Когда это Mono<?>, отправка выполняется после завершения моно.

Просто установите тип возврата на void.

...