Shutdown issues with ManagedScheduledExecutorService

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Shutdown issues with ManagedScheduledExecutorService

ChrisOwens
This is with TomEE plus 7.0.5

I'm getting /Bean ... has been undeployed/ exception on shutdown, which is
preventing orderly cleanup.  The issue appears to be that a POJO
implementing Runnable is scheduled for periodic execution; that POJO was
created with a reference to a @Stateless bean; and the @Stateless bean is
undeployed before the POJO completes execution.

"Supervisor" is a @Singleton. Supervisor injects, via @Resource, a
ManagedScheduledExecutorService. I don't do any configuration on this
service; I just accept what the container gives me.

"Processor" is a @Stateless bean that does all sorts of work including
entity management, transactions, etc.

Supervisor obtains an instance of Processor via @Inject.

"Runner" is a POJO that implements Runnable. One of its constructor method
accepts an instance of Processor. (as an aside, The run method of Runner
checks for Thread.currentThread().isInterrupted and returns immediately if
true. It also catches InterruptedException (which might be thrown by some of
the blocking methods it invokes), and calls
Thread.currentThread().interrupt() and returns.)

To get the work done on a regular basis, Supervisor creates an instance of
Runner, passing Processor as an argument to its constructor, and then uses
the ManagedScheduledExecutorService to run with fixed delay.  Supervisor
keeps a list of all the Runner tasks it has created.

Supervisor has a stop() method that performs task.cancel(true) on every
Runner task it has created. I have tried, alternatively, annotating the stop
method with @PreDestroy, or explicitly invoking it from a
ServletContextListener.

At shutdown, it looks like Processor is being undeployed before the tasks in
Supervisor are canceled. It appears that the container doesn't know that
Processor needs to be kept deployed while the Runner tasks are still active.

This happens before the Supervisor's stop() method is invoked:


I'm having a hard time reducing this to a test case I can provide.





--
Sent from: http://tomee-openejb.979440.n4.nabble.com/TomEE-Dev-f982480.html
Reply | Threaded
Open this post in threaded view
|

Re: Shutdown issues with ManagedScheduledExecutorService

Romain Manni-Bucau
Did you try a semaphore waiting all tasks are done? It likely also needs a
boolean to prevent new submissions before starting waiting for completion.

Side note: @Schedule sounds not bad for your use case ;)

Le lun. 29 oct. 2018 20:55, ChrisOwens <[hidden email]> a écrit :

> This is with TomEE plus 7.0.5
>
> I'm getting /Bean ... has been undeployed/ exception on shutdown, which is
> preventing orderly cleanup.  The issue appears to be that a POJO
> implementing Runnable is scheduled for periodic execution; that POJO was
> created with a reference to a @Stateless bean; and the @Stateless bean is
> undeployed before the POJO completes execution.
>
> "Supervisor" is a @Singleton. Supervisor injects, via @Resource, a
> ManagedScheduledExecutorService. I don't do any configuration on this
> service; I just accept what the container gives me.
>
> "Processor" is a @Stateless bean that does all sorts of work including
> entity management, transactions, etc.
>
> Supervisor obtains an instance of Processor via @Inject.
>
> "Runner" is a POJO that implements Runnable. One of its constructor method
> accepts an instance of Processor. (as an aside, The run method of Runner
> checks for Thread.currentThread().isInterrupted and returns immediately if
> true. It also catches InterruptedException (which might be thrown by some
> of
> the blocking methods it invokes), and calls
> Thread.currentThread().interrupt() and returns.)
>
> To get the work done on a regular basis, Supervisor creates an instance of
> Runner, passing Processor as an argument to its constructor, and then uses
> the ManagedScheduledExecutorService to run with fixed delay.  Supervisor
> keeps a list of all the Runner tasks it has created.
>
> Supervisor has a stop() method that performs task.cancel(true) on every
> Runner task it has created. I have tried, alternatively, annotating the
> stop
> method with @PreDestroy, or explicitly invoking it from a
> ServletContextListener.
>
> At shutdown, it looks like Processor is being undeployed before the tasks
> in
> Supervisor are canceled. It appears that the container doesn't know that
> Processor needs to be kept deployed while the Runner tasks are still
> active.
>
> This happens before the Supervisor's stop() method is invoked:
>
>
> I'm having a hard time reducing this to a test case I can provide.
>
>
>
>
>
> --
> Sent from:
> http://tomee-openejb.979440.n4.nabble.com/TomEE-Dev-f982480.html
>