Шаблон проектирования для правильного выхода из запущенной программы из нескольких мест - PullRequest
3 голосов
/ 21 июля 2011

У меня есть система, написанная на Java, где у меня есть несколько различных объектов, каждый из которых использует разные ресурсы. Некоторые имеют подключения к очередям activeMQ, некоторые имеют сетевые подключения, а другие имеют открытые файлы. Некоторые из них также содержат запущенные потоки.

Когда где-то в этой системе происходит фатальная ошибка, мне нужно закрыть ее, правильно закрыть все ресурсы и остановить все работающие потоки.

Моя проблема возникает, когда объект, вызвавший ошибку, должен запустить процесс завершения работы. Этот объект не знает о других объектах, которые имеют открытые файлы и так далее. Таким образом, он может в основном высвободить все свои ресурсы, и это все.

Я ищу чистый способ достичь этого, не запутываясь и не передавая несколько ссылок на объекты по всей системе.

Любое понимание приветствуется. Спасибо.

Ответы [ 3 ]

5 голосов
/ 21 июля 2011

Создайте центральный объект Lifecycle, на который все эти другие объекты в вашем приложении имеют ссылку, и который, в свою очередь, имеет ссылку на все эти другие объекты.Кроме того, каждый из этих объектов должен реализовывать общий интерфейс, такой как

public interface ShutdownListener {
   void onShutdown();
}

Когда одному из объектов необходимо начать упорядоченное выключение, он может вызвать lifecycle.shutdown(), что, в свою очередь, может вызвать object.onShutdown() навсе объекты, зарегистрированные в нем, чтобы дать этим объектам возможность закрыть свои ресурсы.

Это в основном шаблон наблюдателя .

Если вы используетеКонтейнер для внедрения зависимостей, такой как Spring, встроен в этот тип вещей - ваши компоненты могут расширять определенный интерфейс, чтобы получать уведомления при завершении работы контейнера.

1 голос
/ 21 июля 2011

Виртуальная машина Java позволяет регистрировать Shutdown Hooks.Ваш пул соединений с базой данных, ваш файловый менеджер ввода-вывода, ваш менеджер очередей activeMQ могут независимо регистрировать собственные хуки отключения, каждый из которых корректно закрывает все свои ресурсы.

Хук завершения работы - это поток, требующий ссылки на менеджер ресурсов.(s) это ответственно за закрытие.Метод run этого потока будет выполнен, когда приложение будет завершено.Ваше приложение имеет доступ к регистрации перехвата отключения в любом месте, так как Runtime.getRuntime() доступен в виде статического вызова, поэтому нет необходимости подключать его к тем областям приложения, которые в нем нуждаются (хотя рекомендуется регистрировать такие перехватчики отключения во времяо создании каждого менеджера ресурсов).

Более подробная информация здесь.

http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)

1 голос
/ 21 июля 2011

Вы можете использовать Отключающий крюк для этого.В нем вы можете уведомить все связанные объекты, которые, конечно же, нужно где-то зарегистрировать.

...