RabbitMQ:路由密钥+队列+延迟

时间:2015-01-15 14:39:30

标签: java queue rabbitmq consumer producer

我有一个制作人如下:

public class MyProducer {

private static final String EXCHANGE_NAME = "messages";

public static void main(String[] argv)
              throws java.io.IOException {

    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.exchangeDeclare(EXCHANGE_NAME, "direct");

    String color1 = "red"
    String message1 = "message1"

    String color2 = "blue"
    String message2 = "message2"

    channel.basicPublish(EXCHANGE_NAME, color1, null, message1);
    channel.basicPublish(EXCHANGE_NAME, color2, null, message2);

    channel.close();
    connection.close();
}
}

还有消费者:

public class MyConsumer {

private static final String EXCHANGE_NAME = "messages";

public static void main(String[] argv)
              throws java.io.IOException,
              java.lang.InterruptedException {

    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.exchangeDeclare(EXCHANGE_NAME, "direct");
    String queueName = channel.queueDeclare().getQueue();


    channel.queueBind(queueName, EXCHANGE_NAME, "color1");
    channel.queueBind(queueName, EXCHANGE_NAME, "color2");


    QueueingConsumer consumer = new QueueingConsumer(channel);
    channel.basicConsume(queueName, true, consumer);

}

}

我现在的问题是:

  1. 我现在只有一个名为" queuName"的队列或者我有两个名为" color1"和" color2"?
  2. 我不想立刻消费这些消息。所以我想要的是为每个队列设置一个延迟" color1"和" color2"。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

问题-1)我现在只有一个名为“queuName”的队列,或者我有两个名为“color1”和“color2”的队列?

答案:你必须要经过教程

https://www.rabbitmq.com/getstarted.html

基于你决定如何创建队列以及哪些交换类型[直接,主题,标题和扇出]符合您的要求,或者有时它不需要交换..所以首先看教程然后基于你的要求决定。

问题-2)我不想立即使用消息。所以我想要的是为每个队列“color1”和“color2”设置一个延迟。我怎样才能做到这一点?

答案:因为你必须编写自己的逻辑来延迟消费者从兔子那里找到信息,你也可以通过线程。

享受Rabbit编程:)

答案 1 :(得分:0)

对于你的第一个问题,答案是"两者都没有。"您的代码显示您声明一个随机命名的队列,并将服务器名称分配给变量queueName

  

String queueName = channel.queueDeclare()。getQueue();

您对"color1""color2"的使用是您创建的随机队列上的绑定密钥(请参阅this page)。如果目的是声明一个特定名称的队列,我相信需要作为参数传递给queueDeclare函数(虽然我不熟悉这个特定的库)。

对于您的第二个问题,如果您不想立即使用消息,那么您就不必这样做了。相反,您可以在需要时启动消费者。没有人强迫你将它放在queueDeclare方法正下方的程序中。我无法列出实现这一目标的具体方法,因为可能有多少你能想到的。