如何在 Spring 集成中使用 JAVA 配置配置 http 入站通道适配器?
How do I configure a http inbound channel adapter with JAVA config in Spring Integration?
我找到了一个 xml 配置的入站适配器示例,我不完全理解。配置指定REST请求设置请求方式、消费格式等
我认为从 Spring 集成的角度来看,响应应该更为重要,因为响应实际上是在为消息通道提供信息。我说得对吗?
HTTP 入站适配器用作调用 HTTP 请求的消息端点(实际上是消息起点)- REST 服务的 URL,比方说“http://myRest/transfer/next”-将其结果提供给 SI 消息通道。是吗?
要么很难找到一个例子,要么很难将其他例子转化为满足我需要的东西。更多的示例是 XML 配置的,而我想配置 Java 或 Dsl.
我正在寻找一个调用 REST 服务(我将提供)的示例,其中 returns 我的 TransferRequest
对象的 JSON 表示被馈送到要由消息处理程序处理的 SI 通道“transfer_next_channel”。
我的代码方法很像骨架。我必须做什么?
@Bean
public IntegrationFlow httpInboundFlow() {
return IntegrationFlows
.from(Http.inboundChannelAdapter("http://myRest/transfer/next")
.requestMapping(r -> r
.methods(HttpMethod.GET)
.consumes("text/html"))
.requestPayloadType(TransferRequest.class)
.headerMapper(myHeaderMapper)
)
.channel("transfer_next_channel")
.get();
}
@Bean
@ServiceActivator(inputChannel = "transfer_next_channel")
public MessageHandler handler() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
System.out.println("myHandler: " + message.getPayload());
System.out.println("myHandler: " + message.getHeaders());
}
};
}
编辑 1
整个事情就是通过TCP/IP生成一个人的数据消息,从持久化DB状态到String消息。首先是需要什么消息的信息。它通过外部 REST 服务提供。结果是一个 TransferRequest
实体。由此必须生成消息:另一个外部 REST 服务调用将 TransferRequest
转换为某种 DataMessage
,所需的数据消息。一旦 TCP/IP 客户端连接,该结果将通过 TCP/IP 服务器传送。
编辑 2
消息通道是:从请求“http://myRest/transfer/next”开始到外部服务,得到TransferRequest
(包含一个personId
),将其作为消息推送到通道,transformer/handler 请求(另一个)外部服务“http://myRest/message/{personId}”,获取 DataMessage
,将其作为消息推送到另一个通道,处理程序推送消息进入 TcpOutboundGateway 以供外部系统接收。
像这样?
@Bean
public IntegrationFlow httpInboundFlow() {
return IntegrationFlows
.from(Http.inboundGateway("/demo")
.replyChannel("reply")
.requestMapping(r -> r.methods(HttpMethod.GET))
.requestPayloadType(String.class)
)
.channel("next")
.get();
}
@Bean
public MessageChannel reply() {
return new QueueChannel();
}
@Bean
@ServiceActivator(inputChannel = "next",outputChannel = "reply")
public Function<Message<?>, String> handler() {
return new Function<Message<?>, String>() {
public String apply(Message<?> message) throws MessagingException {
System.out.println("myHandler: " + message.getPayload());
System.out.println("myHandler: " + message.getHeaders());
return "ok";
}
};
}
可能在术语上有一些误解:
- 入站通道适配器是您的应用程序的入口点。我们可以称它为
server
,它期待外部请求,你在下游做一些逻辑。 Http.inboundChannelAdapter
我们谈论的是 Spring MVC 控制器。
- 与入站网关不同,入站通道适配器是一种单向入口点。因此,外部调用者 - REST 服务不会收到回复(响应)。
- 另一个误解可能来自误导性的 属性 名称。尽管它们仍然有效。
requestPayloadType
是在该入站通道适配器中对 HTTP 请求主体进行转换的原因,并且此数据将被打包到要发送到该 transfer_next_channel
的消息的有效负载中。
您可能需要考虑用这样的 handle()
替换您的 @ServiceActivator
:
.channel("transfer_next_channel")
.<TransferRequest>handle((p, h) -> )
.get();
注意:您可能不需要中间的频道,IntegrationFlow
会为您处理。
可能您会进一步挖掘 Spring 集成参考手册以了解通道适配器、网关和 DSL 的概念。
我找到了一个 xml 配置的入站适配器示例,我不完全理解。配置指定REST请求设置请求方式、消费格式等
我认为从 Spring 集成的角度来看,响应应该更为重要,因为响应实际上是在为消息通道提供信息。我说得对吗?
HTTP 入站适配器用作调用 HTTP 请求的消息端点(实际上是消息起点)- REST 服务的 URL,比方说“http://myRest/transfer/next”-将其结果提供给 SI 消息通道。是吗?
要么很难找到一个例子,要么很难将其他例子转化为满足我需要的东西。更多的示例是 XML 配置的,而我想配置 Java 或 Dsl.
我正在寻找一个调用 REST 服务(我将提供)的示例,其中 returns 我的 TransferRequest
对象的 JSON 表示被馈送到要由消息处理程序处理的 SI 通道“transfer_next_channel”。
我的代码方法很像骨架。我必须做什么?
@Bean
public IntegrationFlow httpInboundFlow() {
return IntegrationFlows
.from(Http.inboundChannelAdapter("http://myRest/transfer/next")
.requestMapping(r -> r
.methods(HttpMethod.GET)
.consumes("text/html"))
.requestPayloadType(TransferRequest.class)
.headerMapper(myHeaderMapper)
)
.channel("transfer_next_channel")
.get();
}
@Bean
@ServiceActivator(inputChannel = "transfer_next_channel")
public MessageHandler handler() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
System.out.println("myHandler: " + message.getPayload());
System.out.println("myHandler: " + message.getHeaders());
}
};
}
编辑 1
整个事情就是通过TCP/IP生成一个人的数据消息,从持久化DB状态到String消息。首先是需要什么消息的信息。它通过外部 REST 服务提供。结果是一个 TransferRequest
实体。由此必须生成消息:另一个外部 REST 服务调用将 TransferRequest
转换为某种 DataMessage
,所需的数据消息。一旦 TCP/IP 客户端连接,该结果将通过 TCP/IP 服务器传送。
编辑 2
消息通道是:从请求“http://myRest/transfer/next”开始到外部服务,得到TransferRequest
(包含一个personId
),将其作为消息推送到通道,transformer/handler 请求(另一个)外部服务“http://myRest/message/{personId}”,获取 DataMessage
,将其作为消息推送到另一个通道,处理程序推送消息进入 TcpOutboundGateway 以供外部系统接收。
像这样?
@Bean
public IntegrationFlow httpInboundFlow() {
return IntegrationFlows
.from(Http.inboundGateway("/demo")
.replyChannel("reply")
.requestMapping(r -> r.methods(HttpMethod.GET))
.requestPayloadType(String.class)
)
.channel("next")
.get();
}
@Bean
public MessageChannel reply() {
return new QueueChannel();
}
@Bean
@ServiceActivator(inputChannel = "next",outputChannel = "reply")
public Function<Message<?>, String> handler() {
return new Function<Message<?>, String>() {
public String apply(Message<?> message) throws MessagingException {
System.out.println("myHandler: " + message.getPayload());
System.out.println("myHandler: " + message.getHeaders());
return "ok";
}
};
}
可能在术语上有一些误解:
- 入站通道适配器是您的应用程序的入口点。我们可以称它为
server
,它期待外部请求,你在下游做一些逻辑。Http.inboundChannelAdapter
我们谈论的是 Spring MVC 控制器。 - 与入站网关不同,入站通道适配器是一种单向入口点。因此,外部调用者 - REST 服务不会收到回复(响应)。
- 另一个误解可能来自误导性的 属性 名称。尽管它们仍然有效。
requestPayloadType
是在该入站通道适配器中对 HTTP 请求主体进行转换的原因,并且此数据将被打包到要发送到该transfer_next_channel
的消息的有效负载中。
您可能需要考虑用这样的 handle()
替换您的 @ServiceActivator
:
.channel("transfer_next_channel")
.<TransferRequest>handle((p, h) -> )
.get();
注意:您可能不需要中间的频道,IntegrationFlow
会为您处理。
可能您会进一步挖掘 Spring 集成参考手册以了解通道适配器、网关和 DSL 的概念。