package net.lenards.kinesis.types;
import java.io.Serializable;
import java.util.List;
import net.lenards.kinesis.KinesisCheckpointState;
import net.lenards.kinesis.types.JKinesisReceiver;
import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessorCheckpointer;
import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessor;
import com.amazonaws.services.kinesis.clientlibrary.types.ShutdownReason;
import com.amazonaws.services.kinesis.model.Record;
public class EventRecordProcessor implements IRecordProcessor, Serializable {
public static final long DEFAULT_INTERVAL_IN_MS = 10000L;
private String shardId;
private String workerId;
private JKinesisReceiver receiver;
private KinesisCheckpointState checkpointState;
public EventRecordProcessor(JKinesisReceiver receiver, String workerId,
KinesisCheckpointState checkpointState) {
this.workerId = workerId;
this.receiver = receiver;
this.checkpointState = checkpointState;
}
@Override
public void initialize(String shardId) {
this.shardId = shardId;
}
@Override
public void processRecords(List<Record> records,
IRecordProcessorCheckpointer checkpointer) {
if (!receiver.isStopped()) {
// this processor works in tandem with the Spark Streaming receiver
handleRecords(records);
checkpointIfNeeded(checkpointer);
}
}
/**
* {@inheritDoc}
*/
@Override
public void shutdown(IRecordProcessorCheckpointer checkpointer, ShutdownReason reason) {
// Important to checkpoint after reaching end of shard,
// so we can start processing data from child shards.
if (reason == ShutdownReason.TERMINATE) {
performCheckpoint(checkpointer);
}
}
private void handleRecords(List<Record> records) {
for (Record r : records) {
// NOTE:
// this is how we're passing processed data back to Spark Streaming
this.receiver.store(r.getPartitionKey() + "|" +
new String(r.getData().array()));
}
}
private void checkpointIfNeeded(IRecordProcessorCheckpointer checkpointer) {
if (checkpointState.shouldCheckpoint()) {
performCheckpoint(checkpointer);
checkpointState.advanceCheckpoint();
}
}
private void performCheckpoint(IRecordProcessorCheckpointer checkpointer) {
try {
checkpointer.checkpoint();
} catch (Exception ex) {
System.out.println("Sky is falling! Why? " + ex);
}
}
}