Обработка сообщения от 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);
}
}