如何在 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";
        }

    };

}

可能在术语上有一些误解:

  1. 入站通道适配器是您的应用程序的入口点。我们可以称它为 server,它期待外部请求,你在下游做一些逻辑。 Http.inboundChannelAdapter 我们谈论的是 Spring MVC 控制器。
  2. 与入站网关不同,入站通道适配器是一种单向入口点。因此,外部调用者 - REST 服务不会收到回复(响应)。
  3. 另一个误解可能来自误导性的 属性 名称。尽管它们仍然有效。 requestPayloadType 是在该入站通道适配器中对 HTTP 请求主体进行转换的原因,并且此数据将被打包到要发送到该 transfer_next_channel 的消息的有效负载中。

您可能需要考虑用这样的 handle() 替换您的 @ServiceActivator

 .channel("transfer_next_channel")
 .<TransferRequest>handle((p, h) -> )
 .get();

注意:您可能不需要中间的频道,IntegrationFlow 会为您处理。

可能您会进一步挖掘 Spring 集成参考手册以了解通道适配器、网关和 DSL 的概念。