Glassfish的初始化辛格尔顿两次豆
题
我有这是越来越初始化两次单EJB。我不知道为什么,它是完全地defenting点中,据我可以告诉有一个singleton bean。任何帮助将不胜感激。正如你可以看到我试图在把一个静态布尔值,以防止多个初始化(其实不是应该要求),但它并没有区别。
豆:
@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的第三版,这是成熟足够?我应该使用v2或其他什么东西?想法?
解决方案
下面的单例:
@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抱怨不包含任何EJB模块,但是它们是在eclipseApps/$projectName
eclipseApps/$projectName/WEB-INF/classses
)。可悲的是,这似乎是在GlassFish Eclipse插件(至少我使用的版本)中的错误。我并不认为有很多问题,在问题追踪器虽然...奇怪,因为这看起来像一个大阻断一个。击>但是Eclipse之外,GFv3可以正常工作,我无法重现您的问题。
更新:我终于把东西下的Eclipse和GlassFish v3的工作。我不会把所有的细节,但问题是,我不知何故未能获得我的项目直接认定为“动态Web模块”,2.5版本最初设定在2.3,我觉得这有一些东西需要与部署错误上GFv3。后设置了我的项目正确(设置为2.5的面),部署它工作得很好。所以,我只是搞砸了自己。
其他提示
此问题发生在ejb-jar.xml中的EJB名称不等于EJB类名。 点击 例如:
<ejb-name>MySingletonBean</ejb-name>
<ejb-class>ru.rozge.MyTestSingletonBean</ejb-class>
在这种情况下,GF注册了两个豆具有不同JNDI名称( “Java的:全球/ MySingletonBean” 和 “Java:全球/ MyTestSingletonBean”)。然后在初始化它创建了两个对象,首先 - MySingletonBean和第二 - MyTestSingletonBean结果 此外,如果你使用@Resource注释注射资源,GF操作:点击 1)GF创建第一对象“MySingletonBean”,并在它正确地注入资源;结果 2)GF创建第二对象“MyTestSingletonBean”和失败上注入(注入所有资源等于null或默认值)。结果 测试在GF 3.1构建12 @Singleton @Startup组合。