我发现了一个 xml 配置的入站适配器示例,我不完全理解。配置指定了REST请求设置请求方式、消费格式等
我认为从 Spring Integration 的角度来看,响应应该更加重要,因为响应是实际馈送消息通道的内容。我说得对吗?
HTTP 入站适配器用作消息端点(实际上是消息起点),它调用 HTTP 请求 - REST 服务的 URL,比方说“http://myRest/transfer/next” - 向 SI 消息通道提供其结果。是这样吗?
很难找到一个例子,或者很难将其他例子转化为满足我的需求的东西。甚至更多的例子都是 XML 配置的,而我想用 Java 或 Dsl 配置。
我正在寻找一个示例,其中调用 REST 服务(我将提供),该服务返回我的
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 将一个人的数据消息从持久数据库状态生成为字符串消息。首先是需要什么消息的信息。它是通过外部 REST 服务提供的。结果是一个
TransferRequest
实体。由此必须生成消息:另一个外部 REST 服务调用,将 TransferRequest
转换为某种 DataMessage
,即所需的数据消息。一旦 TCP/IP 客户端连接,该结果将通过 TCP/IP 服务器传送。
编辑2
消息通道是:以向外部服务请求“http://myRest/transfer/next”开始,获取
TransferRequest
(包含personId
),将其作为消息推送到通道中,转换器/处理程序请求(另一个)外部服务“http://myRest/message/{personId}”,获取 DataMessage
,将其作为消息推送到另一个通道,处理程序将消息推送到 TcpOutboundGateway 以由外部系统接收。
可能在术语上存在一些误解:
server
,它期待外部请求,并且您在下游执行一些逻辑。通过 Http.inboundChannelAdapter
,我们谈论 Spring MVC 控制器。requestPayloadType
负责在入站通道适配器中对 HTTP 请求正文进行转换,并且此数据将被打包到要发送到该 transfer_next_channel
的消息的有效负载中。您可能需要考虑将
@ServiceActivator
替换为 handle()
,如下所示:
.channel("transfer_next_channel")
.<TransferRequest>handle((p, h) -> )
.get();
注意:您可能不需要中间的通道,
IntegrationFlow
会为您解决这个问题。
可能您需要深入研究 Spring Integration Reference Manual 以了解通道适配器、网关和 DSL 的概念。
像这样吗?
@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";
}
};
}