Thread.currentThread().getContextClassLoader() возвращает несколько экземпляров объекта

У меня есть сессионный компонент без сохранения состояния, который создает объекты RuntimeFactory и Application. Оба класса являются частью пакета Social Business Toolkit. Application используется для чтения свойств и файлов управляемых компонентов, но этого не произошло, поскольку RuntimeFactory не смог получить объект Application.

AbstractRuntimeFactory имеет Map с Application объектами:

private Map<ClassLoader,AbstractApplication> applications = new HashMap<ClassLoader, AbstractApplication>();

ClassLoader устанавливается с помощью этого метода:

protected ClassLoader getContextClassLoader() {
    return Thread.currentThread().getContextClassLoader();
}

Объект Application извлекается с помощью этого метода:

public Application getApplicationUnchecked() {
    ClassLoader cl = getContextClassLoader();
    return applications.get(cl);
}

Во время отладки я заметил, что идентификатор потока остается прежним, но есть два разных экземпляра ClassLoader. Как это произошло? Есть только один сессионный компонент, RuntimeFactory и Application. Разве getContextClassLoader() не должен всегда возвращать мне один и тот же объект?

Теперь, когда я работаю, я использую:

ClassLoader cl = this.getClass().getClassLoader();

Где this - это RuntimeFactory, но я не уверен, что это хорошее решение... это больше похоже на обходной путь к реальной проблеме.

PS: я использую WebSphere Portal в качестве сервера приложений.


person magnetronnie    schedule 24.04.2014    source источник
comment
ваш класс загружает Parent-First или Parent-Last?   -  person Paul Bastide    schedule 24.04.2014


Ответы (1)


В этом случае вам не нужно использовать материал RuntimeFactory, и его может быть проще избежать. В прошлом году я работал с другим клиентом, который также использовал EJB, и они решили просто создать экземпляр конечной точки, которая им нужна, и самостоятельно управлять настройками конечной точки. Код будет выглядеть примерно так:

    BasicEndpoint endpoint = new ConnectionsBasicEndpoint();
    endpoint.setUrl(url);
    endpoint.setUser(user);
    endpoint.setPassword(password);
    endpoint.setForceTrustSSLCertificate(true);

    BlogService blogService = new BlogService(endpoint);
person Mark Wallace    schedule 29.04.2014
comment
Некоторое время я пытался работать без RuntimeFactory, но мне нужны Application и Context для обработки некоторых вещей, таких как перенаправление в SmartCloud при использовании OAuth. Я рассматриваю возможность использования HashMap‹имя пользователя Application› вместо Classloader. Храните один экземпляр приложения для каждого пользователя. Спасибо за помощь в любом случае :) - person magnetronnie; 07.05.2014