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

使用spring集成在Exchange中动态选择RabbitMq队列

公西飞鸾
2023-03-14

从生产者,我必须发送消息到一个RabbitMQ交换。此消息将包含特定的属性,例如队列名,基于此属性,我必须动态地决定发送此消息的队列。[队列从exchange绑定,发送此特定消息]。

有什么方法可以使用spring integration截获到达RabbitMQ交换的消息吗?目前,我有以下spring integration配置文件。

我不知道如何创建一个bean来获取Exchange消息,并将消息路由到smsQueue、emailQueue等队列。

感谢您的建议和答复。

http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd

http://www.springframework.org/schema/integration         
http://www.springframework.org/schema/integration/spring-integration.xsd      
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/integration/amqp
http://www.springframework.org/schema/integration/amqp/spring-integration-amqp.xsd
">

<context:annotation-config></context:annotation-config>
<context:component-scan base-package="com.rabbit"></context:component-scan>

<rabbit:connection-factory id="connectionFactory"
    host="localhost" username="guest" password="guest" />   
<rabbit:admin connection-factory="connectionFactory" />
<rabbit:template id="exchnageTemplate"
    connection-factory="connectionFactory" exchange="COMMUNICATION-EXCHANGE" />

<rabbit:queue id="smsQueue" auto-delete="true" durable="false" />
<rabbit:queue id="emailQueue" auto-delete="true" durable="false" />
<rabbit:queue id="dvbQueue" auto-delete="true" durable="false" />
<rabbit:queue id="pbxQueue" auto-delete="true" durable="false" />
<rabbit:queue id="medsensorQueue" auto-delete="true"
    durable="false" />


<int:gateway id="gateway" service-interface="com.rabbit.mq.ProducerGatewayInterface"
    default-request-channel="producerChannel" />

<int:channel id="producerChannel" />
<int:channel id="errorChannel" />

<bean id="communicationInterface" class="com.rabbit.mq.CommunicationInterface" />

<amqp:outbound-channel-adapter channel="producerChannel"
    amqp-template="exchnageTemplate" exchange-name="COMMUNICATION-EXCHANGE">
    <int:service-activator input-channel="input"
        ref="communicationInterface" method="optimalRoutingOfMessage" />
</amqp:outbound-channel-adapter>

共有1个答案

白学
2023-03-14

使用RabbitMQ(AMQP)时,您不发送到队列,而是发送到带有路由密钥的Exchange,绑定确定哪个队列获得消息。

<rabbit:direct-exchange name="si.test.exchange">
    <rabbit:bindings>
        <rabbit:binding queue="si_test_queue" key="si.test.binding" />
    </rabbit:bindings>
</rabbit:direct-exchange>

<int-amqp:outbound-channel-adapter
    channel="toRabbit" amqp-template="amqpTemplate" exchange-name="si.test.exchange"
    routing-key="si.test.binding" />

您可以使用routing-key代替routing-key-expressionheaders['foo']@somebean.derministeroutingkeyfor(payload)

 类似资料:
  • 一种方法是声明队列并将消息发布到该队列,并让所有使用者从该队列中消费。这将在不同的消费者之间分发消息。 我不清楚,如果上面的操作是正确的,或者最佳实践是将消息传递到Exchange而不是直接发布到队列。使用Exchange时,我必须确保在生产者创建Exchange之后声明队列,然后才开始发布消息。否则,没有队列接收到消息,并且消息将丢失。

  • 从表A中选择columnList=>Id1,Id2,Id3,Id4,ID5。 使用结果,我需要从表B中查询。 以下是案例 就像这个案子会变大一样。我想知道如何在Spring Data JPA中实现这一点。它类似于Spring Data JPA中的动态投影。 注意:存储在TableA中的列名在TableB中使用。 理由:如果我能做到这一点,它将很容易拉出数据,这只是我需要的。 我们能使用Criter

  • 我在 RabbitMQ 中创建新队列时遇到了一些问题。我只创建一个使用者客户端,该客户端将使用来自另一个微服务的消息。 这是我到目前为止所做的。 应用程序属性: 配置类: 和侦听器类: 当我运行这个程序时,我有一条ACCESS_REFUSED消息,但我不知道为什么。我错过了什么吗?? 谢谢

  • 我花了整整一天的时间来尝试让spring-AMQP示例项目在docker版本的RabbitMQ上运行。我只是在运行标准的rabbitmq Docker。虽然我没有连接问题,但我总是得到与创建队列相关的异常,并且我已经尝试了所有可能的变体,在这一点上。 我尝试在我的配置中声明队列,就像示例项目一样。我尝试显式配置RabbitAdmin。我已经尝试显式配置整个自动配置混乱。我在rabbitmq中创建了

  • 我使用直接交换,因为我希望一份工作分配给一个消费者。 有不同的消费者群体,他们将消费不同的工作。假设我的应用程序名为“foo”。然后我就有工作了 酒吧1 酒吧2 酒吧3.... 将有一组独立的消费者来处理“bar1”作业,然后是另一组消费者来处理“bar2”作业,依此类推 我试图找出任何特定的命名/路由结构是否有好处,但没有找到任何指向这种或那种方式的东西。 问题1)我应该使用多个交易所名称交易所

  • 我已经建立了一个rabbit集群,每当数据库中发生变化时,我都会将消息发布到fanout交换中。 我为使用这些更新的一些微服务绑定了专用队列,我最初还为外部客户端设置了专用队列,以便他们可以将其与自己的rabbit基础架构联合起来,并使用每条消息的副本。 现在,我想知道,允许exchange联合而不是为每个新的外部消费者创建新的专用队列是否是更好的方法,因为将有越来越多的用户加入。 有哪些利弊?

  • 我读过很多关于RabbitMQ中交换的文章。但我找不到任何有用的文章来解释每个交换的用例。他们所说的是 直接交换-绑定密钥和路由密钥应该相同。 主题交换-路由键应与绑定键的路由模式匹配。 扇出交换——所有绑定到特定交换的队列都将得到消息。 标题交换-标题应该与关键字匹配。 有人能详细解释它的每个交换和用法吗?

  • 问题内容: 我有以下问题。我的表格()结构如下: 存储不同表的名称,并在这些表中存储ID。我想做的是检查上述表中的行是否存储了对其他表的有效引用。因此,我需要从外部表中选择一行,其名称基于存储在中的字符串。我的代码不起作用,因为它存在语法错误,但清楚地显示了我想要实现的目标: 问题答案: 如果知道所有可能的表名,则可以使用条件语法来实现它: