簡體   English   中英

根據 Spring AMQP 中的消費者數量使用隊列

[英]Consuming a queue based on its consumer count in 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");
    }
}

簡而言之,我想根據消費者數量來消費一個隊列。 我希望我很清楚。

@RabbitListener上設置exclusive標志; 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");
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM