Как правильно сгенерировать исключение во время выполнения и перезапустить Docker-контейнер - PullRequest
1 голос
/ 02 июля 2019

У меня есть Docker-контейнер с Java-приложением, которое использует БД для сохранения некоторых данных. У моего приложения есть класс, который расширяет другой, который не является моим кодом (в частности, SinkTask, класс от Kafka, который используется для передачи данных из Kafka в другую систему). Когда приложение запускается, оно открывает соединение с базой данных. Иногда база данных закрывает соединение и задачи начинают сбой. Исключения, создаваемые этими сбоями, фиксируются в одной части моего кода, и я могу придумать разные способы их обработки: 1. Просто выполните код из приложения, которое останавливает и снова устанавливает соединение 2. Перезапустить контейнер Docker, создать новое соединение в процессе

Я думаю, что лучшее решение - это номер 1. Однако я хотел знать, как я могу вызвать вторую ситуацию. Я предполагаю, что я должен выбросить новое исключение в блоке catch, способное завершить приложение (помните, что часть кода SinkTask находится вне моего контроля). Это было бы хорошим решением? Какое исключение я должен бросить в этом случае?

Это часть кода, где я ловлю исключение

    private void commitCollections() {
        for (SinkCollection sc : collections.values()) {
            try {
                commitCollection(sc);
            } catch (Exception e) {
                LOG.error("Error flushing collection " + sc.getTableName(), e);
            }
        }
        transactionRecordCount = 0;
        try {
            connection.commit();
        } catch (SQLException e) {
            LOG.error("Commit error", e);
        }
    }

1 Ответ

3 голосов
/ 02 июля 2019

Бросить Exception и дать ему возможность распространиться, чтобы завершить приложение - это очень хорошее решение.ИМО, лучше использовать System.exit(exit_code), потому что он четко описывает, что делает этот код.

Кроме того, в Docker будет отображаться exit_code в состоянии контейнера (docker ps -a), что помогает различать различные состояния ошибки.Когда генерируется необработанное исключение, код выхода всегда равен 1.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...