Почему вызов close () для InitialContext нарушает JNDI для всех будущих поисков (Glassfish)? - PullRequest
3 голосов
/ 28 августа 2009

Второй поиск JNDI в приведенном ниже коде завершается ошибкой, за исключением того, что он запускается как отдельное приложение для Glassfish (которое было настроено для предоставления QueueConnectionFactory и DataSource через JNDI). Тем не менее, код работает нормально, когда строка jndiContext.close() удалена.

В реальном коде Spring делает вызов 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);          
    }
}

1 Ответ

0 голосов
/ 28 августа 2009

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

...