package sagan;
import java.util.concurrent.ExecutorService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.metrics.CounterService;
import org.springframework.stereotype.Service;
@Service
class IndexerService {
private final ExecutorService executorService;
private final CounterService countersService;
private static final Log logger = LogFactory.getLog(IndexerService.class);
@Autowired
public IndexerService(ExecutorService executorService, CounterService countersService) {
this.executorService = executorService;
this.countersService = countersService;
}
public <T> void index(final Indexer<T> indexer) {
logger.debug("Indexing " + indexer.counterName());
for (final T indexable : indexer.indexableItems()) {
executorService.submit(() -> {
try {
indexer.indexItem(indexable);
countersService.increment("search.indexes." + indexer.counterName() + ".processed");
} catch (Exception e) {
String message =
String.format("Unable to index an entry of '%s' with id: '%s' -> (%s, %s)", indexer
.counterName(), indexer.getId(indexable), e.getClass().getName(), e
.getMessage());
logger.warn(message);
countersService.increment("search.indexes." + indexer.counterName() + ".errors.count");
}
});
}
countersService.increment("search.indexes." + indexer.counterName() + ".refresh.count");
}
}