【发布时间】:2016-12-08 07:03:35
【问题描述】:
如何在不使用自动确认的情况下手动确认消息。
有没有办法将它与@RabbitListener 和@EnableRabbit 配置样式一起使用。
大多数文档告诉我们使用SimpleMessageListenerContainer 和ChannelAwareMessageListener。
然而,使用它我们失去了注释提供的灵活性。
我的服务配置如下:
@Service
public class EventReceiver {
@Autowired
private MessageSender messageSender;
@RabbitListener(queues = "${eventqueue}")
public void receiveMessage(Order order) throws Exception {
// code for processing order
}
我的 RabbitConfiguration 如下
@EnableRabbit
public class RabbitApplication implements RabbitListenerConfigurer {
public static void main(String[] args) {
SpringApplication.run(RabbitApplication.class, args);
}
@Bean
public MappingJackson2MessageConverter jackson2Converter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
return converter;
@Bean
public SimpleRabbitListenerContainerFactory myRabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(rabbitConnectionFactory());
factory.setMaxConcurrentConsumers(5);
factory.setMessageConverter((MessageConverter) jackson2Converter());
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
return factory;
}
@Bean
public ConnectionFactory rabbitConnectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost("localhost");
return connectionFactory;
}
@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
registrar.setContainerFactory(myRabbitListenerContainerFactory());
}
@Autowired
private EventReceiver receiver;
}
}
对于如何适应手动通道确认以及上述配置样式的任何帮助,我们将不胜感激。 如果我们实现 ChannelAwareMessageListener,那么 onMessage 签名将会改变。 我们可以在服务上实现 ChannelAwareMessageListener 吗?
【问题讨论】:
-
一个问题是为什么你甚至需要这样做。如果您的代码与下面的答案类似(拒绝失败,否则确认),容器将使用 AUTO ack 模式自动为您执行此操作 - 如果侦听器抛出异常,则消息将被拒绝;否则确认。
标签: java rabbitmq spring-amqp spring-rabbit