我有一个单例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还是别的什么?想法?
答案 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抱怨但在Eclipse之外,GFv3表现正常,我无法重现你的问题。eclipseApps/$projectName
不包含任何EJB模块,但是在eclipseApps/$projectName/WEB-INF/classses
中。遗憾的是,这似乎是GlassFish Eclipse插件的一个错误(至少我正在使用的版本)。我没有在问题跟踪器中看到很多问题......虽然很奇怪,因为这看起来像是一个很大的阻塞问题。
更新:我终于在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上测试。