Spring integration 对网关结果的调用在成功时不会返回给调用方

Spring integration 对网关结果的调用在成功时不会返回给调用方,spring-integration,Spring Integration,我使用的是Spring Integration DSL,有一个简单的网关: @MessagingGateway(name = "eventGateway", defaultRequestChannel = "inputChannel") public interface EventProcessorGateway { @Gateway(requestChannel="inputChannel") public void processEvent(Message message) } 我

我使用的是Spring Integration DSL,有一个简单的网关:

@MessagingGateway(name = "eventGateway", defaultRequestChannel = "inputChannel")
public interface EventProcessorGateway {
  @Gateway(requestChannel="inputChannel")
  public void processEvent(Message message)
}
我的spring集成流定义为:

@Bean MessageChannel inputChannel() { return new DirectChannel(); }

@Bean MessageChannel errorChannel() { return new DirectChannel(); }

@Bean MessageChannel retryGatewayChannel() { return new DirectChannel(); }

@Bean MessageChannel jsonChannel() { return new DirectChannel(); }

@Bean
public IntegrationFlow postEvents() {
    return IntegrationFlows.from(inputChannel())
            .route("headers.contentType", m -> m.channelMapping(MediaType.APPLICATION_JSON_VALUE, "json")
            )
            .get();
}

@Bean
public IntegrationFlow retryGateway() {
    return IntegrationFlows.from("json")
        .gateway(retryGatewayChannel(), e -> e.advice(retryAdvice()))
        .get();
}

@Bean
public IntegrationFlow transformJsonEvents() {
    return IntegrationFlows
            .from(retryGatewayChannel())
            .transform(new JsonTransformer())
            .handle(new JsonHandler())
            .get();
}
JsonTransformer是一个简单的抽象转换器,用于转换JSON数据并将其传递给JsonHandler

class JsonHandler extends AbstractMessageHandler {
  public void handleMessageInternal(Message message) throws Exception {
    // do stuff, return nothing if success else throw Exception
  }
}
我通过以下代码调用网关:

try {
  Message<List<EventRecord>> message = MessageBuilder.createMessage(eventList, new MessageHeaders(['contentType': contentType]))
  eventProcessorGateway.processEvent(message)
  logSuccess(eventList)
} catch (Exception e) {
  logError(eventList)
}
试试看{
Message Message=MessageBuilder.createMessage(事件列表,新消息头(['contentType':contentType]))
processEvent(消息)
日志成功(事件列表)
}捕获(例外e){
日志错误(事件列表)
}
我希望整个调用和处理是同步的,并且捕获发生的任何错误,以便我能够适当地处理它们。对网关的调用起作用,消息通过转换器发送到处理程序,并进行处理。如果发生异常,它会冒泡返回并被捕获,并调用logError()。但是,如果调用成功,则对logSuccess()的调用永远不会发生。这就像处理程序处理消息后执行停止/挂起,并且永远不会返回。我实际上不需要得到任何回应,我更关心的是,如果有什么东西无法处理。是否需要将某些内容发送回初始EventProcessorGateway?

您的问题在这里:

return IntegrationFlows.from("json")
    .gateway(retryGatewayChannel(), e -> e.advice(retryAdvice()))
    .get();
其中,
.gateway()
request/reply
,因为它是主流程的一部分。 它类似于
中的

因此,即使您的主流是单向的,也可以在内部使用
.gateway()
,这需要您的子流提供一些回复,但这一条:

        .handle(new JsonHandler())
        .get();
他不会那样做的

因为它是单向的
MessageHandler

从另一个角度看,即使您将最后一个作为
请求-回复
AbstractReplyProducingMessageHandler
),它也不会帮助您,因为您不知道在中间流
网关
之后如何处理该回复。因为您的主要流程是单向的

你必须重新考虑一下你的设计,试着摆脱中流网关。我看到您尝试使用
retryAdvice()
来建立一些逻辑。
但是,如何将其移动到
.handle(new JsonHandler())
而不是错误的
.gateway()

我使用了retryGateway(),因为我没有意识到我可以直接将建议添加到流中。现在我看到我可以将它与处理程序一起添加:
@Bean public IntegrationFlow transformJsonEvents(){return IntegrationFlows.from(“json”).transform(new TestTransformer()).handle(new TestHandler(),m->m.advice(retryAdvice()).get();}
您还可以在在线网关上将
replyTimeout
设置为0,以释放线程,因为不会返回任何回复。但是@Artem的建议更好;为了完整起见,我在这里添加了这个。