]
Brian Stansberry commented on WFLY-12329:
-----------------------------------------
WFCORE-4291 is about allowing 'graceful startup' to be turned off in some way.
This is related in the sense that this is a 'graceful startup' issue. Doing
WFCORE-4291 means examining code that is using 'suspend' as a way to control
startup behavior and to see if that is appropriate.
ManagedScheduledExecutorService should be only available after server
is ready
------------------------------------------------------------------------------
Key: WFLY-12329
URL:
https://issues.jboss.org/browse/WFLY-12329
Project: WildFly
Issue Type: Bug
Components: Concurrency Utilities
Affects Versions: 17.0.1.Final
Reporter: nimo stephan
Assignee: Eduardo Martins
Priority: Major
I use a *ManagedScheduledExecutorService* to execute tasks periodically:
{code:java}
@Startup
@Singleton
public class TaskScheduler {
@Resource
ManagedScheduledExecutorService executorService;
@PostConstruct
public void init() {
executorService.scheduleAtFixedRate(this::task, 0, 5, TimeUnit.SECONDS);
}
public void task() {
System.out.println("long running task:" + LocalTime.now());
}
}
{code}
Wildfly throws a few exceptions as long as server is not fully initiated and in
"suspend"-mode:
{code:java}
12:44:12,715 ERROR [org.jboss.as.ee]
(EE-ManagedScheduledExecutorService-default-Thread-3) WFLYEE0110: Failed to run scheduled
task: java.lang.IllegalStateException: WFLYEE0111: Cannot run scheduled task
my.Task$$Lambda$1041/0x000000080240a040@5ee966ec as container is suspended
at
org.jboss.as.ee@17.0.1.Final//org.jboss.as.ee.concurrent.ControlPointUtils$ControlledScheduledRunnable.run(ControlPointUtils.java:164)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
at
org.glassfish.javax.enterprise.concurrent//org.glassfish.enterprise.concurrent.internal.ManagedScheduledThreadPoolExecutor$ManagedScheduledFutureTask.access$201(ManagedScheduledThreadPoolExecutor.java:383)
at
org.glassfish.javax.enterprise.concurrent//org.glassfish.enterprise.concurrent.internal.ManagedScheduledThreadPoolExecutor$ManagedScheduledFutureTask.run(ManagedScheduledThreadPoolExecutor.java:534)
at
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:835)
at
org.glassfish.javax.enterprise.concurrent//org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)
{code}
I use _ManagedScheduledExecutorService_ instead of _ScheduledExecutorService_ in JEE
because, *ManagedScheduledExecutorService* should be managed by JEE. Hence, the server
should also manage and guarantee not to fire the executorService until the server is ready
(and EJBs are available).