我创建了带有@Singleton、@Schedule 和@Timeout 注释的简单示例,以尝试它们是否能解决我的问题。
场景是这样的:EJB 每 5 秒调用一次“检查”函数,如果满足某些条件,它将创建单个动作计时器,该计时器将以异步方式调用一些长时间运行的进程。(这是一种队列实现类型的东西)。然后它继续检查,但是当长时间运行的进程在那里时,它不会启动另一个。
下面是我想出的代码,但这个解决方案不起作用,因为看起来我正在进行的异步调用实际上阻塞了我的 @Schedule 方法。
@Singleton
@Startup
public class GenerationQueue {
private Logger logger = Logger.getLogger(GenerationQueue.class.getName());
private List<String> queue = new ArrayList<String>();
private boolean available = true;
@Resource
TimerService timerService;
@Schedule(persistent=true, minute="*", second="*/5", hour="*")
public void checkQueueState() {
logger.log(Level.INFO,"Queue state check: "+available+" size: "+queue.size()+", "+new Date());
if (available) {
timerService.createSingleActionTimer(new Date(), new TimerConfig(null, false));
}
}
@Timeout
private void generateReport(Timer timer) {
logger.info("!!--timeout invoked here "+new Date());
available = false;
try {
Thread.sleep(1000*60*2); // something that lasts for a bit
} catch (Exception e) {}
available = true;
logger.info("New report generation complete");
}
我在这里缺少什么或者我应该尝试不同的方法?欢迎任何想法:)
使用 Glassfish 3.0.1 最新版本进行测试 - 忘了提