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

dar*_*ipo 4 java spring spring-integration

我有两个问题,我找不到用于获得与文档中找到的'gateway'xml元素相同的效果的注释.当我解决了这个问题时,我无法弄清楚为什么我的网关永远不会回复!

所以我想出了这两个,并认为我会分享.

dar*_*ipo 6

这是我定义网关类的方法:

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

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

这为您提供了一个异步服务方法(processMessage),消息中的Object类可以是您喜欢的任何服务类.@Header使您的服务方法能够将标题值(使用键"headerKey"和值neededHeader)附加到processMessage调用生成的消息中.

要识别此组件,我需要在MyConfig.java类中添加以下注释:

@Configuration
@ComponentScan
@EnableIntegration
@IntegrationComponentScan
Run Code Online (Sandbox Code Playgroud)

好的,最后这个问题从网关获得回复.事实证明,网关的回复机制取决于消息头中传递的一些令牌.因此,如果您的服务涉及一些消息转换,每个消息转换将组成一个新消息,例如MessageBuilder,则原始请求的响应令牌将丢失!即使您在转换中使用".fromMessage(inboundMessage)",它仍将丢失.保留值所需的是"copyHeaders"方法.我将在下面给出我的例子,这是一个变压器类型:

m1 = MessageBuilder
    .withPayload(transformedOutboundPayload)
    .copyHeaders(messageIn.getHeaders())
    .setHeader("headerKey", transformedHeaderValue)
    .build();
Run Code Online (Sandbox Code Playgroud)

在所有情况下都不需要设置标题行,我需要它,因为我的变换器正在修改有效负载和标头.

好的,我希望这有助于某人!

  • &gt;每个都会用例如MessageBuilder的响应来组成一条新消息,这是我们通常建议使用POJO编程模型而不直接访问诸如MessageBuilder之类的框架类的原因之一-这样框架将负责所有正确的标题维护。 (2认同)