Glassfish初始化Singleton bean两次

时间:2010-02-17 16:09:34

标签: java java-ee singleton glassfish ejb-3.1

我有一个单例ejb,它被初始化两次。我不知道为什么,据我所知,它完全摒弃了拥有单身豆豆的观点。任何帮助将不胜感激。正如你所看到的那样,我试图将一个静态布尔值放入以防止多次初始化(不是应该要求它),但它没有任何区别。

豆:

@Singleton 
@Startup
public class DataModelBean implements DataModelBeanLocal {

   private static Logger log = Logger.getLogger(DataModelBean.class.getName());

   @PostConstruct
   public void init(){
      log.info(this);           
   }
}

日志输出摘录:

2010-02-17 16:06:13,670 INFO  [AutoDeployer        :DataModelBean       ] com.xxx.xxx.datamodel.DataModelBean@117843d
2010-02-17 16:06:14,233 INFO  [AutoDeployer        :DataModelBean       ] com.xxx.xxx.datamodel.DataModelBean@62b9d3

创造2个豆子!!还是两次部署应用程序?

另外我使用的是glassfish v3,这是否足够成熟?我应该使用v2还是别的什么?想法?

2 个答案:

答案 0 :(得分:1)

以下单身人士:

@Singleton
public class MasterDataCache 
{
    private final static Logger logger = LoggerFactory.getLogger(MasterDataCache.class);

    private Map cache;

    @PostConstruct
    public void initCache() {
        logger.debug("initCache()");
        this.cache = new HashMap();
    }

    public Object get(String key){
        return this.cache.get(key);
    }

    public void store(String key,Object value){
        this.cache.put(key, value);
    }
}

以下servlet:

@WebServlet(name="SingletonTester", urlPatterns={"/SingletonTester"})
public class SingletonTester extends HttpServlet {

    @EJB
    MasterDataCache masterDataCache;

    @Override
    public void init(){
     masterDataCache.store("startup", new Date());
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        try {
            out.println("Startup time: " + masterDataCache.get("startup") );
        } finally {
            out.close();
        }
    }
}
在GFv3下“手动”部署时,

打包为战争按预期工作。它也可以部署正常并在NetBeans下按预期工作(initCache只调用一次)。 我唯一的问题是部署在Eclipse下失败(GFv3抱怨eclipseApps/$projectName不包含任何EJB模块,但是在eclipseApps/$projectName/WEB-INF/classses中。遗憾的是,这似乎是GlassFish Eclipse插件的一个错误(至少我正在使用的版本)。我没有在问题跟踪器中看到很多问题......虽然很奇怪,因为这看起来像是一个很大的阻塞问题。但在Eclipse之外,GFv3表现正常,我无法重现你的问题。

更新:我终于在Eclipse和GlassFish v3下工作了。我不会提供所有细节,但问题是我以某种方式未能将我的项目直接识别为“动态Web模块”2.5,该版本最初设置为2.3并且我认为这与部署错误有关在GFv3上。正确设置我的项目后(方面设置为2.5),部署它工作正常。所以我只是搞砸了自己。

答案 1 :(得分:1)

当在ejb-jar.xml中EJB名称不等于EJB类名时,会发生此问题。
例如:

<ejb-name>MySingletonBean</ejb-name>
<ejb-class>ru.rozge.MyTestSingletonBean</ejb-class>

在这种情况下,GF注册两个具有不同JNDI名称的bean(“java:global / MySingletonBean”和“java:global / MyTestSingletonBean”)。然后在初始化中创建两个对象,第一个 - MySingletonBean和第二个 - MyTestSingletonBean。 此外,如果您对注入资源使用@Resource注释,GF操作:
1)GF创建第一个对象“MySingletonBean”并正确地在其中注入资源;
2)GF创建第二个对象“MyTestSingletonBean”并且在注入时失败(所有注入的资源等于null或默认值)。
使用@Singleton @Startup组合在GF 3.1 build 12上测试。