Отменить регистрацию sys.ShutdownHookThread, если поток выполнен успешно?

У меня есть Future в Scala 2.11, которым управляет рабочий актор в Akka. Будущее выполняется работником, и работник отчитывается перед центральным действующим лицом, чтобы сообщить об успехе/неуспехе и запросить дополнительную работу.

Фьючерсы, обрабатываемые работником, являются длительными, и вычисления могут занять до 15 минут в зависимости от сложности задачи. Существует 100% вероятность того, что развертывание может произойти в середине вычислений, и я просто позволю ему рухнуть. Однако мне нужно сделать небольшую очистку, поэтому я реализовал следующее sys.ShutdownHookThread в будущем:

sys.ShutdownHookThread {
  logger.info(s"Computation was killed mid-task for user ${set.userId}. Recovering state...")
  closeProcessingState
}

Мой вопрос таков: если я зарегистрировал перехватчик выключения, отменит ли он сам себя, когда будущее будет завершено? Проверяя документы API, в описании говорится, что он «самоотменяет регистрацию», но, похоже, не указывает, что заставляет его отменять регистрацию.

По сути, если JVM выключается через несколько часов, я не хочу, чтобы работала тысяча перехватчиков выключения, потому что они не отменили регистрацию самостоятельно.


person crockpotveggies    schedule 02.12.2015    source источник


Ответы (1)


Документы не говорят, что это «самоотмена регистрации». Там написано: It knows how to unregister itself.. Это означает, что вы можете вызвать метод remove в экземпляре ShutdownHookThread.

Этот ShutdownHookThread просто помощник для java.lang.Runtime#addShutdownHook. Взгляните на реализацию это довольно просто.

Другими словами, вы несете ответственность за отмену регистрации.

person pedrofurla    schedule 02.12.2015
comment
Да, это так просто. Я создал необязательную ссылку на хук, чтобы удалить его с помощью shutdownHook.map { hook => hook.remove() } - person crockpotveggies; 03.12.2015