2014-09-19 5 views
1

У меня есть некоторый код компонента, который следит за ручку подключения:Добавление состояния к @Stateless боба

@Stateless 
public class MyClass { 
    private CloseableHttpAsyncClient deviceHandle = null; 
    @Schedule(second="*/30", minute="*", hour="*", persistent=false) 
    void checkConnection() 
    { 
     if (deviceHandle != null) { 
      if (deviceHandle.isRunning()) { 
       // Ping connection 
      } 
      else { 
       deviceHandle = reconnectToDevice(); 
      } 
     } 
    } 

    public void initialise() { 
     deviceHandle = connectToDevice(); 
    } 
} 

В соответствии с EJB 3.1 спецификации @Schedule могут быть использованы только на @Stateless бобов, поэтому, конечно, мой код не получается, потому что я получаю другой компонент по таймеру с нулевым deviceHandle.

Таким образом, мой вопрос в том, что является лучшей практикой для этого требования - где я должен хранить мой дескриптор? @Inject a @Singleton? @Inject a @ApplicationScoped bean? @Inject фасоль из моего ServletContextListener и сохраните состояние там (я делаю это с другим действительно @Stateless таймером)?

ответ

2

Наиболее очевидным решением является превращение MyClass в себя (+) @Singleton.

Спецификация EJB 3.1 позволяет использовать @Schedule в одиночных играх. В разделе 18.2.3 документа spec содержится даже следующий пример:

@Singleton 
public class CacheBean { 
    Cache cache; 
    // Setup an automatic timer to refresh 
    // the Singleton instance cache every 10 minutes 
    @Schedule(minute=”*/10”, hour=”*”, persistent=false) 
    public void refresh() { 
    // ... 
    } 
} 
+0

Ах! Такой простой ответ. Я пробовал почти любую комбинацию аннотаций, за исключением этого. '@ javax.ejb.Singleton' не так ли, а не' @ javax.inject.Singleton'? –

+0

Я только делал это с '@ javax.ejb.singleton'. –

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