2009-08-28 3 views
3

Второй поиск JNDI в приведенном ниже коде неудачно с исключением при запуске в качестве автономного приложения против Glassfish (который был настроен для предоставления QueueConnectionFactory и DataSource через JNDI). Однако код отлично работает при удалении строки jndiContext.close().Почему вызов close() на InitialContext прерывает JNDI для всех будущих поисков (Glassfish)?

В реальном коде, вызов close() производится весной в JndiObjectFactoryBean, поэтому я не могу ее легко удалить.

Это ошибка в Glassfish, или я делаю что-то неправильно (например, неправильная настройка или неправильное кодирование)?

import javax.naming.Context; 
import javax.naming.InitialContext; 

public class TestInitCtx { 
    private final static String QUEUE_CONNECTION_FACTORY_JNDI_NAME = "QCF"; 
    private final static String DATA_SOURCE_JNDI_NAME = "DS"; 

    public static void main(String[] args) throws Exception { 
     Context jndiContext = new InitialContext(); 
     jndiContext.lookup(QUEUE_CONNECTION_FACTORY_JNDI_NAME); 

     // In Glassfish, this line causes the second lookup 
     // to throw a com.sun.enterprise.connectors.ConnectorRuntimeException 
     // (wrapping a NullPointerException) 
     jndiContext.close(); 

     jndiContext = new InitialContext(); 
     jndiContext.lookup(DATA_SOURCE_JNDI_NAME);   
    } 
} 

ответ

0

Реализация JNDI может поддерживать только одну статическую реализацию объекта InitialContext. Вы можете использовать документацию по адресу sun, чтобы определить, как определить конкретный конкретный тип фабрики контекста JNDI, а затем найти документы по реализации, которые подробно описывают, что близко.

+0

ОК, но Spring вызывает close() для контекста для меня. Должен ли я отказаться от использования Spring, если мой объект InitialContext является одним из этих статических? –