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

Spring集成-通道适配器vs.网关(AMQP)

欧盛
2023-03-14

我对Spring集成中通道适配器和网关的差异感到困惑。正如@gary-russell在https://stackoverflow.com/a/29992267/467944中所述,通道适配器是非分布式的,而网关是双向的。如果是这种情况,为什么有amqp入站网关和amqp出站网关?

我最终要完成的是以下几点:

  1. 在控制器内接收到Http请求
  2. 将消息放在amqp队列上
  3. 消费者使用消息并将结果放入结果队列
  4. 结果到达控制器

所以我想我需要一个网关,它有一个从控制器调用的接口,并将有效负载放入amqp队列(配置为其请求通道),同时它在其回复通道上侦听其答案。然而,在这种配置下,我总是以一个

MessageDeliveryException: Dispatcher has no subscribers for channel 'application.fromRabbit'

其中fromRabibbit是我的回复队列。

共有2个答案

糜运良
2023-03-14

感谢gary russell提供的见解。我想我现在有了正确的配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration"
       xmlns:int-amqp="http://www.springframework.org/schema/integration/amqp"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/integration/amqp http://www.springframework.org/schema/integration/amqp/spring-integration-amqp.xsd
        http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
        http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!-- 'CLIENT' SIDE CONFIG -->
    <int:channel id="clientToRabbit" />
    <int:channel id="clientFromRabbit" />
    <int:gateway id="uppercaseGateway" service-interface="com.example.queuing.UpperCaseService" default-request-channel="clientToRabbit" />
    <int-amqp:outbound-gateway request-channel="clientToRabbit"  amqp-template="amqpTemplate" exchange-name="si.test.exchange" routing-key="si.test.binding" />


    <!-- 'SERVER' SIDE CONFIG -->
    <int:channel id="serverFromRabbit" />
    <int:channel id="serverToRabbit" />
    <int-amqp:inbound-gateway request-channel="serverFromRabbit" reply-channel="serverToRabbit" queue-names="si.test.queue" amqp-template="amqpTemplate" connection-factory="connectionFactory" />
    <int:service-activator input-channel="serverFromRabbit" output-channel="serverToRabbit" ref="upperCaseService" method="toUpperCase" />


    <!-- Infrastructure -->
    <rabbit:connection-factory id="connectionFactory" host="localhost" />

    <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" />

    <rabbit:admin connection-factory="connectionFactory" />

    <rabbit:queue name="si.test.queue" />
    <rabbit:direct-exchange name="si.test.exchange">
        <rabbit:bindings>
            <rabbit:binding queue="si.test.queue" key="si.test.binding" />
        </rabbit:bindings>
    </rabbit:direct-exchange>
</beans>
袁建木
2023-03-14

当问这样的问题时,您应该始终显示配置。

调度员没有订户...

这是一个配置错误,您没有正确连接集成流。

Spring集成中有两种类型的网关-

与外部系统接口的网关

它们为外部系统提供请求/应答语义。

入站网关用于服务器端请求/应答,其中服务器接收请求、执行某些处理并返回应答。

出站网关是客户端的等价物,客户端发送请求并等待回复。使用AMQP,我们有一个异步版本,其中回复返回到另一个线程。

消息网关

这些基于接口的网关从Java代码(而不是某些外部系统)提供网关(通常是请求/应答,但具有无效结果的方法是单向的)。

这使得遗留的java代码能够使用基于集成的流。

所以你可能。。。

controller -> gateway -> transformer(optional) -> amqp-outbound-gateway

...这是一种常见的模式,效果很好。

服务器端可能是

amqp-inbound-gateway -> service-activator

显示您的代码/配置,有人可以帮助调试您的配置问题。

 类似资料:
  • 这里排着队 但我用 使用请求/响应体系结构。它确实工作得很好,因为它提供了动态路由,手动创建tcp客户端。

  • 我正在开发一个Spring集成应用程序,我有一个地图列表,我需要将其插入到表格中。 我使用了jdbc: Outsport-网关或适配器将记录插入到表中。 但是如何使用jdbc:出站网关从我的地图列表中插入所有记录。

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

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

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

  • 使用Spring Integration Kafka,使用出站通道适配器,我尝试向名为“test”的主题发送消息 通过命令行终端,我启动了动物园管理员、kafka并创建了名为“test”的主题 Spring XML配置 JUnit测试代码 测试用例成功,在调试时,我发现channel.send()返回true 我使用下面的命令通过命令行检查了主题,但是我在测试主题中看不到任何消息。 bin/kaf