【发布时间】:2017-12-27 16:31:02
【问题描述】:
我有一个生产者每秒向 RabbitMQ 发送 20 条消息,我还有一个消费者,它应该以与产生消息相同的速度接收消息。
我必须实现一些条件:
- 每秒产生和消费 20 条消息。
- 保存生产订单。
- 消息不应丢失(这就是我使用 AcknowledgeMode.AUTO 的原因)。
当我使用 Spring AMQP 实现(org.springframework.amqp.rabbit)时,我的消费者每秒最多处理 6 条消息。但是,如果我使用原生 AMQP 库 (com.rabbitmq.client),它每秒会使用 ack - auto 和 manual 处理所有 20 条消息。
问题是:
为什么消费者案例中的 Spring 实现工作如此缓慢,我该如何解决这个问题?
如果我设置 prefetchCount(20),它会根据需要工作,但我不能使用 prefetch,因为它会在拒绝情况下破坏订单。
春季amqp:
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(rabbitMqServer);
connectionFactory.setUsername(rabbitMqUsername);
connectionFactory.setPassword(rabbitMqPassword);
return connectionFactory;
}
...
private SimpleMessageListenerContainer createContainer(Queue queue, Receiver receiver, AcknowledgeMode acknowledgeMode) {
SimpleMessageListenerContainer persistentListenerContainer = new SimpleMessageListenerContainer();
persistentListenerContainer.setConnectionFactory(connectionFactory());
persistentListenerContainer.setQueues(queue);
persistentListenerContainer.setMessageListener(receiver);
persistentListenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
return persistentListenerContainer;
}
...
@Override
public void onMessage(Message message) {saveToDb}
【问题讨论】:
标签: java spring amqp spring-amqp