Thread.currentThread()。getContextClassLoader()返回多个对象实例

时间:2014-04-24 08:28:10

标签: java java-ee ibm-sbt

我有一个无状态会话bean,可以创建RuntimeFactoryApplication对象。这两个类都是Social Business Toolkit的一部分。 Application用于读取属性和托管bean文件,但这并没有发生,因为RuntimeFactory无法获取Application对象。

AbstractRuntimeFactoryMapApplication个对象:

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);
}

在调试期间,我注意到Thread ID保持不变,但有两个不同的ClassLoader实例。这是怎么发生的?只有一个会话bean,RuntimeFactory和Application。不应该getContextClassLoader()总是给我相同的对象吗?

在我工作的时候,我现在使用:

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

其中thisRuntimeFactory,但我不确定这是否是一个好的解决方案..感觉更像是解决实际问题的方法。

ps:我使用WebSphere Portal作为应用服务器。

1 个答案:

答案 0 :(得分:3)

在这种情况下,您不需要使用RuntimeFactory,它可能更容易避免。我去年与另一位客户合作过,他们也在使用EJB,他们选择直接实例化他们需要的端点并自行管理端点设置。代码看起来像这样:

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

    BlogService blogService = new BlogService(endpoint);