我在监视连接句柄的bean中有一些代码:
@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上使用,所以当然我的代码失败了,因为我在计时器上得到一个不同的bean,并且为空deviceHandle
因此,我的问题是这个要求的最佳做法是什么 - 我应该把手柄藏在哪里? @Inject
一个@Singleton
? @Inject
一个@ApplicationScoped
豆? @Inject
来自ServletContextListener
的bean并将状态存储在那里(我用另一个真正的@Stateless
计时器打勾)?
答案 0 :(得分:2)
最明显的解决方案是将您的MyClass
转换为@Singleton
。
EJB 3.1规范确实允许在单例中使用@Schedule
。 spec的第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() {
// ...
}
}