在 spring 集成中如何仅使用 java 注释配置消息网关,并确保网关看到回复

In spring integration how to configure a message gateway with java annotations only, and make sure the gateway sees the reply

我有两个问题,我找不到要使用什么注释 获得与文档中的 'gateway' xml 元素相同的效果。当我解决那个问题时,我无法弄清楚为什么我的网关从不回复!

所以我想出了这些,并认为我会分享。

这是我定义网关的方式 class:

@MessagingGateway(defaultRequestChannel = "inChan", defaultReplyChannel = "outChan" )    
public interface CalAmpSIRouteAndProcessService {

    @Gateway(requestChannel = "inChan", replyChannel = "outChan" )
    Future<CalAmpSIWrapper> processMessage(Object message, @Header("headerKey") String neededHeader);
}

这给你一个异步服务方法(processMessage),消息中的Objectclass可以是任何你喜欢的服务class。 @Header 使您的服务方法能够将 header 值(具有键 "headerKey" 和需要的值 Header)附加到 processMessage 调用生成的消息。

为了识别这个组件,我需要在我的 MyConfig.java class:

@Configuration
@ComponentScan
@EnableIntegration
@IntegrationComponentScan

好的,这个问题终于得到了网关的回复。原来网关的回复机制依赖于消息header中传递的一些token。因此,如果您的服务涉及一些消息转换,每个消息转换都会使用例如 MessageBuilder 组成一条新消息,那么原始请求的响应令牌将丢失!即使您在转换中使用“.fromMessage(inboundMessage)”,它仍然会丢失。保留该值所需的是 "copyHeaders" 方法。我将在下面给出我的示例,这是针对变压器类型的:

m1 = MessageBuilder
    .withPayload(transformedOutboundPayload)
    .copyHeaders(messageIn.getHeaders())
    .setHeader("headerKey", transformedHeaderValue)
    .build();

set header 行在所有情况下都不是必需的,我需要它,因为我的转换器正在修改有效负载和 header。

好的,我希望这对某人有所帮助!