调用网关结果在成功时永远不会返回调用方

时间:2015-08-04 15:42:40

标签: spring-integration

我正在使用Spring Integration DSL并拥有一个简单的网关:

@MessagingGateway(name = "eventGateway", defaultRequestChannel = "inputChannel")
public interface EventProcessorGateway {
  @Gateway(requestChannel="inputChannel")
  public void processEvent(Message message)
}

我的春季整合流程定义为:

@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是一个简单的AbstractTransformer,它可以转换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)
}

我希望整个调用和处理是同步的,并且发生任何错误都会被捕获,因此我可以适当地处理它们。对网关的调用工作,消息通过Transformer和Handler发送,处理,如果发生Exception,它会回弹并被捕获并调用logError()。但是,如果调用成功,则永远不会发生对logSuccess()的调用。就像处理程序处理消息并且永不返回一样,执行停止/挂起。我不需要实际得到任何回复,如果某些事情无法处理,我会更加担心。我是否需要将某些内容发送回最初的EventProcessorGateway?

1 个答案:

答案 0 :(得分:1)

您的问题在这里:

return IntegrationFlows.from("json")
    .gateway(retryGatewayChannel(), e -> e.advice(retryAdvice()))
    .get();

其中.gateway()request/reply,因为它是主要流程的一部分。 它与<gateway>中的<chain>类似。

所以,即使你的主流是单向的,使用.gateway()里面需要你的子流回复一些,但是这个:

        .handle(new JsonHandler())
        .get();

不这样做。

因为它是one-way MessageHandler

从另一方面来说,即使你将最后一个作为request-replyAbstractReplyProducingMessageHandler),它也无济于事,因为你不知道如何处理该回复后中流gateway。仅仅因为你的主流是one-way

你必须重新考虑你的设计,并试图摆脱那个中流网关。我看到你试图用retryAdvice()制作一些逻辑。 但是如何将其移至.handle(new JsonHandler())而不是错误的.gateway()