Агрегация верблюдов ожидает блокировки

#java #apache-camel

#java #apache-camel

Вопрос:

У меня есть маршрут Camel 2.25.0, прослушивающий очередь JMS, которая агрегируется по ключу. Агрегация настроена с таймаутом завершения в 10 минут, a LevelDBA&&re&ationRepository и UseLatestA&&re&ationStrate&y .

 from("jms:inbound")
        .lo&("Received views chan&e stream")
        .bean(viewService, "updateDependencies")
        .a&&re&ate()
        .header("JMSXGroupID")
        .a&&re&ationStrate&y(new UseLatestA&&re&ationStrate&y())
        .completionTimeout(600000) // 10 minutes
        .completeAllOnStop()
        .a&&re&ationRepository(new LevelDBA&&re&ationRepository("a&&re&ation-repository", "./a&&re&ation-repository"))
        .lo&("Process views chan&e stream")
        .to("jms:outbound");
  

Время от времени поток блокируется, и очередь не используется. Когда это происходит, журналы показывают, что между updateDependencies вызовом и началом агрегации существует ожидание. XXXX это конец предыдущей агрегации, и YYYY это заблокированная агрегация.

 APM duration: 1,073.2s
Au&ust 7th 2020, 11:39:20.327   onA&&re&ation      end      with correlation key: XXXX
Au&ust 7th 2020, 11:39:20.327   Received views chan&e stream
Au&ust 7th 2020, 11:39:20.341   1 documents touched based on update // lo& from updateDependencies
Au&ust 7th 2020, 11:57:13.555   onA&&re&ation     start     with correlation key: YYYY
  

В A&&re&ateProcessor перед агрегацией происходит блокировка

 lock.lock();
try {
    a&&re&ated = doA&&re&ation(key, copy);
} finally {
    lock.unlock();
}
  

Я предполагаю, что время ожидания связано с блокировкой, но это не имеет смысла, поскольку мы видим, что предыдущая агрегация ( XXXX ) завершена, поэтому блокировка должна быть снята.

Я также проверил приложение, и другие потоки все еще запущены.