RFR: 8043306 - Provide a replacement for the API that allowed to listen for LogManager configuration changes
Peter Levart
peter.levart at gmail.com
Fri Sep 12 11:55:17 UTC 2014
On 09/12/2014 12:45 PM, Daniel Fuchs wrote:
>> However the listeners are to be invoked in the same order they have been
>> added.
>
> I am still unconvinced this is worth the additional
> complexity it would bring to the implementation.
> The deprecated methods were using HashMap to store listeners,
> and therefore the order in which listeners were invoked was also
> undefined. Nobody has ever complained.
What about using a synchronized LinkedHashMap<ListenerAction,
ListenerAction>() with the following double-purpose inner class:
private static final class ListenerAction implements
PrivilegedAction<Void> {
private final Runnable listener;
private final AccessControlContext acc;
ListenerAction(Runnable listener, AccessControlContext acc) {
this.listener = listener;
this.acc = acc;
}
void invoke() {
if (acc == null) {
run();
} else {
AccessController.doPrivileged(this, acc);
}
}
// not to be run() directly - use invoke() instead
@Override
public Void run() {
listener.run();
return null;
}
@Override
public int hashCode() {
return System.identityHashCode(listener);
}
@Override
public boolean equals(Object obj) {
return (obj instanceof ListenerAction) &&
((ListenerAction) obj).listener == listener;
}
}
>
> (http://hg.openjdk.java.net/jdk8u/jdk8u-dev/jdk/file/3ae82f0c6b31/src/share/classes/java/util/logging/LogManager.java#l1431)
>
>
>
>> I'd rather run the listeners in try/catch and throw the 1st exception at
>> the end.
>> Defining the 1st however requires obeying the order the listeners have
>> been added.
>> As far as I see there is no documentation how the listeners are supposed
>> to behave or be invoked.
>
> We could do that - invoke all listeners and rethrow the exception
> caught by the first listener that failed (on the basis that if any other
> listener subsequently fails it may be because the previous listener
> has left the system in an inconsistent state, and that therefore
> the first exception caught has 'more value' than the others).
>
> I am not completely convinced this is a better behavior than
> simply stopping invoking listeners at the first exception.
> I wonder if there would be a good wording to say that listeners
> are not supposed to throw, but that if they do, the exceptions
> will be propagated...
You're probably right. But in case you changed your mind, you could
rethrow the 1st exception thrown, with possible further exceptions added
to it a suppressed exceptions...
Regards, Peter
>
> best regards,
>
> -- daniel
More information about the core-libs-dev
mailing list