Spring integration 对网关结果的调用在成功时不会返回给调用方
我使用的是Spring Integration DSL,有一个简单的网关: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) } 我
@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的建议更好;为了完整起见,我在这里添加了这个。