2010-02-17 5 views
3

У меня есть singleton ejb, который дважды инициализируется. Я понятия не имею, почему, и он полностью отстаивает мысль о том, чтобы иметь один синглтон, насколько я могу судить. Любая помощь будет оценена. Как вы можете видеть, я попытался включить статическое булево значение, чтобы предотвратить множественную инициализацию (не то, что это необходимо), но это не имело значения.Инициализация стеклянной рыбы Singleton bean double

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  ] [email protected] 
2010-02-17 16:06:14,233 INFO [AutoDeployer  :DataModelBean  ] [email protected] 

Является ли это создание 2 бобы !! или он развертывает приложение дважды?

В качестве альтернативы я использую стеклянную рыбку v3, достаточно ли зрелой? Должен ли я использовать v2 или что-то еще? Мысли?

+3

AFAIK, '@ Singleton' - это новая функция EJB 3.1, поэтому GFv2 не является вариантом. –

+0

Согласен, и я предпочел бы остаться с v3, но мне нужно решить такие проблемы. – James

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

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

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

+0

какая версия вы используете? – vkraemer

+0

@vkraemer Я ошибался, классы копируются в 'eclipseApps/$ projectName/WEB-INF/classses', но стеклянная планета жалуется на следующее исключение:' java.lang.RuntimeException: не удается загрузить модуль EJB. DeploymentContext не содержит архив EJB Check для обеспечения правильной упаковки для/home/pascal/opt/glassfishv3/glassfish/domains/domain1/eclipseApps/maven-ejb31-testcase'. Но, как я уже сказал, мои занятия есть. Что касается версии, кажется, я использую com.sun.enterprise.jst.server.sunappsrv (1.0.40). –

+0

@vkraemer На самом деле, плагин GlassFish Eclipse отлично работает. Возможно, это может дать более значимую информацию, но у меня все получилось, когда мое приложение было признано 2.5 динамическим веб-модулем. –

1

Эта проблема возникает, когда в 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» и не работает при инъекции (все введенные ресурсы равны нулю или значениям по умолчанию).
Протестировано на GF 3.1 build 12 с @Singleton @Startup комбо.

Смежные вопросы