Обработка сообщения от rabbitmq с указанной скоростью

Мы пытались заставить слушателя читать сообщения от rabbitmq с определенной скоростью 1 мсг /2 секунды. Мы не нашли такой утилиты с rabbit mq. Так что подумайте о том, чтобы сделать это с БД, т.е. слушатель будет читать сообщения и сохранять их в БД, а позже планировщик будет обрабатывать с этой желаемой скоростью из БД. Если есть лучший способ сделать это, пожалуйста, предложите. Мы разрабатываем наше приложение весной. Заранее спасибо.

2 ответа

Вы не можете сделать это со слушателем, но вы можете сделать это с RabbitTemplate...

@SpringBootApplication
public class So40446967Application {

    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext context = SpringApplication.run(So40446967Application.class, args);
        RabbitAdmin admin = context.getBean(RabbitAdmin.class);
        AnonymousQueue queue = new AnonymousQueue();
        admin.declareQueue(queue);
        RabbitTemplate template = context.getBean(RabbitTemplate.class);
        for (int i = 0; i < 10; i++) {
            template.convertAndSend(queue.getName(), "foo" + i);
        }
        String out = (String) template.receiveAndConvert(queue.getName());
        while (out != null) {
            System.out.println(new Date() + " " + out);
            Thread.sleep(2000);
            out = (String) template.receiveAndConvert(queue.getName());
        }
        context.close();
    }

}

Конечно, вы можете использовать что-то более сложное, как планировщик задач или Spring @Async метод, а не спать.

Вдохновленный ответ Гари Рассела:

вы можете использовать что-то более сложное, например, планировщик задач или Spring @Async

Вы также можете получить количество определенных сообщений в минуту и ​​смоделировать ту же предельную скорость:

private final RabbitTemplate rabbitTemplate;

@Scheduled(fixedDelay = 60000) // 1 minute
public void read() {

    List<String> messages = new ArrayList<>();
    String message = getMessageFromQueue();
    while(message != null && messages.size() < 30) { // 30 messages in 1 minute = 1 msg / 2 seconds
        messages.add(message);
        message = getMessageFromQueue();
    }

    public String getMessageFromQueue() {
        return (String) rabbitTemplate.receiveAndConvert(QUEUE_NAME);
    }

}
Другие вопросы по тегам