org.apache.kafka.common.serialization.ByteArrayDeserializer Scala Examples
The following examples show how to use org.apache.kafka.common.serialization.ByteArrayDeserializer.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: CommitMarkerOffsetsActor.scala From kmq with Apache License 2.0 | 5 votes |
package com.softwaremill.kmq.redelivery import akka.actor.Actor import com.softwaremill.kmq.KafkaClients import com.typesafe.scalalogging.StrictLogging import org.apache.kafka.clients.consumer.OffsetAndMetadata import org.apache.kafka.common.TopicPartition import org.apache.kafka.common.serialization.ByteArrayDeserializer import scala.collection.JavaConverters._ import scala.concurrent.duration._ class CommitMarkerOffsetsActor(markerTopic: String, clients: KafkaClients) extends Actor with StrictLogging { private val consumer = clients.createConsumer(null, classOf[ByteArrayDeserializer], classOf[ByteArrayDeserializer]) private var toCommit: Map[Partition, Offset] = Map() import context.dispatcher override def preStart(): Unit = { logger.info("Started commit marker offsets actor") } override def postStop(): Unit = { try consumer.close() catch { case e: Exception => logger.error("Cannot close commit offsets consumer", e) } logger.info("Stopped commit marker offsets actor") } override def receive: Receive = { case CommitOffset(p, o) => // only updating if the current offset is smaller if (toCommit.get(p).fold(true)(_ < o)) toCommit += p -> o case DoCommit => try { commitOffsets() toCommit = Map() } finally context.system.scheduler.scheduleOnce(1.second, self, DoCommit) } private def commitOffsets(): Unit = if (toCommit.nonEmpty) { consumer.commitSync(toCommit.map { case (partition, offset) => (new TopicPartition(markerTopic, partition), new OffsetAndMetadata(offset)) }.asJava) logger.debug(s"Committed marker offsets: $toCommit") } }
Example 2
Source File: WebSocket.scala From trucking-iot with Apache License 2.0 | 5 votes |
package controllers import javax.inject.{Inject, Singleton} import akka.actor.{Actor, ActorRef, ActorSystem, Props} import akka.kafka.scaladsl.Consumer import akka.kafka.{ConsumerSettings, Subscriptions} import akka.stream.scaladsl.Sink import akka.stream.{Materializer, ThrottleMode} import com.typesafe.config.ConfigFactory import org.apache.kafka.clients.consumer.ConsumerConfig import org.apache.kafka.common.serialization.{ByteArrayDeserializer, StringDeserializer} import play.api.libs.streams.ActorFlow import play.api.mvc.{Controller, WebSocket} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future import scala.concurrent.duration._ //@Singleton class KafkaWebSocket @Inject() (implicit system: ActorSystem, materializer: Materializer) extends Controller { def kafkaWS = WebSocket.accept[String, String] { request => ActorFlow.actorRef(out => KafkaWSActor.props(out)) } object KafkaWSActor { def props(outRef: ActorRef) = Props(new KafkaWSActor(outRef)) } class KafkaWSActor(outRef: ActorRef) extends Actor { val config = ConfigFactory.load() val combinedConfig = ConfigFactory.defaultOverrides() .withFallback(config) .withFallback(ConfigFactory.defaultApplication()) .getConfig("trucking-web-application.backend") val consumerSettings = ConsumerSettings(system, new ByteArrayDeserializer, new StringDeserializer) //.withBootstrapServers("sandbox-hdf.hortonworks.com:6667") .withBootstrapServers(combinedConfig.getString("kafka.bootstrap-servers")) .withGroupId("group1") .withProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest") Consumer.committableSource(consumerSettings, Subscriptions.topics("trucking_data_joined")) .mapAsync(1) { msg => Future(outRef ! msg.record.value).map(_ => msg) } //.mapAsync(1) { msg => msg.committableOffset.commitScaladsl() } // TODO: Disabling commits for debug .throttle(1, 250.milliseconds, 1, ThrottleMode.Shaping) .runWith(Sink.ignore) def receive = { case msg: String => outRef ! s"Ack: $msg" } } }
Example 3
Source File: ConsumerStream.scala From reactive-kafka-microservice-template with Apache License 2.0 | 5 votes |
package com.omearac.consumers import akka.actor.{ActorRef, ActorSystem} import akka.kafka.ConsumerMessage.CommittableOffsetBatch import akka.kafka.scaladsl.Consumer import akka.kafka.{ConsumerMessage, ConsumerSettings, Subscriptions} import akka.stream.scaladsl.{Flow, Sink} import com.omearac.shared.EventMessages.FailedMessageConversion import com.omearac.shared.JsonMessageConversion.Conversion import com.omearac.shared.{AkkaStreams, EventSourcing} import org.apache.kafka.clients.consumer.ConsumerConfig import org.apache.kafka.common.serialization.{ByteArrayDeserializer, StringDeserializer} import scala.collection.mutable.ArrayBuffer import scala.concurrent.Future trait ConsumerStream extends AkkaStreams with EventSourcing { implicit val system: ActorSystem def self: ActorRef def createStreamSink(consumerActorSink : ActorRef) = { Sink.actorRefWithAck(consumerActorSink, "STREAM_INIT", "OK", "STREAM_DONE") } def createStreamSource(consumerProperties: Map[String,String]) = { val kafkaMBAddress = consumerProperties("bootstrap-servers") val groupID = consumerProperties("groupId") val topicSubscription = consumerProperties("subscription-topic") val consumerSettings = ConsumerSettings(system, new ByteArrayDeserializer, new StringDeserializer) .withBootstrapServers(kafkaMBAddress) .withGroupId(groupID) .withProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest") Consumer.committableSource(consumerSettings, Subscriptions.topics(topicSubscription)) } def createStreamFlow[msgType: Conversion] = { Flow[ConsumerMessage.CommittableMessage[Array[Byte], String]] .map(msg => (msg.committableOffset, Conversion[msgType].convertFromJson(msg.record.value))) //Publish the conversion error event messages returned from the JSONConversion .map (tuple => publishConversionErrors[msgType](tuple)) .filter(result => result.isRight) .map(test => test.right.get) //Group the commit offsets and correctly converted messages for more efficient Kafka commits .batch(max = 20, tuple => (CommittableOffsetBatch.empty.updated(tuple._1), ArrayBuffer[msgType](tuple._2))) {(tupleOfCommitOffsetAndMsgs, tuple) => (tupleOfCommitOffsetAndMsgs._1.updated(tuple._1), tupleOfCommitOffsetAndMsgs._2 :+ tuple._2) } //Take the first element of the tuple (set of commit numbers) to add to kafka commit log and then return the collection of grouped case class messages .mapAsync(4)(tupleOfCommitOffsetAndMsgs => commitOffsetsToKafka[msgType](tupleOfCommitOffsetAndMsgs)) .map(msgGroup => msgGroup._2) } def commitOffsetsToKafka[msgType](tupleOfCommitOffsetAndMsgs: (ConsumerMessage.CommittableOffsetBatch, ArrayBuffer[msgType])) = Future { (tupleOfCommitOffsetAndMsgs._1.commitScaladsl(), tupleOfCommitOffsetAndMsgs._2) } def publishConversionErrors[msgType](tupleOfCommitOffsetAndConversionResults: (ConsumerMessage.CommittableOffset, Either[FailedMessageConversion,msgType])) : Either[Unit,(ConsumerMessage.CommittableOffset,msgType)] = { if (tupleOfCommitOffsetAndConversionResults._2.isLeft) { //Publish a local event that there was a failure in conversion publishLocalEvent(tupleOfCommitOffsetAndConversionResults._2.left.get) //Commit the Kafka Offset to acknowledge that the message was consumed Left(tupleOfCommitOffsetAndConversionResults._1.commitScaladsl()) } else Right(tupleOfCommitOffsetAndConversionResults._1,tupleOfCommitOffsetAndConversionResults._2.right.get) } }
Example 4
Source File: ConsumerAccess.scala From zio-kafka with Apache License 2.0 | 5 votes |
package zio.kafka.consumer.internal import org.apache.kafka.clients.consumer.KafkaConsumer import org.apache.kafka.common.errors.WakeupException import org.apache.kafka.common.serialization.ByteArrayDeserializer import zio._ import zio.blocking.{ blocking, Blocking } import zio.kafka.consumer.ConsumerSettings import zio.kafka.consumer.internal.ConsumerAccess.ByteArrayKafkaConsumer import scala.jdk.CollectionConverters._ private[consumer] class ConsumerAccess(private[consumer] val consumer: ByteArrayKafkaConsumer, access: Semaphore) { def withConsumer[A](f: ByteArrayKafkaConsumer => A): RIO[Blocking, A] = withConsumerM[Any, A](c => ZIO(f(c))) def withConsumerM[R, A](f: ByteArrayKafkaConsumer => ZIO[R, Throwable, A]): ZIO[R with Blocking, Throwable, A] = access.withPermit(withConsumerNoPermit(f)) private[consumer] def withConsumerNoPermit[R, A]( f: ByteArrayKafkaConsumer => ZIO[R, Throwable, A] ): ZIO[R with Blocking, Throwable, A] = blocking(ZIO.effectSuspend(f(consumer))).catchSome { case _: WakeupException => ZIO.interrupt }.fork.flatMap(fib => fib.join.onInterrupt(ZIO.effectTotal(consumer.wakeup()) *> fib.interrupt)) } private[consumer] object ConsumerAccess { type ByteArrayKafkaConsumer = KafkaConsumer[Array[Byte], Array[Byte]] def make(settings: ConsumerSettings) = for { access <- Semaphore.make(1).toManaged_ consumer <- blocking { ZIO { new KafkaConsumer[Array[Byte], Array[Byte]]( settings.driverSettings.asJava, new ByteArrayDeserializer(), new ByteArrayDeserializer() ) } }.toManaged(c => blocking(access.withPermit(UIO(c.close(settings.closeTimeout.asJava))))) } yield new ConsumerAccess(consumer, access) }
Example 5
Source File: ProcessingKafkaApplication.scala From Akka-Cookbook with MIT License | 5 votes |
package com.packt.chapter8 import akka.actor.ActorSystem import akka.kafka.scaladsl.{Consumer, Producer} import akka.kafka.{ConsumerSettings, ProducerSettings, Subscriptions} import akka.stream.{ActorMaterializer, ClosedShape} import akka.stream.scaladsl.{Flow, GraphDSL, RunnableGraph, Sink, Source} import org.apache.kafka.clients.consumer.{ConsumerConfig, ConsumerRecord} import org.apache.kafka.clients.producer.ProducerRecord import org.apache.kafka.common.TopicPartition import org.apache.kafka.common.serialization.{ByteArrayDeserializer, ByteArraySerializer, StringDeserializer, StringSerializer} import scala.concurrent.duration._ object ProcessingKafkaApplication extends App { implicit val actorSystem = ActorSystem("SimpleStream") implicit val actorMaterializer = ActorMaterializer() val bootstrapServers = "localhost:9092" val kafkaTopic = "akka_streams_topic" val partition = 0 val subscription = Subscriptions.assignment(new TopicPartition(kafkaTopic, partition)) val consumerSettings = ConsumerSettings(actorSystem, new ByteArrayDeserializer, new StringDeserializer) .withBootstrapServers(bootstrapServers) .withGroupId("akka_streams_group") .withProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest") val producerSettings = ProducerSettings(actorSystem, new ByteArraySerializer, new StringSerializer) .withBootstrapServers(bootstrapServers) val runnableGraph = RunnableGraph.fromGraph(GraphDSL.create() { implicit builder => import GraphDSL.Implicits._ val tickSource = Source.tick(0 seconds, 5 seconds, "Hello from Akka Streams using Kafka!") val kafkaSource = Consumer.plainSource(consumerSettings, subscription) val kafkaSink = Producer.plainSink(producerSettings) val printlnSink = Sink.foreach(println) val mapToProducerRecord = Flow[String].map(elem => new ProducerRecord[Array[Byte], String](kafkaTopic, elem)) val mapFromConsumerRecord = Flow[ConsumerRecord[Array[Byte], String]].map(record => record.value()) tickSource ~> mapToProducerRecord ~> kafkaSink kafkaSource ~> mapFromConsumerRecord ~> printlnSink ClosedShape }) runnableGraph.run() }
Example 6
Source File: AvroMessageFormatterMain.scala From affinity with Apache License 2.0 | 5 votes |
import java.time.temporal.ChronoUnit import java.util.Properties import io.amient.affinity.kafka.AvroMessageFormatter import org.apache.kafka.clients.consumer.KafkaConsumer import org.apache.kafka.common.serialization.ByteArrayDeserializer import scala.collection.JavaConverters._ object AvroMessageFormatterMain extends App { val consumerProps = new Properties() consumerProps.put("bootstrap.servers", args(0)) consumerProps.put("security.protocol", "SASL_SSL") consumerProps.put("sasl.mechanism", "PLAIN") consumerProps.put("client.id", "console") consumerProps.put("group.id", "console") consumerProps.put("key.deserializer", classOf[ByteArrayDeserializer]) consumerProps.put("value.deserializer", classOf[ByteArrayDeserializer]) consumerProps.put("sasl.jaas.config", "org.apache.kafka.common.security.plain.PlainLoginModule required username='" + args(1) + "' password='" + args(2) + "';") consumerProps.put("schema.registry.url", args(3)) val c = new KafkaConsumer[Array[Byte], Array[Byte]](consumerProps) c.subscribe(List(args(4)).asJava) val formatter = new AvroMessageFormatter() formatter.init(consumerProps) while (true) { c.poll(java.time.Duration.of(1, ChronoUnit.SECONDS)).asScala.foreach { record => formatter.writeTo(record, System.out) } } }
Example 7
Source File: KafkaAvroConsumer.scala From sqs-kafka-connect with Apache License 2.0 | 5 votes |
package com.hivehome.kafka.connect.sqs import java.util.{Properties, UUID} import io.confluent.kafka.serializers.KafkaAvroDeserializer import org.apache.kafka.clients.consumer.{ConsumerConfig => ConsumerConfigConst, KafkaConsumer} import org.apache.kafka.common.serialization.ByteArrayDeserializer import org.slf4j.LoggerFactory import scala.collection.JavaConverters._ import scala.concurrent.duration._ import scala.language.postfixOps def poll(numberOfMessagesExpected: Int, timeout: FiniteDuration = 30 seconds, accept: V => Boolean = _ => true): Vector[V] = { val deadline = timeout.fromNow var messages = Vector.empty[V] while (deadline.hasTimeLeft && messages.size < numberOfMessagesExpected) { val records = cons.poll(PollingInterval) // convert to Seq so that we have all the messages once we have // exhausted the iterator val msgsSeq = records.iterator().asScala.toSeq messages = messages ++ msgsSeq.map(_.value()).filter(accept).toVector } logger.debug("Number of messages received {}", messages.size) if (messages.size < numberOfMessagesExpected) { throw new AssertionError(s"Expected $numberOfMessagesExpected messages within $timeout, but only received ${messages.size}. $messages") } // Possibly throw exception if too many messages? messages } } object KafkaAvroConsumer { val logger = LoggerFactory.getLogger(getClass) def apply[K, V](kafkaProps: Map[String, String], topicName: String): KafkaAvroConsumer[K, V] = { val props = new Properties() props.putAll(kafkaProps.asJava) props.put(ConsumerConfigConst.GROUP_ID_CONFIG, "test" + UUID.randomUUID().toString.substring(0, 10)) props.put(ConsumerConfigConst.KEY_DESERIALIZER_CLASS_CONFIG, classOf[ByteArrayDeserializer]) props.put(ConsumerConfigConst.VALUE_DESERIALIZER_CLASS_CONFIG, classOf[KafkaAvroDeserializer]) logger.info(s"Consuming from $topicName with properties $props") val cons = new KafkaConsumer[K, V](props) cons.subscribe(Seq(topicName).asJava) new KafkaAvroConsumer(cons) } }
Example 8
Source File: package.scala From kafka-scala-api with Apache License 2.0 | 5 votes |
package com import akka.actor.ActorSystem import akka.kafka.{ConsumerSettings, ProducerSettings} import akka.stream.ActorMaterializer import org.apache.kafka.clients.consumer.ConsumerConfig import org.apache.kafka.common.serialization.{ByteArrayDeserializer, ByteArraySerializer, StringDeserializer, StringSerializer} package object example { implicit val system = ActorSystem("FlowProducerMain") implicit val materializer = ActorMaterializer() val producerSettings = ProducerSettings(system, new ByteArraySerializer, new StringSerializer) .withBootstrapServers("localhost:9092") val topic = "sample_topic" val topic1 = "topic1" val topic2 = "topic2" val consumerSettings = ConsumerSettings(system, new ByteArrayDeserializer, new StringDeserializer) .withBootstrapServers("localhost:9092") .withGroupId("group1") .withProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest") }
Example 9
Source File: MessageListener.scala From kafka-with-akka-streams-kafka-streams-tutorial with Apache License 2.0 | 5 votes |
package com.lightbend.scala.kafka import org.apache.kafka.clients.consumer.{ConsumerConfig, KafkaConsumer} import org.apache.kafka.common.serialization.ByteArrayDeserializer import scala.collection.JavaConverters._ object MessageListener { private val AUTOCOMMITINTERVAL = "1000" // Frequency off offset commits private val SESSIONTIMEOUT = "30000" // The timeout used to detect failures - should be greater then processing time private val MAXPOLLRECORDS = "10" // Max number of records consumed in a single poll def consumerProperties(brokers: String, group: String, keyDeserealizer: String, valueDeserealizer: String): Map[String, Object] = { Map[String, Object]( ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> brokers, ConsumerConfig.GROUP_ID_CONFIG -> group, ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG -> "true", ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG -> AUTOCOMMITINTERVAL, ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG -> SESSIONTIMEOUT, ConsumerConfig.MAX_POLL_RECORDS_CONFIG -> MAXPOLLRECORDS, ConsumerConfig.AUTO_OFFSET_RESET_CONFIG -> "earliest", ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG -> keyDeserealizer, ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG -> valueDeserealizer ) } def apply[K, V](brokers: String, topic: String, group: String, processor: RecordProcessorTrait[K, V]): MessageListener[K, V] = new MessageListener[K, V](brokers, topic, group, classOf[ByteArrayDeserializer].getName, classOf[ByteArrayDeserializer].getName, processor) } class MessageListener[K, V](brokers: String, topic: String, group: String, keyDeserealizer: String, valueDeserealizer: String, processor: RecordProcessorTrait[K, V]) extends Runnable { import MessageListener._ val consumer = new KafkaConsumer[K, V](consumerProperties(brokers, group, keyDeserealizer, valueDeserealizer).asJava) consumer.subscribe(Seq(topic).asJava) var completed = false def complete(): Unit = { completed = true } override def run(): Unit = { while (!completed) { val records = consumer.poll(100) for (record <- records.asScala) { processor.processRecord(record) } } consumer.close() System.out.println("Listener completes") } def start(): Unit = { val t = new Thread(this) t.start() } }
Example 10
Source File: KafkaSupport.scala From model-serving-tutorial with Apache License 2.0 | 5 votes |
package com.lightbend.modelserving.spark import org.apache.kafka.clients.consumer.ConsumerConfig import org.apache.kafka.common.serialization.ByteArrayDeserializer @SerialVersionUID(102L) object KafkaSupport extends Serializable { // Kafka consumer properties private val sessionTimeout: Int = 10 * 1000 private val connectionTimeout: Int = 8 * 1000 private val AUTOCOMMITINTERVAL: String = "1000" // Frequency off offset commits private val SESSIONTIMEOUT: String = "30000" // The timeout used to detect failures - should be greater then processing time private val MAXPOLLRECORDS: String = "10" // Max number of records consumed in a single poll private val GROUPID: String = "Spark Streaming" // Consumer ID def getKafkaConsumerConfig(brokers: String): Map[String, String] = { Map[String, String]( ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> brokers, ConsumerConfig.GROUP_ID_CONFIG -> GROUPID, ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG -> "true", ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG -> AUTOCOMMITINTERVAL, ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG -> SESSIONTIMEOUT, ConsumerConfig.MAX_POLL_RECORDS_CONFIG -> MAXPOLLRECORDS, ConsumerConfig.AUTO_OFFSET_RESET_CONFIG -> "earliest", ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG -> classOf[ByteArrayDeserializer].getTypeName, ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG -> classOf[ByteArrayDeserializer].getTypeName) } }
Example 11
Source File: TFServingModelServer.scala From model-serving-tutorial with Apache License 2.0 | 5 votes |
package com.lightbend.modelserving.tensorflowserving import akka.actor.typed.scaladsl.Behaviors import akka.actor.typed.scaladsl.adapter._ import akka.actor.typed.{ActorRef, ActorSystem} import akka.http.scaladsl.Http import akka.kafka.scaladsl.Consumer import akka.kafka.{ConsumerSettings, Subscriptions} import akka.stream.scaladsl.Sink import akka.stream.typed.scaladsl.{ActorFlow, ActorMaterializer} import akka.util.Timeout import com.lightbend.modelserving.configuration.ModelServingConfiguration import com.lightbend.modelserving.model.ServingResult import com.lightbend.modelserving.winemodel.DataRecord import org.apache.kafka.clients.consumer.ConsumerConfig import org.apache.kafka.common.serialization.ByteArrayDeserializer import scala.concurrent.duration._ import scala.util.Success object TFServingModelServer { import ModelServingConfiguration._ // Initialization implicit val modelServer = ActorSystem( Behaviors.setup[TFModelServerActor]( context => new TFModelServerBehaviour(context)), "ModelServing") implicit val materializer = ActorMaterializer() implicit val executionContext = modelServer.executionContext implicit val askTimeout = Timeout(30.seconds) // Configuration properties for the Kafka topic. val dataSettings = ConsumerSettings(modelServer.toUntyped, new ByteArrayDeserializer, new ByteArrayDeserializer) .withBootstrapServers(KAFKA_BROKER) .withGroupId(DATA_GROUP) .withProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest") def main(args: Array[String]): Unit = { println(s"Akka application that uses TensorFlow Serving, brokers $KAFKA_BROKER") // Data stream processing Consumer.atMostOnceSource(dataSettings, Subscriptions.topics(DATA_TOPIC)) .map(record => DataRecord.wineFromByteArray(record.value)).collect { case Success(a) => a } .via(ActorFlow.ask(1)(modelServer)((elem, replyTo : ActorRef[Option[ServingResult[Double]]]) => new ServeData(replyTo, elem))) .collect{ case Some(result) => result} .runWith(Sink.foreach(result => println(s"Model served in ${System.currentTimeMillis() - result.submissionTs} ms, with result ${result.result} " + s"(model ${result.name}, data type ${result.dataType})"))) // Rest Server startRest(modelServer) } def startRest(modelServerManager: ActorSystem[TFModelServerActor]): Unit = { implicit val timeout = Timeout(10.seconds) implicit val system = modelServerManager.toUntyped val host = "0.0.0.0" val port = MODELSERVING_PORT val routes = TFQueriesAkkaHttpResource.storeRoutes(modelServerManager)(modelServerManager.scheduler) val _ = Http().bindAndHandle(routes, host, port) map { binding => println(s"Starting models observer on port ${binding.localAddress}") } recover { case ex => println(s"Models observer could not bind to $host:$port - ${ex.getMessage}") } } }
Example 12
Source File: MessageListener.scala From model-serving-tutorial with Apache License 2.0 | 5 votes |
package com.lightbend.modelserving.client import java.time.Duration import java.util.Properties import org.apache.kafka.clients.consumer.{ConsumerConfig, KafkaConsumer} import org.apache.kafka.common.serialization.ByteArrayDeserializer class MessageListener[K, V]( brokers: String, topic: String, group: String, keyDeserealizer: String, valueDeserealizer: String, processor: RecordProcessorTrait[K, V]) extends Runnable { import MessageListener._ import scala.collection.JavaConverters._ val consumer = new KafkaConsumer[K, V](consumerProperties(brokers, group, keyDeserealizer, valueDeserealizer)) consumer.subscribe(Seq(topic).asJava) var completed = false def complete(): Unit = { completed = true } override def run(): Unit = { while (!completed) { val records = consumer.poll(Duration.ofMillis(100)).asScala for (record <- records) { processor.processRecord(record) } } consumer.close() System.out.println("Listener completes") } def start(): Unit = { val t = new Thread(this) t.start() } }
Example 13
Source File: Consumers.scala From Fast-Data-Processing-Systems-with-SMACK-Stack with MIT License | 5 votes |
import akka.kafka._ import akka.kafka.scaladsl._ import org.apache.kafka.common.serialization.StringDeserializer import org.apache.kafka.common.serialization.ByteArrayDeserializer import org.apache.kafka.clients.consumer.ConsumerConfig val consumerSettings = ConsumerSettings(system, new ByteArrayDeserializer, new StringDeserializer) .withBootstrapServers("localhost:9092") .withGroupId("group1") .withProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest") // Consume messages and store a representation, including offset, in DB example: db.loadOffset().foreach { fromOffset => val subscription = Subscriptions.assignmentWithOffset(new TopicPartition("topic1", 1) -> fromOffset) Consumer.plainSource(consumerSettings, subscription) .mapAsync(1)(db.save)} // Consume messages at-most-once example: Consumer.atMostOnceSource(consumerSettings.withClientId("client1"), Subscriptions.topics("topic1")) .mapAsync(1) { record => rocket.launch(record.value } // Consume messages at-least-once example: Consumer.committableSource(consumerSettings.withClientId("client1"), Subscriptions.topics("topic1")) .mapAsync(1) { msg => db.update(msg.value).flatMap(_ => msg.committableOffset.commitScaladsl()) } // Connect a Consumer to Producer example: Consumer.committableSource(consumerSettings.withClientId("client1")) .map(msg => ProducerMessage.Message( new ProducerRecord[Array[Byte], String]("topic2", msg.value), msg.committableOffset)) .to(Producer.commitableSink(producerSettings)) // Consume messages at-least-once, and commit in batches example: Consumer.committableSource(consumerSettings.withClientId("client1"), Subscriptions.topics("topic1")) .mapAsync(1) { msg => db.update(msg.value).map(_ => msg.committableOffset) } .batch(max = 10, first => CommittableOffsetBatch.empty.updated(first)) { (batch, elem) => batch.updated(elem) }.mapAsync(1)(_.commitScaladsl()) // A reusable Kafka consumer example: val consumer: ActorRef = system.actorOf(KafkaConsumerActor.props(consumerSettings)) // Manually assign topic partition to it val stream1 = Consumer .plainExternalSource[Array[Byte], String](consumer, Subscriptions.assignment(new TopicPartition("topic1", 1))) .via(business) .to(Sink.ignore) // Manually assign another topic partition val stream2 = Consumer .plainExternalSource[Array[Byte], String](consumer, Subscriptions.assignment(new TopicPartition("topic1", 2))) .via(business) .to(Sink.ignore) // Consumer group example: val consumerGroup = Consumer.committablePartitionedSource(consumerSettings.withClientId("client1"), Subscriptions.topics("topic1")) // Process each assigned partition separately consumerGroup.map { case (topicPartition, source) => source .via(business) .toMat(Sink.ignore)(Keep.both) .run() }.mapAsyncUnordered(maxPartitions)(_._2)