clojure core async и servlet undeploy

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

У меня вопрос: как я могу очистить неиспользуемые потоки core.async при отмене развертывания своего приложения?

Я понимаю, что core.async управляет своим собственным пулы потоков:

  1. Он использует кэшированный пул потоков для запуска (thread) макросов. Потоки в пуле автоматически очищаются после 60 секунд бездействия согласно документации.
  2. Однако он использует фиксированный пул потоков для запуска воркеров. Явная ссылка shutdown должен был быть вызван, чтобы остановить этот пул потоков, но реализация пула потоков не видна публично.

Как можно отключить core.async при отмене развертывания приложения?


person erdos    schedule 13.12.2018    source источник
comment
Агенты отключения функции отключают другой пул потоков, не связанный с core.async. Я тоже использую это, но потоки core.async все еще поддерживаются. Они находятся в другом сервисе-исполнителе.   -  person erdos    schedule 14.12.2018
comment
Как насчет полной остановки всего исполнителя?   -  person akond    schedule 14.12.2018
comment
это именно то, что я хочу сделать. однако, как видите, мне нужна общедоступная ссылка на экземпляр исполнителя для вызова .shutdown, который недоступен.   -  person erdos    schedule 14.12.2018
comment
О, теперь я вижу. executor-svc закрыт как локальная переменная внутри thread-pool-executor?   -  person akond    schedule 14.12.2018
comment
точно! интересно, есть ли в jvm другие способы отключить службу-исполнитель (и как найти ту, которая мне нужна)   -  person erdos    schedule 14.12.2018
comment
Я думаю, вам пора перейти на слабый канал #core-async.   -  person akond    schedule 14.12.2018