如何在 Spring Integration 中使用 JAVA 配置来配置 http 入站通道适配器?

问题描述 投票:0回答:2

我发现了一个 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 以由外部系统接收。

java spring spring-integration spring-integration-http
2个回答
2
投票

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

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

您可能需要考虑将

@ServiceActivator
替换为
handle()
,如下所示:

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

注意:您可能不需要中间的通道,

IntegrationFlow
会为您解决这个问题。

可能您需要深入研究 Spring Integration Reference Manual 以了解通道适配器、网关和 DSL 的概念。


0
投票

像这样吗?

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

    };

}
© www.soinside.com 2019 - 2024. All rights reserved.