为什么Sender不在RabbitMQ中向队列发送数据?

时间:2014-09-24 10:03:50

标签: rabbitmq spring-amqp

我已经实现了RabbitMQ并且卡在一个地方,好像我的发送者无法向队列发送任何数据。

我的制片人课程:

@Service
public class MessageSender {

@Autowired
private AmqpTemplate template;

public void send(String text) {
    template.convertAndSend(text);
 }
}

我的spring配置文件如下所示:

<rabbit:connection-factory id="connectionFactory"
                           addresses="${connectionFactory.addresses}" channel-cache-size="${connectionFactory.channel-cache-size}"
                           virtual-host="${connectionFactory.vhost}" username="${connectionFactory.user}"
                           password="${connectionFactory.password}" />

<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" queue="myQueue" exchange="myExchange" routing-key="dummyKey"/>

<rabbit:queue name="myQueue" />

<rabbit:direct-exchange name="myExchange">
    <rabbit:bindings>
        <rabbit:binding queue="myQueue" />
    </rabbit:bindings>
</rabbit:direct-exchange>

<rabbit:listener-container connection-factory="connectionFactory">
    <rabbit:listener ref="messageHandler" method="onMessage" queue-names="myQueue" />
</rabbit:listener-container>

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

<bean id="messageHandler" class="com.tm.email.sender.spring.MessageHandler" />

我无法找出问题所在。

下面提到的东西很完美。我可以轻松地将消息推送到队列,然后我的发送者类完全正常。

public class Send {
private final static String QUEUE_NAME = "myQueue";
public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();
    int i = 0;
    while(i < 10000){
        HashMap message = new HashMap();
        message.put("message number", i);
        channel.basicPublish("", QUEUE_NAME, null, SerializationUtils.serialize(message));
        i++;
    }
    channel.close();
    connection.close();
  }
}

1 个答案:

答案 0 :(得分:4)

routing-key="dummyKey"定义中有默认 <rabbit:template>。这意味着您的template.convertAndSend(text);会通过myExchange路由密钥向dummyKey发送消息。

由于您没有通过binding通过myQueuedummyKey提供"",您的邮件就会丢失。

从原始AMQP代码中,您只需使用默认routing-key为每个队列发送消息到默认Exchange(AmqpTemplate) - 其名称。

对于听众来说,消息在队列中的出现位置和方式并不重要。 这就是为什么第二个&#39;发送&#39;变体效果很好。

因此,要使用<rabbit:binding queue="myQueue" key="dummyKey"/> 修复您的用例,您必须添加以下内容:

{{1}}