IndexerListenerCallable.java
package gov.usgs.earthquake.indexer;
import gov.usgs.earthquake.distribution.ProductTracker;
import java.util.concurrent.Callable;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* A Callable object for deferred indexer listener notification.
*/
public class IndexerListenerCallable implements Callable<Void> {
/** Logger object */
public static final Logger LOGGER = Logger
.getLogger(IndexerListenerCallable.class.getName());
private final IndexerListener listener;
private final IndexerEvent event;
/**
* Get a callable object for deferred listener notification.
*
* @param listener
* the listener to notify
* @param event
* the notification to send
*/
public IndexerListenerCallable(final IndexerListener listener,
final IndexerEvent event) {
this.listener = listener;
this.event = event;
}
public Void call() throws Exception {
try {
listener.onIndexerEvent(event);
return null;
} catch (Exception e) {
ProductSummary summary = event.getSummary();
LOGGER.log(Level.WARNING, "["
+ event.getIndexer().getName()
+ "] listener ("
+ listener.getName()
+ ") threw exception"
+ (summary != null ? ", for product id="
+ summary.getId().toString() : ""), e);
// track exception
if (summary != null) {
new ProductTracker(summary.getTrackerURL()).exception(listener
.getClass().getCanonicalName(), summary.getId(), e);
}
// but rethrow for outside handling
throw e;
}
}
}