> On 13 Nov 2015, at 09:04, Jaroslav Bachorik <jaroslav.bacho...@oracle.com> 
> wrote:
> 
> On 13.11.2015 08:05, Shanliang JIANG wrote:
>> Hi Jaroslav,
>> 
>> The issue is that after a JMX client is terminated, its
>> ClientNotifForwarder continues deliver a job to a user specific
>> Executor, I think a better fix to not allow this happen.
>> 
>> I am not sure that it is a good solution to check
>> RejectedExecutionException, here is the Java doc:
>> "Exception thrown by an |Executor|
>> <file:///Users/sjiang/projects/jdk/workspace/fix/javadoc9/java/util/concurrent/Executor.html>
>>  when
>> a task cannot be accepted for execution."
>> 
>> it means that  the exception is possibly thrown in other cases too, like
>> too many tasks if it is shared. So ignore simply this exception in case
>> of not “shouldStop()” seems incorrect.
>> 
>> And Executor is an interface and a user could provide any implementation
>> class, so possible a user would throw any another RuntimeException or
>> even an Error in this case.
> Well, the main problem is the self-rescheduling part. Normally, a scheduled 
> executor would be used to perform periodic tasks and it would know how to 
> handle its own shutdown. But, unfortunately, the more generic Executor is 
> required. If only it were at least ExecutorService where you can use 
> 'isShutdown()' method ...
> 
> The fact that the user provided executor can throw RejectedExecutionException 
> at its discretion opens whole another can of worms. The code as it is now 
> will simply bail out of the notification fetching loop with the thrown 
> exception. Sadly, there is no cleanup performed so the ClientNotifForwarder 
> will stay in inconsistent state (marked as STARTED when it is, in fact, 
> TERMINATED, notification listeners not de-registered, etc.). To make things 
> worse there seem to be no official documentation as what is the expected 
> behaviour of the externally provided executor. The only documentation to the 
> env property "jmx.remote.x.fetch.notifications.executor" is in 
> ClientNotifForwarder.java (L125-128) and it is not exactly exhaustive.

Here is my suggestion (I create a webrev because it is easier to look at):
        http://cr.openjdk.java.net/~sjiang/JDK-8141591/00/ 
<http://cr.openjdk.java.net/~sjiang/JDK-8141591/00/>

It does rescheduling within the synchronisation, which makes sure to not 
deliver a new task after a JMX client is terminated. 

This class is complicated because the fetching should be stopped if no more 
listener or during re-connection, but then could be re-started at anytime.

Shanliang


> 
> -JB-
> 
> 
>> 
>> Shanliang
>> > On 12 Nov 2015, at 13:13, Jaroslav Bachorik
>> > <jaroslav.bacho...@oracle.com <mailto:jaroslav.bacho...@oracle.com>>
>> > wrote:
>> >
>> > Please, review the following test change
>> >
>> > Issue : https://bugs.openjdk.java.net/browse/JDK-8141591
>> > Webrev: http://cr.openjdk.java.net/~jbachorik/8141591/webrev.00
>> >
>> > In rare circumstances, when an external executor is provided, the
>> > ClientNotifForwarder$NotifFetcher.doRun() method might fail because of
>> > RejectedExecutionException caused by the executor being externally
>> > shut down.
>> >
>> > The patch adds a guard against this possibility. If the executor has
>> > been shut down the fetcher will also properly stop.
>> >
>> > Thanks,
>> >
>> > -JB-
>> 
> 

Reply via email to