package com.neverwinterdp.kafka.producer;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
public class WaittingAckProducerRecordHolder<K, V> {
private int maxSize = 1000;
private LinkedHashMap<Long, WaittingAckProducerRecord<K,V>> buffer = new LinkedHashMap<Long, WaittingAckProducerRecord<K, V>>();
public int size() { return buffer.size(); }
public List<WaittingAckProducerRecord<K,V>> getNeedToResendRecords() {
List<WaittingAckProducerRecord<K,V>> holder = new ArrayList<WaittingAckProducerRecord<K,V>>();
synchronized(buffer) {
for(WaittingAckProducerRecord<K,V> sel : buffer.values()) {
if(sel.isNeedToResend()) holder.add(sel);
}
}
return holder;
}
public void add(WaittingAckProducerRecord<K, V> record, long timeout) throws Exception {
if(buffer.size() >= maxSize) {
waitForAvailableBuffer(timeout);
}
synchronized(buffer) {
buffer.put(record.getId(), record);
}
}
public WaittingAckProducerRecord<K,V> onSuccess(long recordId) {
WaittingAckProducerRecord<K,V> record = null ;
synchronized (buffer) {
record = buffer.remove(recordId);
}
notifyForAvailableBuffer();
return record;
}
public WaittingAckProducerRecord<K,V> onFail(long recordId) {
WaittingAckProducerRecord<K,V> record = null ;
synchronized(buffer) {
record = buffer.get(recordId);
record.setNeedToResend(true);
}
return record;
}
synchronized void waitForAvailableBuffer(long waitTime) throws InterruptedException {
wait(waitTime);
}
synchronized void notifyForAvailableBuffer() {
notify();
}
}