将状态添加到@Stateless bean

时间:2014-09-19 01:36:36

标签: java ejb

我在监视连接句柄的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计时器打勾)?

1 个答案:

答案 0 :(得分: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() {
    // ...
    }
}