gpt4 book ai didi

java - JEE 7 Scheduler如何在不阻塞调度程序的情况下 fork 任务

转载 作者:行者123 更新时间:2023-12-01 18:47:09 26 4
gpt4 key购买 nike

在 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

最佳答案

我建议您使用应用服务器提供的 ManagedExecutorService。鉴于您不需要 Worker 类成为 EJB,下面给出的代码应该可以解决问题。我没有尝试在 Wildfly 上运行它,但在 Payara Server 上进行了验证。

@Singleton
public class Scheduler {
private int counter = 0;
private static final Logger LOGGER = Logger.getLogger(Scheduler.class.getName());

@Resource
ManagedExecutorService mes;

@Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
public void atSchedule() throws InterruptedException {
LOGGER.info(String.format("%d. scheduler call - every five secs.", (++counter)));
mes.submit(() -> {
final Worker worker = new Worker(counter);
worker.doSomething();
});

LOGGER.info("Scheduler done.");

}
}

public class Worker {
private static final Logger LOGGER = Logger.getLogger(Worker.class.getName());
private int nr;

public Worker() {}

public Worker(final int nr) {
this.nr = nr;
}

public void doSomething() {
for(long i = 0; i < 10000000000L; i++) {
if(i % 1000000000 == 0) {
LOGGER.info(String.format("%d. Worker: i = %d", nr, i));
} // if
} // for
}
}

关于java - JEE 7 Scheduler如何在不阻塞调度程序的情况下 fork 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59809672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com