RabbitMQ:路由键+队列+延迟

RabbitMQ: Routing key + queue + delay

我有如下制作人:

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"设置一个延迟。我怎样才能做到这一点?

问题-1) 我现在只有一个 queue 名为 "queuName" 还是我有两个 queue 名为 "color1" 和 "color2"?

回答:你必须完成教程

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

根据您决定如何创建 queue 以及哪些交换类型 [直接、主题、headers 和扇出] 符合您的要求,或者有时不需要交换。 .所以先看教程然后根据你的要求决定。

问题2)我不想立即消费消息。所以我想要的是为每个 queue "color1" 和 "color2" 设置一个延迟。我怎样才能做到这一点?

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

享受兔子编程:)

对于您的第一个问题,答案是 "neither." 您的代码显示您声明了一个随机命名的队列并将服务器命名的任何内容分配给变量 queueName:

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

您对 "color1""color2" 的使用是作为您创建的随机队列上的绑定键(参见 this page)。如果打算声明一个特定名称的队列,我认为需要将其作为参数传递给 queueDeclare 函数(尽管我不熟悉这个特定的库)。

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