2014-09-19 61 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豆使用,所以當然我的代碼因爲我在計時器上得到了一個不同的bean,所以會出現空值deviceHandle

因此,我的問題是什麼是這個要求的最佳做法 - 我應該在哪裏藏起我的手柄? @Inject a @Singleton@Inject an @ApplicationScoped bean? @Inject從我的ServletContextListener豆,並存儲在那裏的狀態(我這樣做與另一個真正的@Stateless計時器滴答)?

回答

2

最明顯的解決方案是將您的MyClass本身變成@Singleton

EJB 3.1規範允許在單例中使用@Schedulespec的第18.2.3節甚至包含以下示例:

@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'? – 2014-09-19 02:07:32

+0

到目前爲止,我只使用'@ javax.ejb.singleton'完成了這項工作。 – 2014-09-19 02:08:35