попытка с ресурсами завершается неудачно, но попытка работает - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь настроить службу, которая прослушивает сервер RabbitMQ, и я настроил код, используя Пример кода RabbitMQ от Github , который включает в себя следующий try-with-resources блок

try (Connection connection = factory.newConnection();
     Channel channel = connection.createChannel()) {
        // code here
}

Когда я использую тот же код и собираю и запускаю этот сервис, используя java -cp myJar.jar MyService, он просто запускается и сразу заканчивается echo $? возвращает 0)

Однако, если я заменю блок следующим, тогда он будет работать нормально с той же командой, и я смогу запустить слушатель экземпляра RabbitMQ

try {
     Connection connection = factory.newConnection();
     Channel channel = connection.createChannel());

     // code here
}

То же самое происходит, даже когда я создаю соединения с базой данных

try (Connection connection = dataSource.getConnection()) {
    //code here
}

терпит неудачу, но

try {
    Connection connection = dataSource.getConnection();
    //code here
}  

отлично работает и позволяет мне использовать соединение для ввода записей в БД.


Почему это происходит? Я использую OpenJDK 11.0.2, и этот сервис является автономным, но остальная часть кодовой базы - это API отдыха, управляемый JAX-RS, если это помогает.

Ответы [ 2 ]

5 голосов
/ 15 июня 2019

Конструкция try-with-resources закрывает ресурсы при выходе из блока. Ваш основной код блока try ничего не закрывает. В этом разница между ними.

Когда вы используете try-with-resources, вам нужно DO что-то с ресурсом.

Если вы пишете код, в котором ресурс, который вы открываете, должен быть «долгоживущим», тогда try-with-resources - это неправильная конструкция (хотя, как правило, это означает, что класс, который вы пишете, сам должен быть AutoClosable).

3 голосов
/ 15 июня 2019

При использовании любой концепции в программировании вы должны понимать, что вы делаете!

Весь смысл попытки 1006 * состоит в том, что ресурсыгарантированно закрывается, когда заканчивается блок try.

Но обратите внимание: просто использование блока try недостаточно.Такие критически важные ресурсы, как соединение с базой данных, требуют четкого и преднамеренного управления жизненным циклом.Другими словами: вы должны хранить такие ресурсы ровно столько, сколько вам нужно.И вам лучше убедиться, что вы по ошибке не забыли закрыть ресурс, когда он больше не требуется!

Таким образом, вы должны не беззаботно отказаться от попытки с ресурсом.Скорее убедитесь, что код, для которого требуется такой ресурс, вызывается в рамках такого блока try-with-resource!

...