package org.gbif.checklistbank.cli.matcher;
import org.gbif.checklistbank.cli.common.RabbitDatasetService;
import org.gbif.checklistbank.index.guice.RealTimeModule;
import org.gbif.checklistbank.index.guice.Solr;
import org.gbif.checklistbank.nub.lookup.NubMatchService;
import org.gbif.checklistbank.service.DatasetImportService;
import org.gbif.checklistbank.service.mybatis.guice.ChecklistBankServiceMyBatisModule;
import org.gbif.checklistbank.service.mybatis.guice.Mybatis;
import org.gbif.common.messaging.api.messages.ChecklistSyncedMessage;
import org.gbif.common.messaging.api.messages.MatchDatasetMessage;
import org.gbif.nub.lookup.straight.DatasetMatchFailed;
import org.gbif.nub.lookup.straight.IdLookup;
import org.gbif.nub.lookup.straight.IdLookupImpl;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Timer;
import com.google.inject.Key;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
public class MatcherService extends RabbitDatasetService<MatchDatasetMessage> {
private static final Logger LOG = LoggerFactory.getLogger(MatcherService.class);
private NubMatchService matcher;
private static final String QUEUE = "clb-matcher";
private final DatasetImportService sqlImportService;
private final DatasetImportService solrImportService;
private final MatcherConfiguration cfg;
private Timer timer;
public MatcherService(MatcherConfiguration cfg) {
super(QUEUE, cfg.poolSize, cfg.messaging, cfg.ganglia, "match", ChecklistBankServiceMyBatisModule.create(cfg.clb), new RealTimeModule(cfg.solr));
this.cfg = cfg;
sqlImportService = getInstance(Key.get(DatasetImportService.class, Mybatis.class));
solrImportService = getInstance(Key.get(DatasetImportService.class, Solr.class));
}
@Override
protected void initMetrics(MetricRegistry registry) {
super.initMetrics(registry);
timer = registry.timer("nub matcher process time");
}
@Override
protected void startUpBeforeListening() throws Exception {
// loads all nub usages directly from clb postgres - this can take a few minutes
IdLookup lookup = IdLookupImpl.temp().load(cfg.clb, false);
matcher = new NubMatchService(cfg.clb, lookup, sqlImportService, solrImportService, publisher);
}
@Override
public Class<MatchDatasetMessage> getMessageClass() {
return MatchDatasetMessage.class;
}
@Override
protected void process(MatchDatasetMessage msg) throws Exception {
final Timer.Context context = timer.time();
try {
LOG.info("Start matching dataset {}", msg.getDatasetUuid());
matcher.matchDataset(msg.getDatasetUuid());
// now also request new metrics from the analysis step
send(new ChecklistSyncedMessage(msg.getDatasetUuid(), new Date(), 0, 0));
LOG.info("Dataset {} matched sucessfully", msg.getDatasetUuid());
} catch (DatasetMatchFailed e) {
LOG.error("Dataset matching failed for {}", msg.getDatasetUuid(), e);
}
context.close();
}
@Override
protected void shutDown() throws Exception {
super.shutDown();
sqlImportService.close();
solrImportService.close();
}
}