当前位置: 首页 > 知识库问答 >
问题:

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

薛泰
2023-03-14

我发现了一个xml配置的入站适配器示例,但我并不完全理解。配置指定REST请求设置请求方法、使用的格式等。

我认为,从Spring集成的角度来看,响应应该更加重要,因为响应实际上是为消息通道提供信息的。我说得对吗?

HTTP入站适配器用作消息endpoint(实际上是消息起始点),它调用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状态生成一个人的数据消息到String消息。首先有需要什么消息的信息。它是通过外部REST服务提供的。结果是一个TransferRequest实体。由此必须生成消息:另一个外部REST服务调用将TransferRequest转换为某种DataMessage,即所需的数据消息。一旦TCP/IP客户端连接,该结果将通过TCP/IP服务器交付。

编辑2

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

共有2个答案

汪晨
2023-03-14

像这样?

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

    };

}
云锦
2023-03-14

可能在术语方面存在一些误解:

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

您可能需要考虑将您的@ServiceActivator替换为句柄(),如下所示:

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

注意:您可能不需要中间的通道,IntegrationFlow将为您解决这一问题。

您可能需要更多地阅读Spring集成参考手册以了解通道适配器、网关和DSL的概念。

 类似资料:
  • 如何通过注释而不是常规配置文件配置入站通道适配器?我可以为会话工厂定义bean,如下所示: 如何配置通过注释下给出的入站通道适配器? 我正在寻找的是在应用程序启动时连接所有bean,然后公开一些方法来开始轮询服务器,处理它们,然后从本地删除它们,类似于 其中getPollableChannel()为我提供了用于轮询的bean。

  • 问题内容: 入站和出站通道适配器之间的根本区别是什么? 任何示例都将非常有帮助。 我已经查看过Spring文档,这种“方向性”的区别对我来说还不清楚。我支持配置了outbound-channel-adapter的应用程序,但是我发现使用 出站 标签可以直观地了解行为计数器。该适配器获取一个外部文件,然后 将其 引入应用程序中, 在 该应用程序中我们解析文件并保留数据。 这类似于这个问题,但是我想更

  • 我试图将从Quickfix读取消息(读取修复消息)配置到spring集成中。我知道我可以使用入站通道适配器从外部源(如QuickFix)读取数据。您能提供如何编写事件驱动入站通道适配器的示例吗?我有以下配置不起作用

  • 问题内容: Spring Integration FTP中的入站通道适配器和出站通道适配器之间有什么区别?我应该使用哪一个?何时使用? 我从文档中了解到,出站可以发送任何类型的文件(例如byte [],String,java.io.File),但入站仅限于文件类型。那仅仅是区别还是其他? 问题答案: 我建议您首先阅读理论 。 任何Inbound适配器都旨在从外部系统获取数据。Outbound-放置