2014-09-19 75 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