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);

      // but rethrow for outside handling
      throw e;
    }
  }

}