package org.gbif.occurrence.cli.index;
import org.gbif.common.messaging.MessageListener;
import org.gbif.common.search.solr.SolrServerType;
import org.gbif.common.search.solr.builders.CloudSolrServerBuilder;
import org.gbif.occurrence.search.writer.SolrOccurrenceWriter;
import com.google.common.base.Strings;
import com.google.common.util.concurrent.AbstractIdleService;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
/**
* A base class for services that will insert/update occurrences in the Occurrence Index.
*/
class IndexUpdaterService extends AbstractIdleService {
private final IndexingConfiguration configuration;
private MessageListener listener;
protected IndexUpdaterService(IndexingConfiguration configuration) {
this.configuration = configuration;
}
@Override
protected void shutDown() throws Exception {
if (listener != null) {
listener.close();
}
}
@Override
protected void startUp() throws Exception {
configuration.ganglia.start();
SolrOccurrenceWriter solrOccurrenceWriter = new SolrOccurrenceWriter(buildSolrServer(configuration),
configuration.commitWithinMs);
listener = new MessageListener(configuration.messaging.getConnectionParameters());
listener.listen(configuration.queueName, configuration.poolSize, new IndexUpdaterCallback(solrOccurrenceWriter));
}
/**
* Creates a Solr server instance according to the parameters defined in the idxConfiguration object.
*/
private static SolrClient buildSolrServer(IndexingConfiguration idxConfiguration) {
if (Strings.isNullOrEmpty(idxConfiguration.solrServerType)
|| SolrServerType.HTTP.name().equalsIgnoreCase(idxConfiguration.solrServerType)) {
return new HttpSolrClient(idxConfiguration.solrServer);
} else if (SolrServerType.CLOUD.name().equalsIgnoreCase(idxConfiguration.solrServerType)) {
CloudSolrServerBuilder cloudSolrServerBuilder = new CloudSolrServerBuilder();
cloudSolrServerBuilder.withDefaultCollection(idxConfiguration.solrCollection).withZkHost(idxConfiguration.solrServer);
return cloudSolrServerBuilder.build();
} else {
throw new IllegalArgumentException(String.format("Solr server type %s not supported",
idxConfiguration.solrServerType));
}
}
}