[ad_1]
I would like to log to Kafka if I can reach a broker, but simply skip it if Kafka is not available. To that end, I’d like to set the Boolean variable useKafka
but I can’t find an elegant way of doing this.
Below is my attempt.
...
val props = new Properties()
props.put("bootstrap.servers", kafkaBroker)
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
props.put("request.timeout.ms", 200);
var useKafka: Boolean = true
// This is kludgy
val producer = try {
new KafkaProducer[String, String](props)
}
catch {
useKafka = false
}
...
Results in the following error at compile time: value isDefinedAt is not a member of Unit
Here is how I intend to use the Boolean in the code:
if (useKafka) producer.send(new ProducerRecord[String, String](kafkaTopic, "cobol", logStr))
Based on Dima’s answer, I changed my code as follows.
A KafkaConsumer throws an error and is better for testing. By using a Future with a timeout, I can wait for a reasonable amount of time.
val simpleConsumer = new org.apache.kafka.clients.consumer.KafkaConsumer[String, String](props)
val testKafka = Try {Await.ready(Future(simpleConsumer.listTopics), 200 milliseconds)}.toOption
useKafka = testKafka.nonEmpty
[ad_2]