JEE 7 Scheduler如何在不阻止调度程序的情况下派生任务

问题描述 投票:0回答:1

在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
java multithreading jakarta-ee task scheduler
1个回答
0
投票

不要以为这是最好的主意,但是:

@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();
}   

}

© www.soinside.com 2019 - 2024. All rights reserved.