Я сталкиваюсь с этой проблемой, когда JVM запускает OutOfMemory и очередь застревает в результате частого перезапуска контейнера. Хотя у меня есть обработчик исключений в слушателе очереди, он не работает.
Это мое приложение. Свойства
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.listener.simple.concurrency=3
spring.rabbitmq.listener.simple.max-concurrency=10
spring.rabbitmq.listener.simple.idle-event-interval=60000
spring.rabbitmq.listener.simple.prefetch1
spring.rabbitmq.listener.simple.retry.max-attempts=1
spring.rabbitmq.listener.simple.default-requeue-rejected=false
а это мой слушатель
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "queue", durable = "true"),
exchange = @Exchange(value = "exchange", type = ExchangeTypes.TOPIC),
key = RabbitConfiguration.RULE_SERVICE_ROUTING_KEY
)
)
public void processMessage(final Order order, final Message message) {
try {
// OutOfMemory is happening inside this service which calls Drools
this.service.run(order);
} catch (Throwable throwable) {
logger.info("Message failed");
throw new AmqpRejectAndDontRequeueException(throwable);
}
}
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-4"
Сервисный код
public void run(Order order) {
try {
kieSession = this.getContainer(group, artifact, version).newKieSession();
this.setUpListeners(kieSession);
kieSession.insert(order);
kieSession.fireAllRules();
} catch (Throwables t) {
throw new Exception(t);
} finally {
kieSession.dispose();
}
}
Есть ли способ отклонить это сообщение и поместить его в очередь недоставленных сообщений.