在Spring AMQP中根据其使用者计数使用队列

时间:2019-05-27 05:13:14

标签: java spring spring-boot rabbitmq spring-amqp

我希望一个队列一次只能由一个订户使用。因此,如果一个订户掉线,那么另一个订户将有机会订阅。

我正在寻找在Spring AMQP中执行此操作的正确方法。我基于RabbitMQ网站上的示例,使用纯Java进行了此操作。我被动地声明队列,检查其使用者计数,如果它是0,则开始使用它。

这是代码。

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

int count = channel.queueDeclarePassive(QUEUE_NAME).getConsumerCount();

System.out.println("count is "+count);
if (count == 0) {
    channel.queueDeclare(QUEUE_NAME, false, false, false, null);

    System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

    DeliverCallback deliverCallback = (consumerTag, delivery) -> {
        String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
        System.out.println(" [x] Received '" + message + "'");
    };
    channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
} else{
    System.out.println("subscribed by some other processor(s)");
}

我也可以通过这种方式在Spring AMQP中检查订户数量。但是为时已晚,因为它已经侦听了队列。

@RabbitListener(queues = "q1")
public void receivedMessageQ1(String message, Channel channel){
    try {
        int q1 = channel.queueDeclarePassive("q1").getConsumerCount();
        // do something.
    } catch (IOException e) {
        System.out.println("exception occurred");
    }
}

简而言之,我想根据其使用者计数来使用一个队列。我希望我很清楚。

1 个答案:

答案 0 :(得分:2)

exclusive上设置@RabbitListener标志; RabbitMQ将只允许使用一个实例。其他实例将每5秒尝试监听一次(默认情况下)。要增加间隔,请设置容器工厂的recoveryBackOff

@SpringBootApplication
public class So56319999Application {

    public static void main(String[] args) {
        SpringApplication.run(So56319999Application.class, args);
    }

    @RabbitListener(queues = "so56319999", exclusive = true)
    public void listen (String in) {

    }

    @Bean
    public Queue queue() {
        return new Queue("so56319999");
    }

}