Должны ли мы всегда закрывать javax.naming.InitialContext на стороне клиента приложения JBoss?

Когда мы создаем новый InitialContext для удаленного доступа к Enterprise Java Beans после завершения работы всегда следует закрывать context с помощью context.close()?

Вот пример кода:

// Client side method
private void doSomeActionMethod() {
    RouteTransactionFacadeBeanRemote remote = null;
    final Hashtable jndiProperties = new Hashtable();
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
    Context context = null;
    try {
        context = new InitialContext(jndiProperties);
        remote = (RouteTransactionFacadeBeanRemote) context
                 .lookup("ejb:EJBEAR/EJBServer//RouteTransactionFacadeBean!facade.RouteTransactionFacadeBeanRemote");

        //DO SOMETHING WITH REMOTE EJB

        } catch (NamingException e) {
            e.printStackTrace();
        } finally {
            try {
                // Should we always do this?
                if (context != null) context.close();
            } catch (NamingException ex) {
                ex.printStackTrace();
            }
        }
    }

1 ответ

Решение

Из ага:

Закрывает этот контекст. Этот метод немедленно освобождает ресурсы этого контекста, вместо того, чтобы ожидать их автоматического сброса сборщиком мусора. Этот метод идемпотентен: его вызов в уже закрытом контексте не имеет никакого эффекта. Вызов любого другого метода в закрытом контексте недопустим, что приводит к неопределенному поведению.

Хотя, сборщик мусора будет собирать их, но вместо того, чтобы ждать gc, вам следует close это по предусмотренной функции. Итак, мой ответ: да, вы должны закрыть это так же, как и любой другой ресурс, который должен быть закрыт.

Другие вопросы по тегам