Spring amqp不向队列发布消息,而是向Exchange发布消息

时间:2022-10-25 20:02:09

I am trying to test & benchmark spring-amqp for RabbitMQ with multiple queues so I was creating rabbit template for each queue and using it to send message. The message sent is successful and I can see a message published in the exchange but I don't see anything in the queue. I am guessing it's very minor setting but can't figure it out.

我正在尝试使用多个队列测试和测试RabbitMQ的spring-amqp,因此我为每个队列创建了兔子模板并使用它来发送消息。发送的消息成功,我可以在交换机中看到一条消息,但我在队列中看不到任何内容。我猜这是非常小的设置,但无法弄明白。

This is my applicationContext.xml

这是我的applicationContext.xml

<bean id="banchmarkConnectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
        <constructor-arg ref="benchmarkAmqpHost"/>
        <property name="username" ref="benchmarkAmqpUser"/>
        <property name="password" ref="benchmarkAmqpPass"/>
        <property name="virtualHost" ref="benchmarkAmqpVHost"/>
        <property name="channelCacheSize" value="10"/>
</bean>
<rabbit:template id="benchmarkAmqpTemplate"
        connection-factory="banchmarkConnectionFactory"
        exchange="my_exchange"
        queue="BenchmarkQueue"
        routing-key="BenchmarkQueue" />
<rabbit:admin connection-factory="banchmarkConnectionFactory"/>
<rabbit:queue name="BenchmarkQueue" auto-delete="true" durable="false" auto-declare="true"/>

This is my code which uses the benchmarkAmqpTemplate to publish to the queue.

这是我的代码,它使用benchmarkAmqpTemplate发布到队列。

public class publishMessage {
    @Autowired
    private RabbitTemplate benchmarkAmqpTemplate;

    protected void publish(String payload) {
        benchmarkAmqpTemplate.setQueue("BenchmarkQueue");
        benchmarkAmqpTemplate.convertAndSend("my_exchange", "BenchmarkQueue", payload);

    }
}

When I used the HelloWorld example it did publish a message in the queue so was wondering if I am doing something wrong. UPDATE I was able to solve this by adding direct-exchange tag in my context xml. My full xml looks like this:

当我使用HelloWorld示例时,它确实在队列中发布了一条消息,所以想知道我是否做错了什么。更新我能够通过在我的上下文xml中添加direct-exchange标记来解决这个问题。我的完整xml看起来像这样:

    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

<bean id="banchmarkConnectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
            <constructor-arg ref="benchmarkAmqpHost"/>
            <property name="username" ref="benchmarkAmqpUser"/>
            <property name="password" ref="benchmarkAmqpPass"/>
            <property name="virtualHost" ref="benchmarkAmqpVHost"/>
            <property name="channelCacheSize" value="10"/>
    </bean>
    <rabbit:template id="benchmarkAmqpTemplate"
            connection-factory="banchmarkConnectionFactory"
            exchange="my_exchange"
            queue="BenchmarkQueue"
            routing-key="BenchmarkQueue" />
    <rabbit:admin connection-factory="banchmarkConnectionFactory"/>
    <rabbit:queue name="BenchmarkQueue" auto-delete="true" durable="false" auto-declare="true"/>
    <rabbit:direct-exchange name="my_exchange">
        <rabbit:bindings>
            <rabbit:binding queue="BenchmarkQueue" key="BenchmarkQueue" />
        </rabbit:bindings>
    </rabbit:direct-exchange>
</beans>

1 个解决方案

#1


Sorry, but it looks like you misunderstood AMQP protocol a bit.

对不起,但看起来你误解了AMQP协议。

The message is published to the Exchange with the proper routingKey. The publisher (RabbitTemplate) doesn't need to know about queues at all.

邮件将使用正确的routingKey发布到Exchange。发布者(RabbitTemplate)根本不需要知道队列。

The queue is a part of receiver, subscriber to the queue.

队列是接收器的一部分,是队列的订户。

There is one more feature in between - binding. The queue is bound to the Exchange under the appropriate routingKey. One queue can be bound to several exchanges with different routing keys. By default all queues are bound to the default exchange ("") with routingKeys equal to their names.

中间还有一个功能 - 绑定。队列在适当的routingKey下绑定到Exchange。一个队列可以绑定到具有不同路由密钥的多个交换机。默认情况下,所有队列都绑定到默认交换(“”),其中routingKeys等于其名称。

Please, refer for more info to the RabbitMQ site.

请参阅RabbitMQ网站了解更多信息。

#1


Sorry, but it looks like you misunderstood AMQP protocol a bit.

对不起,但看起来你误解了AMQP协议。

The message is published to the Exchange with the proper routingKey. The publisher (RabbitTemplate) doesn't need to know about queues at all.

邮件将使用正确的routingKey发布到Exchange。发布者(RabbitTemplate)根本不需要知道队列。

The queue is a part of receiver, subscriber to the queue.

队列是接收器的一部分,是队列的订户。

There is one more feature in between - binding. The queue is bound to the Exchange under the appropriate routingKey. One queue can be bound to several exchanges with different routing keys. By default all queues are bound to the default exchange ("") with routingKeys equal to their names.

中间还有一个功能 - 绑定。队列在适当的routingKey下绑定到Exchange。一个队列可以绑定到具有不同路由密钥的多个交换机。默认情况下,所有队列都绑定到默认交换(“”),其中routingKeys等于其名称。

Please, refer for more info to the RabbitMQ site.

请参阅RabbitMQ网站了解更多信息。