3

我有一个被初始化两次的单例 ejb。我不知道为什么,据我所知,它完全捍卫了拥有一个单例 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 v3,这足够成熟吗?我应该使用 v2 还是其他?想法?

4

2 回答 2

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 下“手动”部署时,打包为 war 可以按预期工作。它还可以正常部署并在 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),部署它工作正常。所以我只是把自己搞砸了。

于 2010-02-17T19:20:47.543 回答
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 上进行了测试。

于 2011-09-17T20:48:02.287 回答