package forklift.message; import forklift.connectors.ConnectorException; import forklift.connectors.ForkliftMessage; import forklift.consumer.parser.KeyValueParser; import forklift.controller.KafkaController; import forklift.producers.KafkaForkliftProducer; import org.apache.avro.generic.GenericRecord; import org.apache.kafka.clients.consumer.ConsumerRecord; public class KafkaMessage extends ForkliftMessage { private final KafkaController controller; private final ConsumerRecord<?, ?> consumerRecord; public KafkaMessage(KafkaController controller, ConsumerRecord<?, ?> consumerRecord) { this.controller = controller; this.consumerRecord = consumerRecord; createMessage(); } public ConsumerRecord<?, ?> getConsumerRecord() { return this.consumerRecord; } @Override public boolean acknowledge() throws ConnectorException { try { return controller.acknowledge(consumerRecord); } catch (InterruptedException e) { throw new ConnectorException("Error acknowledging message"); } } @Override public String getId() { return consumerRecord.topic() + "-" + consumerRecord.partition() + "-" + consumerRecord.offset(); } /** * <strong>WARNING:</strong> Called from constructor */ private final void createMessage() { String message = parseRecord(); if (message != null) { setMsg(message); } else{ this.setFlagged(true); this.setWarning("Unable to parse message for topic: " + consumerRecord.topic() + " with value: " + consumerRecord.value()); } } private final String parseRecord(){ Object value = null; if (consumerRecord.value() instanceof GenericRecord) { GenericRecord genericRecord = (GenericRecord)consumerRecord.value(); Object properties = genericRecord.get(KafkaForkliftProducer.SCHEMA_FIELD_NAME_PROPERTIES); if (properties != null) { this.setProperties(KeyValueParser.parse(properties.toString())); } value = genericRecord.get(KafkaForkliftProducer.SCHEMA_FIELD_NAME_VALUE); //If the value is null, this is most likely an avro object if (value == null) { String jsonValue = genericRecord.toString(); value = jsonValue != null && jsonValue.startsWith("{") ? jsonValue : null; } } return value == null?null:value.toString(); } }