Должны ли мы всегда закрывать 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
это по предусмотренной функции. Итак, мой ответ: да, вы должны закрыть это так же, как и любой другой ресурс, который должен быть закрыт.