在JEE 7 WildFly环境中,我想执行任务(工作者类的方法)不阻塞调度程序。这样调度程序就可以启动多个独立于调度程序运行的“任务/线程”(即发即忘)。
在普通的旧Java中,我只需要启动一个新线程,但是在托管容器中,这是禁止的。
我该如何实现?
这是一个简短的原始示例(不起作用),以阐明我想做什么:
@Startup
@Singleton
public class MyScheduler {
public static final Logger LOGGER = LogManager.getLogger(MyScheduler.class);
private int counter = 0;
@Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
public void atSchedule() throws InterruptedException {
LOGGER.info("{}. scheduler call - every five secs.", (++counter));
final Worker worker = new Worker(counter);
worker.doSomethingWithoutBlocking();
LOGGER.info("Scheduler done.");
}
} // class MyScheduler
@Stateless
@Asynchronous
public class Worker {
public static final Logger LOGGER = LogManager.getLogger(Worker.class);
private int nr;
public Worker() {}
public Worker(final int nr) {
this.nr = nr;
}
@Asynchronous
public void doSomethingWithoutBlocking() {
for(long i = 0; i < 10000000000L; i++) {
if(i % 1000000000 == 0) {
LOGGER.info("{}. Worker: i = {}", nr, i);
} // if
} // for
}
} // class Worker
不要以为这是最好的主意,但是:
@Startup
@Singleton
public class MyScheduler {
public static final Logger LOGGER = LogManager.getLogger(MyScheduler.class);
private int counter = 0;
@Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
public void atSchedule() throws InterruptedException {
LOGGER.info("{}. scheduler call - every five secs.", (++counter));
final Worker worker = new Worker(counter);
runWithoutBlocking(worker);
LOGGER.info("Scheduler done.");
}
@Async
void runWithoutBlocking(Worker worker) {
worker.doSomethingWithoutBlocking();
}
}