1

我发现了一个我不完全理解的 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 从持久 DB 状态生成一个人的数据消息到字符串消息。首先是需要什么信息的信息。它是通过外部 REST 服务提供的。结果是一个TransferRequest实体。由此必须生成消息:另一个外部 REST 服务调用以转换TransferRequest为某种DataMessage所需的数据消息。一旦 TCP/IP 客户端连接,该结果将通过 TCP/IP 服务器传递。

编辑 2

消息通道是:从对外部服务的请求“http://myRest/transfer/next”开始,获取TransferRequest(包含一个personId),将其作为消息推送到通道中,transformer/handler 以请求(另一个)外部服务“ http://myRest/message/{personId}",获取DataMessage,将其作为消息推送到另一个通道,处理程序将消息推送到 TcpOutboundGateway 以被外部系统接收。

4

2 回答 2

0

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

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

你可能需要考虑用这样的替换你@ServiceActivatorhandle()

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

注意:您可能不需要该频道,它们IntegrationFlow会为您处理。

可能你更多地挖掘 Spring Integration Reference Manual 以了解通道适配器、网关和 DSL 的概念。

于 2021-09-01T13:30:23.617 回答
0

like this?

 @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";
        }

    };

}
于 2021-09-01T04:04:08.493 回答