package net.johnewart.gearman.engine.storage;
import com.google.common.collect.ImmutableList;
import org.joda.time.LocalDateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.SynchronousQueue;
public class MemoryExceptionStorageEngine implements ExceptionStorageEngine {
private static Logger LOG = LoggerFactory.getLogger(PostgresExceptionStorageEngine.class);
private final Map<String, ExceptionData> exceptionDataMap;
private final LinkedList<String> jobHandles;
private final int maxEntries;
public MemoryExceptionStorageEngine(final int maxEntries) {
this.exceptionDataMap = new ConcurrentHashMap<>();
this.jobHandles = new LinkedList<>();
this.maxEntries = maxEntries;
LOG.debug("Starting memory exception storage engine with " + maxEntries + " max. entries.");
}
@Override
public boolean storeException(String jobHandle, String uniqueId, byte[] jobData, byte[] exceptionData) {
synchronized (jobHandles) {
if (jobHandles.size() == maxEntries) {
String toRemove = jobHandles.poll();
exceptionDataMap.remove(toRemove);
}
}
ExceptionData data = new ExceptionData(jobHandle, uniqueId, jobData, exceptionData, new LocalDateTime());
jobHandles.offer(jobHandle);
exceptionDataMap.put(jobHandle, data);
return true;
}
@Override
public ImmutableList<String> getFailedJobHandles() {
return ImmutableList.copyOf(jobHandles);
}
@Override
public ImmutableList<ExceptionData> getExceptions(int pageNum, int pageSize) {
int offset = pageSize * (pageNum - 1);
List<ExceptionData> exceptionDatas = new ArrayList<>(pageSize);
if(offset < jobHandles.size()) {
for (int i = 0; i < pageSize; i++) {
int idx = offset + i;
if(idx >= getCount()) break;
String jobHandle = jobHandles.get(idx);
exceptionDatas.add(exceptionDataMap.get(jobHandle));
}
}
return ImmutableList.copyOf(exceptionDatas);
}
@Override
public int getCount() {
return jobHandles.size();
}
}