Ищите шаблон проектирования общего назначения, который позволит закрыть сложное приложение - PullRequest
0 голосов
/ 08 октября 2019

Я работаю над довольно сложным приложением на Java-сервере, работающем в Tomcat (как война).

Наш существующий шаблон:

При запуске мы регистрируем различные классы, которые управляют своими собственнымипотоки, некоторые имеют внешнюю или внутреннюю связь (мы используем Hazelcast, JMS и несколько систем баз данных). Мы посылаем каждому из этих классов сигнал init (), когда они зарегистрированы, чтобы они могли начать выполнять свою работу.

При выключении мы посылаем сигнал destroy () каждому (в обратном порядке), чтобы попросить их остановитьих темы.

Проблема в том, что это довольно хрупко. Если метод destroy () должен отключить Hazelcast, но что-то еще отправляет сообщение, Hazelcast имеет тенденцию зависать при завершении работы. Теперь уничтожить поток зависает и не доходит до всего остального.

В некоторых случаях я пытался уничтожить код следующим образом:

destroy() {
    shuttingDown=true;
    hazelcast.disconnect();
    //maybe call destroy on child threads here...
    // in some cases send interrupt signals to threads that might be waiting on data...
}

Таким образом цикл может частично зависеть от! shuttingDown.

Это исправило некоторые проблемы, но оно не универсально.

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

Я рассмотрел глобальный атомарный флаг shuttingDown (или "работающий") для ссылки из всех циклов, но это, безусловно, выглядит немного странно. Передача shuttingDown Atomic может сработать (но в какой-то момент, если он будет проходить везде, разве это не глобальный / синглтон?)

Другой подход - добавление состояний, в настоящее время у нас есть init () и destroy(). Мы могли бы иметь init (), start (), stop () и destroy (). Остановка может остановить циклы перед тем, как мы попытаемся убить службы.

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

...