在 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 + EasyMock做Java单元测试