我正在使用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?
答案 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-reply
(AbstractReplyProducingMessageHandler
),它也无济于事,因为你不知道如何处理该回复后中流gateway
。仅仅因为你的主流是one-way
。
你必须重新考虑你的设计,并试图摆脱那个中流网关。我看到你试图用retryAdvice()
制作一些逻辑。
但是如何将其移至.handle(new JsonHandler())
而不是错误的.gateway()
?