Glassfish дважды инициализирует бин Singleton - PullRequest
3 голосов
/ 17 февраля 2010

У меня есть одиночный 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 или что-то еще? Мысли?

Ответы [ 2 ]

1 голос
/ 18 сентября 2011

Эта проблема возникает, когда в ejb-jar.xml имя EJB не равно имени класса EJB.
Например:

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

В этом случае GF регистрирует два bean-компонента с разными именами JNDI («java: global / MySingletonBean» и «java: global / MyTestSingletonBean»). И затем при инициализации он создает два объекта, первый - MySingletonBean и второй - MyTestSingletonBean.
Также, если вы используете аннотацию @Resource для ресурсов внедрения, действия GF:
1) GF создает первый объект «MySingletonBean» и правильно вводит в него ресурсы;
2) GF создает второй объект «MyTestSingletonBean» и не может выполнить инъекцию (все введенные ресурсы равны нулю или значения по умолчанию).
Протестировано на GF 3.1 build 12 с комбо @Singleton @Startup.

1 голос
/ 17 февраля 2010

следующий синглтон:

@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);
    }
}

И следующий сервлет:

@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. Я не буду вдаваться в подробности, но проблема в том, что мне почему-то не удалось напрямую распознать мой проект как «Dynamic Web Module» 2.5, изначально была установлена ​​версия 2.3, и я думаю, что это как-то связано с ошибкой развертывания. на GFv3. После корректной настройки моего проекта (с фасетом, равным 2,5), его развертывание работало нормально. Так что я просто облажался.

...