package org.codelibs.elasticsearch.taste.writer;
import java.io.IOException;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import org.codelibs.elasticsearch.taste.exception.TasteException;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.logging.Loggers;
public class ObjectWriter extends AbstractWriter {
private static final ESLogger logger = Loggers.getLogger(ItemWriter.class);
private ArrayBlockingQueue<Boolean> queue;
public ObjectWriter(final Client client, final String index,
final String type, final int capacity) {
super(client, index, type);
queue = new ArrayBlockingQueue<>(capacity);
}
public void write(final Map<String, Object> rootObj) {
countUp();
try {
rootObj.put(timestampField, new Date());
client.prepareIndex(index, type).setSource(rootObj)
.execute(new ActionListener<IndexResponse>() {
@Override
public void onResponse(final IndexResponse response) {
if (logger.isDebugEnabled()) {
logger.debug(
"Response: {}/{}/{}, Created: {}, Version: {}",
response.getIndex(), response.getType(),
response.getId(), response.isCreated(),
response.getVersion());
}
countDown();
}
@Override
public void onFailure(final Throwable e) {
logger.error("Failed to write " + rootObj, e);
countDown();
}
});
} catch (final Throwable t) {
countDown();
throw new TasteException(t);
}
}
@Override
public void close() throws IOException {
for (int i = 0; i < 60; i++) {
if (queue.isEmpty()) {
break;
}
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
break;
}
}
}
protected void countUp() {
try {
queue.put(Boolean.TRUE);
} catch (InterruptedException e) {
throw new TasteException(e);
}
}
protected void countDown() {
queue.poll();
}
}