我编写了Java应用程序,它向RabbitMQ发送消息。 然后Flume从RabbitMQ队列中选择消息。 我很感兴趣,除了水槽之外,没有人从队列中提取消息。
我的应用程序使用Spring AMQP Java插件。
使用下面的代码,消息进入RabbitMQ队列并永远保持“Unknowledges”。 据我所知,RabbitMQ正在等待来自MessageListener的ACK,但MessageListener永远不会发出ACK。 有人知道如何解决它吗?
代码:
public class MyAmqpConfiguration {
@Autowired
ConnectionFactory connectionFactory;
@Bean
public SimpleMessageListenerContainer messageListenerContainer() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
container.setQueues(activityLogsQueue());
container.setMessageListener(MyMessageListener());
container.setConcurrentConsumers(3);
return container;
}
@Bean(name="myTemplate")
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(MyMessageConverter());
return template;
}
}
public class MyMessageListener implements MessageListener {
public MyMessageListener(MessageConverter converter, MyMessageHandler<MyObject> messageHandler) {
this.converter = converter;
this.messageHandler = messageHandler;
}
@Override
public void onMessage(Message message) {
this.messageHandler.doThings();
}
}
public class MyMessageHandler {
@Autowired
@Qualifier("myTemplate")
RabbitTemplate template;
@Override
public void handleMessage(MyObject thing) {
template.convertAndSend(exchange, routingKey, thing);
}
}
public class MyMessageConverter extends JsonMessageConverter {
@Override
protected Message createMessage(Object object, MessageProperties messageProperties) {
//do things
}
@Override
public Object fromMessage(Message message) throws MessageConversionException {
throw new UnsupportedOperationException("fromMessage is not supported in "+this.getClass().getName());
}
}
答案 0 :(得分:4)
如果您不想确认每条消息,那么您可以通过执行
在SimpleMessageListenerContainer上设置AcknowledgeModecontainer.setAcknowledgeMode(AcknowledgeMode.NONE);
请查看API reference以获取更多信息。
更新:应该 AcknowledgeMode.NONE
设置为AcknowledgeMode.NONE以告诉代理不要期待任何确认,并且它将假定所有消息一发送就被确认(这是本地Rabbit代理术语中的“autoack”)。如果AcknowledgeMode.NONE那么通道不能是事务性的(因此如果意外设置了该标志,容器将在启动时失败)。
答案 1 :(得分:0)