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

Posted

技术标签:

【中文标题】在 Spring 集成中,如何仅使用 java 注释配置消息网关,并确保网关看到回复【英文标题】:In spring integration how to configure a message gateway with java annotations only, and make sure the gateway sees the reply 【发布时间】:2015-10-19 11:05:01 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

@Configuration
@ComponentScan
@EnableIntegration
@IntegrationComponentScan

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

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

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

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

【讨论】:

>will each compose a new message with for example MessageBuilder the response 这就是为什么我们通常建议使用 POJO 编程模型而不是直接访问诸如 MessageBuilder 之类的框架类的原因之一 - 这样框架将处理所有正确的标头维护。

以上是关于在 Spring 集成中,如何仅使用 java 注释配置消息网关,并确保网关看到回复的主要内容,如果未能解决你的问题,请参考以下文章

在java Spring Boot中,如何在集成测试中将内存中的LDAPConnection对象传递给ldapService?

spring-web 集成 rabbitmq

如何使用Spring + EasyMock做Java单元测试

推荐学java——Spring集成MyBatis

Spring Data 配置和 Postgres 数据库集成(无 xml 配置)

Axon Framework - Spring Boot 集成