以指定的速率处理来自rabbitmq的消息

时间:2016-11-06 07:26:24

标签: rabbitmq spring-amqp throttling spring-rabbitmq

我们一直试图让侦听器以1 msg / 2秒的特定速率从rabbitmq读取消息。到目前为止,我们没有找到任何与兔子mq这样的实用程序。因此,想到使用DB(即侦听器)执行此操作将读取消息并将其存储到DB中,稍后调度程序将以所需的速率从DB处理。如果有更好的方法,请建议。我们正在Spring开发我们的应用程序。提前致谢。

2 个答案:

答案 0 :(得分:1)

您无法通过听众执行此操作,但您可以使用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方法,而不是睡觉。

答案 1 :(得分:0)

受到Gary Russel回答的启发:

  

您可以使用更复杂的东西,如任务调度程序或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);
    }

}