NotificationListenerCallable.java
package gov.usgs.earthquake.distribution;
import java.util.concurrent.Callable;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* A Callable object for deferred listener notification.
*/
public class NotificationListenerCallable implements Callable<Void> {
private static final Logger LOGGER = Logger
.getLogger(NotificationListenerCallable.class.getName());
private final NotificationListener listener;
private final NotificationEvent event;
/**
* Create an ExecutorListenerNotifierCallable.
*
* @param listener
* the listener to notify
* @param event
* the notification to send
*/
public NotificationListenerCallable(
final NotificationListener listener, final NotificationEvent event) {
this.listener = listener;
this.event = event;
}
public Void call() throws Exception {
try {
listener.onNotification(event);
return null;
} catch (Exception e) {
LOGGER.log(Level.WARNING, "["
+ event.getNotificationReceiver().getName()
+ "] listener (" + listener.getName()
+ ") threw exception, for product id = "
+ event.getNotification().getProductId(), e);
// track exception
Notification notification = event.getNotification();
new ProductTracker(notification.getTrackerURL()).exception(listener
.getClass().getCanonicalName(),
notification.getProductId(), e);
// but rethrow for outside handling
throw e;
}
}
}