我使用SimpleMessageListenerContainer来使用来自rabbitMQ队列的消息。
EVN
CODE:
@Bean
public SimpleMessageListenerContainer listenerContainer() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
container.setQueues(new Queue("spring.demo"));
container.setMaxConcurrentConsumers(1);
container.setConcurrentConsumers(1);
container.setAcknowledgeMode(AcknowledgeMode.MANUAL);
container.setMessageListener(new ChannelAwareMessageListener() {
@Override
public void onMessage(Message message, Channel channel) throws Exception {
long deliveryTag = message.getMessageProperties().getDeliveryTag();
try {
byte[] body = message.getBody();
String result = new String(body);
logger.debug("result:" + result);
// doSomething(for a long time)
channel.basicAck(deliveryTag, false);
} catch (Exception e) {
e.printStackTrace();
channel.basicNack(deliveryTag, false, false);
}
}
});
return container;
}
有1个消费者来处理消息。现在如果消息将在很长一段时间内处理(5分钟),则不能消耗其他消息。
我想为每个句柄消息设置超时。例如,设置超时为30秒。如果Message处理超过此值(30秒),则使用者将Exception转移到over handle。因此,这个消费者可以处理其他消息。
但现在我不知道如何设置此超时?