多场战争的绝对单兵(分享类加载器)

时间:2015-10-23 10:57:07

标签: java jboss singleton classloader war

我找到了一些关于这个主题的信息,但还没有找到一个好的解决方案:

假设我有3个项目:

  • 核心(java)
  • FrontEnd(jsp and ember)
  • WS(java)

WS和FrontEnd都包含对Core的maven依赖。 在Core中,有一个像这样的单身SomeDao:

private static SomeDao _instance = null;

public static SomeDao getInstance() {
    if (_instance != null)
        return _instance;
    synchronized (SomeDao.class) {
        if (_instance == null)
            _instance = new SomeDao();
        return _instance;
    }
}

应用程序托管在JBoss WildFly中,WS(java)和FrontEnd(jsp)都使用SomeDao,但由于不同的类加载器,SomeDao有两个实例。 SomeDao有自己的缓存,因此在一段时间后变得不同步(WS< - > FrontEnd)。

我的问题:

  • 强制一次即时的最佳方法是什么(制造父战争,融合战争,使用相同的类加载器,maven解决方案,将Core作为lib放在JBoss中,将Core部署为JBoss中的自己的WAR)以及为什么?
  • 是否可以在JBoss中访问其他WAR的类加载器?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:0)

这样的事可能适合你:

  

因为许多类通常使用多个类加载器   情况 - 包括servlet容器 - 你可以结束多个   单身实例,无论你多么谨慎地实施你的   单身课程。如果要确保加载相同的类加载器   你的单身人士,你必须自己指定班长;对于   例如:

private static Class getClass(String classname) 
                                         throws ClassNotFoundException {
      ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
      if(classLoader == null)
         classLoader = Singleton.class.getClassLoader();
      return (classLoader.loadClass(classname));
   }
}

来源:Simply Singleton - JavaWorld