package org.gbif.occurrence.cli.index;
import org.gbif.common.messaging.AbstractMessageCallback;
import org.gbif.common.messaging.api.messages.OccurrenceMutatedMessage;
import org.gbif.occurrence.search.writer.SolrOccurrenceWriter;
import java.util.concurrent.TimeUnit;
import com.yammer.metrics.Metrics;
import com.yammer.metrics.core.Counter;
import com.yammer.metrics.core.Timer;
import com.yammer.metrics.core.TimerContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Callback handler that processes messages for updates and insertions on the Occurrence Index.
*/
class IndexUpdaterCallback extends AbstractMessageCallback<OccurrenceMutatedMessage> {
private static final Logger LOG = LoggerFactory.getLogger(IndexUpdaterCallback.class);
private final Counter messageCount = Metrics.newCounter(getClass(), "messageCount");
private final Counter newOccurrencesCount = Metrics.newCounter(getClass(), "newIndexedOccurrencesCount");
private final Counter updatedOccurrencesCount = Metrics.newCounter(getClass(), "updatedIndexedOccurrencesCount");
private final Counter deletedOccurrencesCount = Metrics.newCounter(getClass(), "deletedIndexedOccurrencesCount");
private final Timer writeTimer = Metrics.newTimer(getClass(), "occurrenceIndexWrites", TimeUnit.MILLISECONDS,
TimeUnit.SECONDS);
private final SolrOccurrenceWriter solrOccurrenceWriter;
/**
* Default constructor.
*/
public IndexUpdaterCallback(SolrOccurrenceWriter solrOccurrenceWriter) {
this.solrOccurrenceWriter = solrOccurrenceWriter;
}
@Override
public void handleMessage(OccurrenceMutatedMessage message) {
LOG.debug("Handling [{}] occurrence", message.getStatus());
messageCount.inc();
TimerContext context = writeTimer.time();
try {
switch (message.getStatus()) {
case NEW:
// create occurrence
solrOccurrenceWriter.update(message.getNewOccurrence());
newOccurrencesCount.inc();
break;
case UPDATED:
// update occurrence
solrOccurrenceWriter.update(message.getNewOccurrence());
updatedOccurrencesCount.inc();
break;
case DELETED:
// delete occurrence
solrOccurrenceWriter.delete(message.getOldOccurrence());
deletedOccurrencesCount.inc();
break;
case UNCHANGED:
break;
}
} catch (Exception e) {
LOG.error("Error while updating occurrence index for [{}], error [{}]", message.getStatus(), e);
} finally {
context.stop();
}
}
}