У меня есть набор маршрутов Camel, настроенных для чтения и записи в очереди RabbitMQ, примерно так:
from("rabbitmq:$rabbitMQVhost?connectionFactory=#customConnectionFactory&queue=${it.rabbitMQQueue}&routingKey=${it.rabbitMQQueue}&SOME_MORE_PROPERTIES")
.log("Read message from queue ${it.rabbitMQQueue}")
.routeId(it.rabbitMQQueue)
.noAutoStartup()
.bean(it.rabbitMQBean)
.choice()
.`when`(PredicateBuilder.and(simple("$myCondition"), isNotNull(body())))
.split(body())
.toD("rabbitmq:$rabbitMQVhost?connectionFactory=#customConnectionFactory&queue=${it.rabbitMQQueueDestination}&autoDelete=false&routingKey=${it.rabbitMQQueueDestination}&bridgeEndpoint=true")
.endChoice()
.otherwise()
end()
Где SOME_MORE_PROPERTIES
- это в основном autoDelete=false&autoAck=false
и некоторые параметры предварительной выборки сообщений.
Моя ConnectionFactory является org.springframework.amqp.rabbit.connection.CachingConnectionFactory
.
Всякий раз, когда в мою исходную очередь поступает сообщение, запускается поток для его обработки;однако после завершения обработки она зависает в состоянии WAIT, никогда не освобождаясь и не завершаясь, поэтому память моего приложения через некоторое время насыщается, и сборщик мусора ничего не может с этим поделать.
После некоторого времени работы мойприложение в основном находится в этом состоянии:

Если я вручную перезапущу маршруты, потоки будут прерваны, а память освобождена.
Есть ли что-то, что я делаю неправильно в моей конфигурации маршрутов, которая препятствует правильному завершению потоков?
Я бы хотел избежать необходимости писать кварцевое задание для перезапуска маршрутов время от времени.
Редактировать: Я также недавно обновился с Camel 2.24.0 до последней версии RC для Camel 3, но проблема все еще возникает.