package mil.nga.giat.geowave.core.ingest.kafka;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import org.apache.avro.specific.SpecificRecordBase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import mil.nga.giat.geowave.core.ingest.avro.AvroFormatPlugin;
import mil.nga.giat.geowave.core.ingest.local.AbstractLocalFileDriver;
import mil.nga.giat.geowave.core.ingest.local.LocalInputCommandLineOptions;
/**
* This class actually executes the staging of data to a Kafka topic based on
* the available type plugin providers that are discovered through SPI.
*/
public class StageToKafkaDriver<T extends SpecificRecordBase> extends
AbstractLocalFileDriver<AvroFormatPlugin<?, ?>, StageKafkaData<?>>
{
private final static Logger LOGGER = LoggerFactory.getLogger(StageToKafkaDriver.class);
private final Map<String, AvroFormatPlugin<?, ?>> ingestPlugins;
private final KafkaProducerCommandLineOptions kafkaOptions;
public StageToKafkaDriver(
KafkaProducerCommandLineOptions kafkaOptions,
Map<String, AvroFormatPlugin<?, ?>> ingestPlugins,
LocalInputCommandLineOptions localOptions ) {
super(
localOptions);
this.kafkaOptions = kafkaOptions;
this.ingestPlugins = ingestPlugins;
}
@Override
protected void processFile(
final File file,
final String typeName,
final AvroFormatPlugin<?, ?> plugin,
final StageKafkaData<?> runData ) {
try {
final Producer<String, Object> producer = (Producer<String, Object>) runData.getProducer(
typeName,
plugin);
final Object[] avroRecords = plugin.toAvroObjects(file);
for (final Object avroRecord : avroRecords) {
final KeyedMessage<String, Object> data = new KeyedMessage<String, Object>(
typeName,
avroRecord);
producer.send(data);
}
}
catch (final Exception e) {
LOGGER.info(
"Unable to send file [" + file.getAbsolutePath() + "] to Kafka topic: " + e.getMessage(),
e);
}
}
public boolean runOperation(
String inputPath ) {
final Map<String, AvroFormatPlugin<?, ?>> stageToKafkaPlugins = ingestPlugins;
try {
final StageKafkaData<T> runData = new StageKafkaData<T>(
kafkaOptions.getProperties());
processInput(
inputPath,
stageToKafkaPlugins,
runData);
runData.close();
return true;
}
catch (final IOException e) {
LOGGER.error(
"Unable to process input",
e);
return false;
}
}
}