org.apache.kafka.common.serialization.Serde Scala Examples
The following examples show how to use org.apache.kafka.common.serialization.Serde.
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: Avro4sJsonSupport.scala From kafka-serde-scala with Apache License 2.0 | 5 votes |
package io.github.azhur.kafkaserdeavro4s import java.io.ByteArrayOutputStream import java.util import com.sksamuel.avro4s.{ AvroJsonInputStream, AvroOutputStream, FromRecord, SchemaFor, ToRecord } import org.apache.avro.file.SeekableByteArrayInput import org.apache.kafka.common.errors.SerializationException import org.apache.kafka.common.serialization.{ Deserializer, Serde, Serializer } import scala.language.implicitConversions import scala.util.control.NonFatal import scala.util.{ Failure, Success } trait Avro4sJsonSupport { implicit def toSerializer[T >: Null](implicit schemaFor: SchemaFor[T], toRecord: ToRecord[T]): Serializer[T] = new Serializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serialize(topic: String, data: T): Array[Byte] = if (data == null) null else { val baos = new ByteArrayOutputStream() try { val output = AvroOutputStream.json[T](baos) try { output.write(data) } finally { output.close() } baos.toByteArray } catch { case NonFatal(e) => throw new SerializationException(e) } finally { baos.close() } } } implicit def toDeserializer[T >: Null]( implicit schemaFor: SchemaFor[T], fromRecord: FromRecord[T], schemas: WriterReaderSchemas = WriterReaderSchemas() ): Deserializer[T] = new Deserializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def deserialize(topic: String, data: Array[Byte]): T = if (data == null) null else new AvroJsonInputStream[T](new SeekableByteArrayInput(data), schemas.writerSchema, schemas.readerSchema).singleEntity match { case Success(json) => json case Failure(error) => throw new SerializationException(error) } } implicit def toSerde[T >: Null]( implicit schemaFor: SchemaFor[T], toRecord: ToRecord[T], fromRecord: FromRecord[T], schemas: WriterReaderSchemas = WriterReaderSchemas() ): Serde[T] = new Serde[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serializer(): Serializer[T] = toSerializer[T] override def deserializer(): Deserializer[T] = toDeserializer[T] } } object Avro4sJsonSupport extends Avro4sJsonSupport
Example 2
Source File: AvroSerde.scala From event-sourcing-kafka-streams with MIT License | 5 votes |
package org.amitayh.invoices.common.serde import java.io.ByteArrayOutputStream import java.nio.ByteBuffer import java.time.Instant import java.util import java.util.UUID import com.sksamuel.avro4s._ import org.amitayh.invoices.common.domain._ import org.amitayh.invoices.common.serde.UuidConverters.{fromByteBuffer, toByteBuffer} import org.apache.avro.Schema import org.apache.avro.Schema.Field import org.apache.kafka.common.serialization.{Deserializer, Serde, Serializer} object AvroSerde { implicit val instantToSchema: ToSchema[Instant] = new ToSchema[Instant] { override val schema: Schema = Schema.create(Schema.Type.STRING) } implicit val instantToValue: ToValue[Instant] = new ToValue[Instant] { override def apply(value: Instant): String = value.toString } implicit val instantFromValue: FromValue[Instant] = new FromValue[Instant] { override def apply(value: Any, field: Field): Instant = Instant.parse(value.toString) } implicit val uuidToSchema: ToSchema[UUID] = new ToSchema[UUID] { override val schema: Schema = Schema.create(Schema.Type.BYTES) } implicit val uuidToValue: ToValue[UUID] = new ToValue[UUID] { override def apply(value: UUID): ByteBuffer = toByteBuffer(value) } implicit val uuidFromValue: FromValue[UUID] = new FromValue[UUID] { override def apply(value: Any, field: Field): UUID = fromByteBuffer(value.asInstanceOf[ByteBuffer]) } val CommandSerde: Serde[Command] = serdeFor[Command] val CommandResultSerde: Serde[CommandResult] = serdeFor[CommandResult] val SnapshotSerde: Serde[InvoiceSnapshot] = serdeFor[InvoiceSnapshot] val EventSerde: Serde[Event] = serdeFor[Event] def toBytes[T: SchemaFor: ToRecord](data: T): Array[Byte] = { val baos = new ByteArrayOutputStream val output = AvroOutputStream.binary[T](baos) output.write(data) output.close() baos.toByteArray } def fromBytes[T: SchemaFor: FromRecord](data: Array[Byte]): T = { val input = AvroInputStream.binary[T](data) input.iterator.next() } private def serdeFor[T: SchemaFor: ToRecord: FromRecord]: Serde[T] = new Serde[T] { override val serializer: Serializer[T] = new Serializer[T] { override def serialize(topic: String, data: T): Array[Byte] = toBytes(data) override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = () override def close(): Unit = () } override val deserializer: Deserializer[T] = new Deserializer[T] { override def deserialize(topic: String, data: Array[Byte]): T = fromBytes(data) override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = () override def close(): Unit = () } override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = () override def close(): Unit = () } }
Example 3
Source File: UuidSerde.scala From event-sourcing-kafka-streams with MIT License | 5 votes |
package org.amitayh.invoices.common.serde import java.util import java.util.UUID import org.amitayh.invoices.common.serde.UuidConverters.{fromBytes, toBytes} import org.apache.kafka.common.serialization.{Deserializer, Serde, Serializer} object UuidSerializer extends Serializer[UUID] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = () override def serialize(topic: String, uuid: UUID): Array[Byte] = toBytes(uuid) override def close(): Unit = () } object UuidDeserializer extends Deserializer[UUID] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = () override def deserialize(topic: String, data: Array[Byte]): UUID = fromBytes(data) override def close(): Unit = () } object UuidSerde extends Serde[UUID] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = () override val serializer: Serializer[UUID] = UuidSerializer override val deserializer: Deserializer[UUID] = UuidDeserializer override def close(): Unit = () }
Example 4
Source File: Config.scala From event-sourcing-kafka-streams with MIT License | 5 votes |
package org.amitayh.invoices.common import org.amitayh.invoices.common.serde.{AvroSerde, UuidSerde} import org.apache.kafka.clients.admin.NewTopic import org.apache.kafka.common.config.TopicConfig import org.apache.kafka.common.serialization.{Deserializer, Serde, Serializer} import scala.collection.JavaConverters._ import scala.concurrent.duration._ object Config { val BootstrapServers = sys.env("BOOTSTRAP_SERVERS") object Stores { val Snapshots = "invoices.store.snapshots" } object Topics { sealed trait CleanupPolicy object CleanupPolicy { case object Compact extends CleanupPolicy } case class Topic[K, V](name: String, keySerde: Serde[K], valueSerde: Serde[V], numPartitions: Int = 4, replicationFactor: Short = 1, retention: Option[Duration] = None, cleanupPolicy: Option[CleanupPolicy] = None) { val keySerializer: Serializer[K] = keySerde.serializer val keyDeserializer: Deserializer[K] = keySerde.deserializer val valueSerializer: Serializer[V] = valueSerde.serializer val valueDeserializer: Deserializer[V] = valueSerde.deserializer def toNewTopic: NewTopic = { val emptyConfigs = Map.empty[String, String] val withRetention = retentionConfig.foldLeft(emptyConfigs)(_ + _) val withCleanupPolicy = cleanupPolicyConfig.foldLeft(withRetention)(_ + _) new NewTopic(name, numPartitions, replicationFactor) .configs(withCleanupPolicy.asJava) } private def retentionConfig: Option[(String, String)] = retention.map { retention => val millis = if (retention.isFinite) retention.toMillis else -1 TopicConfig.RETENTION_MS_CONFIG -> millis.toString } private def cleanupPolicyConfig: Option[(String, String)] = cleanupPolicy.map { case CleanupPolicy.Compact => TopicConfig.CLEANUP_POLICY_CONFIG -> TopicConfig.CLEANUP_POLICY_COMPACT } } val Events = Topic( "invoices.topic.events", UuidSerde, AvroSerde.EventSerde, retention = Some(Duration.Inf)) val Commands = Topic( "invoices.topic.commands", UuidSerde, AvroSerde.CommandSerde, retention = Some(5.minutes)) val CommandResults = Topic( "invoices.topic.command-results", UuidSerde, AvroSerde.CommandResultSerde, retention = Some(5.minutes)) val Snapshots = Topic( "invoices.topic.snapshots", UuidSerde, AvroSerde.SnapshotSerde, cleanupPolicy = Some(CleanupPolicy.Compact)) val All = Set(Events, Commands, CommandResults, Snapshots) } }
Example 5
Source File: AvroSerdes.scala From embedded-kafka-schema-registry with MIT License | 5 votes |
package net.manub.embeddedkafka.schemaregistry.avro import io.confluent.kafka.serializers.{ AbstractKafkaSchemaSerDeConfig, KafkaAvroDeserializerConfig, KafkaAvroDeserializer => ConfluentKafkaAvroDeserializer, KafkaAvroSerializer => ConfluentKafkaAvroSerializer } import net.manub.embeddedkafka.schemaregistry.EmbeddedKafkaConfig import org.apache.avro.generic.GenericRecord import org.apache.avro.specific.SpecificRecord import org.apache.kafka.common.serialization.{Serde, Serdes} import scala.jdk.CollectionConverters._ @deprecated( "Avro-related classes will be removed soon", since = "5.5.0" ) object AvroSerdes { protected def configForSchemaRegistry( implicit config: EmbeddedKafkaConfig ): Map[String, Object] = Map( AbstractKafkaSchemaSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG -> s"http://localhost:${config.schemaRegistryPort}" ) protected def specificAvroReaderConfigForSchemaRegistry( implicit config: EmbeddedKafkaConfig ): Map[String, Object] = configForSchemaRegistry ++ Map( KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG -> true.toString ) def specific[T <: SpecificRecord]( isKey: Boolean = false, extraConfig: Map[String, Object] = Map.empty )( implicit config: EmbeddedKafkaConfig ): Serde[T] = serdeFrom[T]( configForSchemaRegistry ++ extraConfig, specificAvroReaderConfigForSchemaRegistry ++ extraConfig, //need this to support SpecificRecord isKey ) def generic( isKey: Boolean = false, extraConfig: Map[String, Object] = Map.empty )( implicit config: EmbeddedKafkaConfig ): Serde[GenericRecord] = serdeFrom[GenericRecord]( configForSchemaRegistry ++ extraConfig, configForSchemaRegistry ++ extraConfig, isKey ) private def serdeFrom[T]( serConfig: Map[String, Object], deserConfig: Map[String, Object], isKey: Boolean ): Serde[T] = { val ser = new ConfluentKafkaAvroSerializer ser.configure(serConfig.asJava, isKey) val deser = new ConfluentKafkaAvroDeserializer deser.configure(deserConfig.asJava, isKey) Serdes.serdeFrom(ser, deser).asInstanceOf[Serde[T]] } }
Example 6
Source File: ModelStateSerde.scala From kafka-with-akka-streams-kafka-streams-tutorial with Apache License 2.0 | 5 votes |
package com.lightbend.scala.kafkastreams.store.store import java.io.{ByteArrayInputStream, ByteArrayOutputStream, DataInputStream, DataOutputStream} import java.util import com.lightbend.model.modeldescriptor.ModelDescriptor import com.lightbend.scala.modelServer.model.PMML.PMMLModel import com.lightbend.scala.modelServer.model.tensorflow.TensorFlowModel import com.lightbend.scala.modelServer.model.{ModelToServeStats, ModelWithDescriptor} import com.lightbend.scala.kafkastreams.store.StoreState import org.apache.kafka.common.serialization.{Deserializer, Serde, Serializer} class ModelStateSerde extends Serde[StoreState] { private val mserializer = new ModelStateSerializer() private val mdeserializer = new ModelStateDeserializer() override def deserializer() = mdeserializer override def serializer() = mserializer override def configure(configs: util.Map[String, _], isKey: Boolean) = {} override def close() = {} } object ModelStateDeserializer { val factories = Map( ModelDescriptor.ModelType.PMML.index -> PMMLModel, ModelDescriptor.ModelType.TENSORFLOW.index -> TensorFlowModel ) } class ModelStateDeserializer extends Deserializer[StoreState] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def deserialize(topic: String, data: Array[Byte]): StoreState = { if(data != null) { val input = new DataInputStream(new ByteArrayInputStream(data)) new StoreState(ModelWithDescriptor.readModel(input), ModelWithDescriptor.readModel(input), ModelToServeStats.readServingInfo(input), ModelToServeStats.readServingInfo(input)) } else new StoreState() } override def close(): Unit = {} } class ModelStateSerializer extends Serializer[StoreState] { private val bos = new ByteArrayOutputStream() override def serialize(topic: String, state: StoreState): Array[Byte] = { bos.reset() val output = new DataOutputStream(bos) ModelWithDescriptor.writeModel(output, state.currentModel.orNull) ModelWithDescriptor.writeModel(output, state.newModel.orNull) ModelToServeStats.writeServingInfo(output, state.currentState.orNull) ModelToServeStats.writeServingInfo(output, state.newState.orNull) try { output.flush() output.close() } catch { case t: Throwable => } bos.toByteArray } override def close(): Unit = {} override def configure(configs: util.Map[String, _], isKey: Boolean) = {} }
Example 7
Source File: TKGroupedStream.scala From typesafe-kafka-streams with MIT License | 5 votes |
package fr.psug.kafka.streams import org.apache.kafka.common.serialization.Serde import org.apache.kafka.streams.kstream._ class TKGroupedStream[K, V](source: KGroupedStream[K, V]) { def aggregate[T](initializer: () => T, aggregator: (K, V, T) => T, storeName: String) (implicit aggValueSerde: Serde[T]): KTable[K, T] = { source.aggregate(new Initializer[T] { override def apply(): T = initializer() }, new Aggregator[K, V, T] { override def apply(aggKey: K, value: V, aggregate: T): T = aggregator(aggKey, value, aggregate) }, aggValueSerde, storeName) } def aggregate[T, W <: Window](initializer: () => T, aggregator: (K, V, T) => T, windows: Windows[W], storeName: String) (implicit aggValueSerde: Serde[T]): KTable[Windowed[K], T] = { source.aggregate(new Initializer[T] { override def apply(): T = initializer() }, new Aggregator[K, V, T] { override def apply(aggKey: K, value: V, aggregate: T): T = aggregator(aggKey, value, aggregate) }, windows, aggValueSerde, storeName) } def count(storeName: String): KTable[K, java.lang.Long] = source.count(storeName) def count[W <: Window](windows: Windows[W], storeName: String): KTable[Windowed[K], java.lang.Long] = source.count(windows, storeName) def reduce(reducer: (V, V) => V, storeName: String): KTable[K, V] = { source.reduce(new Reducer[V] { override def apply(value1: V, value2: V): V = reducer(value1, value2) }, storeName) } def reduce[W <: Window](reducer: (V, V) => V, windows: Windows[W], storeName: String): KTable[Windowed[K], V] = { source.reduce(new Reducer[V] { override def apply(value1: V, value2: V): V = reducer(value1, value2) }, windows, storeName) } }
Example 8
Source File: TKGroupedTable.scala From typesafe-kafka-streams with MIT License | 5 votes |
package fr.psug.kafka.streams import org.apache.kafka.common.serialization.Serde import org.apache.kafka.streams.kstream._ class TKGroupedTable[K, V](source: KGroupedTable[K, V]) { def aggregate[T](initializer: () => T, adder: (K, V, T) => T,subtractor: (K, V, T) => T, storeName: String) (implicit aggValueSerde: Serde[T]): KTable[K, T] = { source.aggregate(new Initializer[T] { override def apply(): T = initializer() }, new Aggregator[K, V, T] { override def apply(aggKey: K, value: V, aggregate: T): T = adder(aggKey, value, aggregate) }, new Aggregator[K, V, T] { override def apply(aggKey: K, value: V, aggregate: T): T = subtractor(aggKey, value, aggregate) }, aggValueSerde, storeName) } def count(storeName: String): KTable[K, java.lang.Long] = source.count(storeName) def reduce(adder: (V, V) => V,subtractor: (V, V) => V, storeName: String): KTable[K, V] = { source.reduce( new Reducer[V] { override def apply(value1: V, value2: V): V = adder(value1, value2) }, new Reducer[V] { override def apply(value1: V, value2: V): V = subtractor(value1, value2) }, storeName) } }
Example 9
Source File: JacksonJsonSupport.scala From kafka-serde-scala with Apache License 2.0 | 5 votes |
package io.github.azhur.kafkaserdejackson import java.util import com.fasterxml.jackson.databind.ObjectMapper import Jackson.typeReference import org.apache.kafka.common.errors.SerializationException import org.apache.kafka.common.serialization.{ Deserializer, Serde, Serializer } import scala.language.implicitConversions import scala.reflect.runtime.universe._ import scala.util.control.NonFatal trait JacksonJsonSupport { implicit def toSerializer[T <: AnyRef](implicit mapper: ObjectMapper): Serializer[T] = new Serializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serialize(topic: String, data: T): Array[Byte] = if (data == null) null else try mapper.writeValueAsBytes(data) catch { case NonFatal(e) => throw new SerializationException(e) } } implicit def toDeserializer[T >: Null <: AnyRef]( implicit mapper: ObjectMapper, tt: TypeTag[T] ): Deserializer[T] = new Deserializer[T] { private val tr = typeReference[T] override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def deserialize(topic: String, data: Array[Byte]): T = if (data == null) null else try mapper.readValue[T](data, tr) catch { case NonFatal(e) => throw new SerializationException(e) } } implicit def toSerde[T >: Null <: AnyRef]( implicit mapper: ObjectMapper, tt: TypeTag[T] ): Serde[T] = new Serde[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serializer(): Serializer[T] = toSerializer[T] override def deserializer(): Deserializer[T] = toDeserializer[T] } } object JacksonJsonSupport extends JacksonJsonSupport
Example 10
Source File: JacksonFormatSchemaSupport.scala From kafka-serde-scala with Apache License 2.0 | 5 votes |
package io.github.azhur.kafkaserdejackson import java.util import scala.reflect.runtime.universe._ import com.fasterxml.jackson.core.FormatSchema import com.fasterxml.jackson.databind.ObjectMapper import org.apache.kafka.common.errors.SerializationException import org.apache.kafka.common.serialization.{ Deserializer, Serde, Serializer } import Jackson.typeReference import scala.language.implicitConversions import scala.reflect.ClassTag import scala.util.control.NonFatal trait JacksonFormatSchemaSupport { implicit def toSerializer[T <: AnyRef](implicit mapper: ObjectMapper, schema: FormatSchema): Serializer[T] = new Serializer[T] { private val writer = mapper.writer(schema) override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serialize(topic: String, data: T): Array[Byte] = if (data == null) null else try writer.writeValueAsBytes(data) catch { case NonFatal(e) => throw new SerializationException(e) } } implicit def toDeserializer[T >: Null <: AnyRef]( implicit mapper: ObjectMapper, schema: FormatSchema, tt: TypeTag[T] ): Deserializer[T] = new Deserializer[T] { private val reader = mapper.readerFor(typeReference[T]).`with`(schema) override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def deserialize(topic: String, data: Array[Byte]): T = if (data == null) null else try reader.readValue[T](data) catch { case NonFatal(e) => throw new SerializationException(e) } } implicit def toSerde[T >: Null <: AnyRef]( implicit mapper: ObjectMapper, schema: FormatSchema, ct: TypeTag[T] ): Serde[T] = new Serde[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serializer(): Serializer[T] = toSerializer[T] override def deserializer(): Deserializer[T] = toDeserializer[T] } } object JacksonFormatSchemaSupport extends JacksonFormatSchemaSupport
Example 11
Source File: PlayJsonSupport.scala From kafka-serde-scala with Apache License 2.0 | 5 votes |
package io.github.azhur.kafkaserdeplayjson import java.nio.charset.StandardCharsets.UTF_8 import java.util import io.github.azhur.kafkaserdeplayjson.PlayJsonSupport.PlayJsonError import org.apache.kafka.common.errors.SerializationException import org.apache.kafka.common.serialization.{ Deserializer, Serde, Serializer } import play.api.libs.json.{ JsError, JsValue, Json, Reads, Writes } import scala.language.implicitConversions import scala.util.control.NonFatal trait PlayJsonSupport { implicit def toSerializer[T <: AnyRef]( implicit writes: Writes[T], printer: JsValue => String = Json.stringify ): Serializer[T] = new Serializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serialize(topic: String, data: T): Array[Byte] = if (data == null) null else try printer(writes.writes(data)).getBytes(UTF_8) catch { case NonFatal(e) => throw new SerializationException(e) } } implicit def toDeserializer[T >: Null <: AnyRef: Manifest]( implicit reads: Reads[T] ): Deserializer[T] = new Deserializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def deserialize(topic: String, data: Array[Byte]): T = if (data == null) null else reads .reads(Json.parse(new String(data, UTF_8))) .recoverTotal { e => throw new SerializationException(PlayJsonError(e)) } } implicit def toSerde[T >: Null <: AnyRef: Manifest]( implicit writes: Writes[T], reads: Reads[T], printer: JsValue => String = Json.stringify ): Serde[T] = new Serde[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serializer(): Serializer[T] = toSerializer[T] override def deserializer(): Deserializer[T] = toDeserializer[T] } } object PlayJsonSupport extends PlayJsonSupport { final case class PlayJsonError(error: JsError) extends RuntimeException { override def getMessage: String = JsError.toJson(error).toString() } }
Example 12
Source File: Avro4sBinarySupport.scala From kafka-serde-scala with Apache License 2.0 | 5 votes |
package io.github.azhur.kafkaserdeavro4s import java.io.ByteArrayOutputStream import java.util import com.sksamuel.avro4s.{ AvroBinaryInputStream, AvroOutputStream, FromRecord, SchemaFor, ToRecord } import org.apache.avro.file.SeekableByteArrayInput import org.apache.kafka.common.errors.SerializationException import org.apache.kafka.common.serialization.{ Deserializer, Serde, Serializer } import scala.language.implicitConversions import scala.util.{ Failure, Success } import scala.util.control.NonFatal trait Avro4sBinarySupport { implicit def toSerializer[T >: Null](implicit schemaFor: SchemaFor[T], toRecord: ToRecord[T]): Serializer[T] = new Serializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serialize(topic: String, data: T): Array[Byte] = if (data == null) null else { val baos = new ByteArrayOutputStream() try { val output = AvroOutputStream.binary[T](baos) try { output.write(data) } finally { output.close() } baos.toByteArray } catch { case NonFatal(e) => throw new SerializationException(e) } finally { baos.close() } } } implicit def toDeserializer[T >: Null]( implicit schemaFor: SchemaFor[T], fromRecord: FromRecord[T], schemas: WriterReaderSchemas = WriterReaderSchemas() ): Deserializer[T] = new Deserializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def deserialize(topic: String, data: Array[Byte]): T = if (data == null) null else { val it = new AvroBinaryInputStream[T](new SeekableByteArrayInput(data), schemas.writerSchema, schemas.readerSchema).tryIterator if (it.hasNext) { it.next() match { case Success(record) => record case Failure(err) => throw new SerializationException(err) } } else { throw new SerializationException("Empty avro4s binary iterator") } } } implicit def toSerde[T >: Null]( implicit schemaFor: SchemaFor[T], toRecord: ToRecord[T], fromRecord: FromRecord[T], schemas: WriterReaderSchemas = WriterReaderSchemas() ): Serde[T] = new Serde[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serializer(): Serializer[T] = toSerializer[T] override def deserializer(): Deserializer[T] = toDeserializer[T] } } object Avro4sBinarySupport extends Avro4sBinarySupport
Example 13
Source File: Avro4sDataSupport.scala From kafka-serde-scala with Apache License 2.0 | 5 votes |
package io.github.azhur.kafkaserdeavro4s import java.io.ByteArrayOutputStream import java.util import com.sksamuel.avro4s.{ AvroDataInputStream, AvroDataOutputStream, FromRecord, SchemaFor, ToRecord } import org.apache.avro.file.{ CodecFactory, SeekableByteArrayInput } import org.apache.kafka.common.errors.SerializationException import org.apache.kafka.common.serialization.{ Deserializer, Serde, Serializer } import scala.language.implicitConversions import scala.util.control.NonFatal import scala.util.{ Failure, Success } trait Avro4sDataSupport { implicit def toSerializer[T >: Null]( implicit schemaFor: SchemaFor[T], toRecord: ToRecord[T], codec: CodecFactory = CodecFactory.nullCodec() ): Serializer[T] = new Serializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serialize(topic: String, data: T): Array[Byte] = if (data == null) null else { val baos = new ByteArrayOutputStream() try { val output = AvroDataOutputStream[T](baos, codec) try { output.write(data) } finally { output.close() } baos.toByteArray } catch { case NonFatal(e) => throw new SerializationException(e) } finally { baos.close() } } } implicit def toDeserializer[T >: Null]( implicit schemaFor: SchemaFor[T], fromRecord: FromRecord[T], schemas: WriterReaderSchemas = WriterReaderSchemas() ): Deserializer[T] = new Deserializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def deserialize(topic: String, data: Array[Byte]): T = if (data == null) null else { val it = new AvroDataInputStream[T](new SeekableByteArrayInput(data), schemas.writerSchema, schemas.readerSchema).tryIterator if (it.hasNext) { it.next() match { case Success(record) => record case Failure(err) => throw new SerializationException(err) } } else { throw new SerializationException("Empty avro4s data iterator") } } } implicit def toSerde[T >: Null](implicit schemaFor: SchemaFor[T], toRecord: ToRecord[T], fromRecord: FromRecord[T], codec: CodecFactory = CodecFactory.nullCodec()): Serde[T] = new Serde[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serializer(): Serializer[T] = toSerializer[T] override def deserializer(): Deserializer[T] = toDeserializer[T] } } object Avro4sDataSupport extends Avro4sDataSupport
Example 14
Source File: ExampleKafkaStreamsSpec.scala From scalatest-embedded-kafka with MIT License | 5 votes |
package net.manub.embeddedkafka.streams import net.manub.embeddedkafka.Codecs._ import net.manub.embeddedkafka.ConsumerExtensions._ import net.manub.embeddedkafka.EmbeddedKafkaConfig import org.apache.kafka.common.serialization.{Serde, Serdes} import org.apache.kafka.streams.StreamsBuilder import org.apache.kafka.streams.kstream.{Consumed, KStream, Produced} import org.scalatest.{Matchers, WordSpec} class ExampleKafkaStreamsSpec extends WordSpec with Matchers with EmbeddedKafkaStreamsAllInOne { import net.manub.embeddedkafka.Codecs.stringKeyValueCrDecoder implicit val config = EmbeddedKafkaConfig(kafkaPort = 7000, zooKeeperPort = 7001) val (inTopic, outTopic) = ("in", "out") val stringSerde: Serde[String] = Serdes.String() "A Kafka streams test" should { "be easy to run with streams and consumer lifecycle management" in { val streamBuilder = new StreamsBuilder val stream: KStream[String, String] = streamBuilder.stream(inTopic, Consumed.`with`(stringSerde, stringSerde)) stream.to(outTopic, Produced.`with`(stringSerde, stringSerde)) runStreams(Seq(inTopic, outTopic), streamBuilder.build()) { publishToKafka(inTopic, "hello", "world") publishToKafka(inTopic, "foo", "bar") publishToKafka(inTopic, "baz", "yaz") withConsumer[String, String, Unit] { consumer => val consumedMessages: Stream[(String, String)] = consumer.consumeLazily(outTopic) consumedMessages.take(2) should be( Seq("hello" -> "world", "foo" -> "bar")) consumedMessages.drop(2).head should be("baz" -> "yaz") } } } "allow support creating custom consumers" in { val streamBuilder = new StreamsBuilder val stream: KStream[String, String] = streamBuilder.stream(inTopic, Consumed.`with`(stringSerde, stringSerde)) stream.to(outTopic, Produced.`with`(stringSerde, stringSerde)) runStreams(Seq(inTopic, outTopic), streamBuilder.build()) { publishToKafka(inTopic, "hello", "world") publishToKafka(inTopic, "foo", "bar") val consumer = newConsumer[String, String]() consumer.consumeLazily[(String, String)](outTopic).take(2) should be( Seq("hello" -> "world", "foo" -> "bar")) consumer.close() } } "allow for easy string based testing" in { val streamBuilder = new StreamsBuilder val stream: KStream[String, String] = streamBuilder.stream(inTopic, Consumed.`with`(stringSerde, stringSerde)) stream.to(outTopic, Produced.`with`(stringSerde, stringSerde)) runStreamsWithStringConsumer(Seq(inTopic, outTopic), streamBuilder.build()) { consumer => publishToKafka(inTopic, "hello", "world") consumer.consumeLazily[(String, String)](outTopic).head should be( "hello" -> "world") } } } }
Example 15
Source File: UpickleSupport.scala From kafka-serde-scala with Apache License 2.0 | 5 votes |
package io.github.azhur.kafkaserdeupickle import java.nio.charset.StandardCharsets.UTF_8 import java.util import org.apache.kafka.common.errors.SerializationException import org.apache.kafka.common.serialization.{ Deserializer, Serde, Serializer } import upickle.default.{ Reader, Writer, read, write } import scala.language.implicitConversions import scala.util.control.NonFatal trait UpickleSupport { implicit def toSerializer[T >: Null](implicit writer: Writer[T]): Serializer[T] = new Serializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serialize(topic: String, data: T): Array[Byte] = if (data == null) null else try write(data).getBytes(UTF_8) catch { case NonFatal(e) => throw new SerializationException(e) } } implicit def toDeserializer[T >: Null](implicit reader: Reader[T]): Deserializer[T] = new Deserializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def deserialize(topic: String, data: Array[Byte]): T = if (data == null) null else try read(new String(data, UTF_8)) catch { case NonFatal(e) => throw new SerializationException(e) } } implicit def toSerde[T >: Null](implicit reader: Reader[T], writer: Writer[T]): Serde[T] = new Serde[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serializer(): Serializer[T] = toSerializer[T] override def deserializer(): Deserializer[T] = toDeserializer[T] } } object UpickleSupport extends UpickleSupport
Example 16
Source File: JsoniterScalaSupport.scala From kafka-serde-scala with Apache License 2.0 | 5 votes |
package io.github.azhur.kafkaserdejsoniterscala import java.util import com.github.plokhotnyuk.jsoniter_scala.core._ import org.apache.kafka.common.errors.SerializationException import org.apache.kafka.common.serialization.{ Deserializer, Serde, Serializer } import scala.language.implicitConversions import scala.util.control.NonFatal trait JsoniterScalaSupport { implicit def toSerializer[T >: Null]( implicit codec: JsonValueCodec[T], writerConfig: WriterConfig = WriterConfig() ): Serializer[T] = new Serializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serialize(topic: String, data: T): Array[Byte] = if (data == null) null else try writeToArray(data, writerConfig) catch { case NonFatal(e) => throw new SerializationException(e) } } implicit def toDeserializer[T >: Null]( implicit codec: JsonValueCodec[T], readerConfig: ReaderConfig = ReaderConfig() ): Deserializer[T] = new Deserializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def deserialize(topic: String, data: Array[Byte]): T = if (data == null) null else try readFromArray(data, readerConfig) catch { case NonFatal(e) => throw new SerializationException(e) } } implicit def toSerde[T >: Null]( implicit codec: JsonValueCodec[T], writerConfig: WriterConfig = WriterConfig(), readerConfig: ReaderConfig = ReaderConfig() ): Serde[T] = new Serde[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serializer(): Serializer[T] = toSerializer[T] override def deserializer(): Deserializer[T] = toDeserializer[T] } } object JsoniterScalaSupport extends JsoniterScalaSupport
Example 17
Source File: Json4sSupport.scala From kafka-serde-scala with Apache License 2.0 | 5 votes |
package io.github.azhur.kafkaserdejson4s import java.nio.charset.StandardCharsets.UTF_8 import java.util import org.apache.kafka.common.errors.SerializationException import org.apache.kafka.common.serialization.{ Deserializer, Serde, Serializer } import org.json4s.{ Formats, Serialization } import scala.language.implicitConversions import scala.util.control.NonFatal trait Json4sSupport { implicit def toSerializer[T <: AnyRef](implicit serialization: Serialization, formats: Formats): Serializer[T] = new Serializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serialize(topic: String, data: T): Array[Byte] = if (data == null) null else try serialization.write[T](data).getBytes(UTF_8) catch { case NonFatal(e) => throw new SerializationException(e) } } implicit def toDeserializer[T >: Null <: AnyRef: Manifest]( implicit serialization: Serialization, formats: Formats ): Deserializer[T] = new Deserializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def deserialize(topic: String, data: Array[Byte]): T = if (data == null) null else try serialization.read[T](new String(data, UTF_8)) catch { case NonFatal(e) => throw new SerializationException(e) } } implicit def toSerde[T >: Null <: AnyRef: Manifest](implicit serialization: Serialization, formats: Formats): Serde[T] = new Serde[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serializer(): Serializer[T] = toSerializer[T] override def deserializer(): Deserializer[T] = toDeserializer[T] } } object Json4sSupport extends Json4sSupport
Example 18
Source File: CirceSupport.scala From kafka-serde-scala with Apache License 2.0 | 5 votes |
package io.github.azhur.kafkaserdecirce import java.nio.charset.StandardCharsets.UTF_8 import java.util import io.circe.{ Decoder, Encoder, Printer } import org.apache.kafka.common.errors.SerializationException import org.apache.kafka.common.serialization.{ Deserializer, Serde, Serializer } import scala.language.implicitConversions import scala.util.control.NonFatal trait CirceSupport { implicit def toSerializer[T >: Null](implicit encoder: Encoder[T], printer: Printer = Printer.noSpaces): Serializer[T] = new Serializer[T] { import io.circe.syntax._ override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serialize(topic: String, data: T): Array[Byte] = if (data == null) null else try printer.pretty(data.asJson).getBytes(UTF_8) catch { case NonFatal(e) => throw new SerializationException(e) } } implicit def toDeserializer[T >: Null](implicit decoder: Decoder[T]): Deserializer[T] = new Deserializer[T] { import io.circe._ import cats.syntax.either._ override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def deserialize(topic: String, data: Array[Byte]): T = if (data == null) null else parser .parse(new String(data, UTF_8)) .valueOr(e => throw new SerializationException(e)) .as[T] .valueOr(e => throw new SerializationException(e)) } implicit def toSerde[T >: Null](implicit encoder: Encoder[T], printer: Printer = Printer.noSpaces, decoder: Decoder[T]): Serde[T] = new Serde[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} override def close(): Unit = {} override def serializer(): Serializer[T] = toSerializer[T] override def deserializer(): Deserializer[T] = toDeserializer[T] } } object CirceSupport extends CirceSupport
Example 19
Source File: GenericSerde.scala From avro4s with Apache License 2.0 | 5 votes |
package com.sksamuel.avro4s.kafka import java.io.ByteArrayOutputStream import com.sksamuel.avro4s.{AvroFormat, AvroInputStream, AvroOutputStream, AvroSchema, BinaryFormat, DataFormat, Decoder, Encoder, JsonFormat, SchemaFor} import org.apache.avro.Schema import org.apache.kafka.common.serialization.{Deserializer, Serde, Serializer} class GenericSerde[T >: Null : SchemaFor : Encoder : Decoder](avroFormat: AvroFormat = BinaryFormat) extends Serde[T] with Deserializer[T] with Serializer[T] with Serializable { val schema: Schema = AvroSchema[T] override def serializer(): Serializer[T] = this override def deserializer(): Deserializer[T] = this override def deserialize(topic: String, data: Array[Byte]): T = { if (data == null) null else { val avroInputStream = avroFormat match { case BinaryFormat => AvroInputStream.binary[T] case JsonFormat => AvroInputStream.json[T] case DataFormat => AvroInputStream.data[T] } val input = avroInputStream.from(data).build(schema) val result = input.iterator.next() input.close() result } } override def close(): Unit = () override def configure(configs: java.util.Map[String, _], isKey: Boolean): Unit = () override def serialize(topic: String, data: T): Array[Byte] = { val baos = new ByteArrayOutputStream() val avroOutputStream = avroFormat match { case BinaryFormat => AvroOutputStream.binary[T] case JsonFormat => AvroOutputStream.json[T] case DataFormat => AvroOutputStream.data[T] } val output = avroOutputStream.to(baos).build() output.write(data) output.close() baos.toByteArray } }
Example 20
Source File: InternalKafkaAvroSerde.scala From affinity with Apache License 2.0 | 5 votes |
package io.amient.affinity.kafka import io.amient.affinity.avro.record.AvroRecord import org.apache.kafka.common.serialization.{Deserializer, Serde, Serializer} import scala.reflect.runtime.universe._ class InternalKafkaAvroSerde[T: TypeTag] extends Serde[T] { val schema = AvroRecord.inferSchema[T] override def configure(configs: java.util.Map[String, _], isKey: Boolean) = () override def close() = () override def deserializer() = new Deserializer[T] { override def configure(configs: java.util.Map[String, _], isKey: Boolean) = () override def close() = () override def deserialize(topic: String, data: Array[Byte]) = AvroRecord.read(data, schema) } override def serializer() = new Serializer[T] { override def configure(configs: java.util.Map[String, _], isKey: Boolean) = () override def close() = () override def serialize(topic: String, data: T) = AvroRecord.write(data, schema) } }
Example 21
Source File: WindowedMetricSerde.scala From haystack-trends with Apache License 2.0 | 5 votes |
package com.expedia.www.haystack.trends.kstream.serde import java.util import com.expedia.www.haystack.commons.entities.Interval import com.expedia.www.haystack.commons.metrics.MetricsSupport import com.expedia.www.haystack.trends.aggregation.metrics.{AggregationType, CountMetricFactory, HistogramMetricFactory, Metric} import com.expedia.www.haystack.trends.aggregation.{TrendMetric, WindowedMetric} import com.expedia.www.haystack.trends.aggregation.entities.TimeWindow import org.apache.kafka.common.serialization.{Deserializer, Serde, Serializer} import org.msgpack.core.MessagePack import org.msgpack.value.ValueFactory import scala.collection.JavaConverters._ import scala.collection.mutable object WindowedMetricSerde extends Serde[WindowedMetric] with MetricsSupport { private val SERIALIZED_METRIC_KEY = "serializedMetric" private val START_TIME_KEY = "startTime" private val END_TIME_KEY = "endTime" private val aggregationTypeKey = "aggregationType" private val metricsKey = "metrics" override def close(): Unit = () override def deserializer(): Deserializer[WindowedMetric] = { new Deserializer[WindowedMetric] { override def configure(map: util.Map[String, _], b: Boolean): Unit = () override def close(): Unit = () override def serialize(topic: String, windowedMetric: WindowedMetric): Array[Byte] = { val packer = MessagePack.newDefaultBufferPacker() val serializedMetrics = windowedMetric.windowedMetricsMap.map { case (timeWindow, metric) => ValueFactory.newMap(Map( ValueFactory.newString(START_TIME_KEY) -> ValueFactory.newInteger(timeWindow.startTime), ValueFactory.newString(END_TIME_KEY) -> ValueFactory.newInteger(timeWindow.endTime), ValueFactory.newString(SERIALIZED_METRIC_KEY) -> ValueFactory.newBinary(windowedMetric.getMetricFactory.getMetricSerde.serialize(metric)) ).asJava) } val windowedMetricMessagePack = Map( ValueFactory.newString(metricsKey) -> ValueFactory.newArray(serializedMetrics.toList.asJava), ValueFactory.newString(aggregationTypeKey) -> ValueFactory.newString(windowedMetric.getMetricFactory.getAggregationType.toString) ) packer.packValue(ValueFactory.newMap(windowedMetricMessagePack.asJava)) val data = packer.toByteArray data } override def close(): Unit = () } } override def configure(map: util.Map[String, _], b: Boolean): Unit = () }
Example 22
Source File: Streams.scala From haystack-trends with Apache License 2.0 | 5 votes |
package com.expedia.www.haystack.trends.kstream import java.util.function.Supplier import com.expedia.metrics.MetricData import com.expedia.www.haystack.commons.kstreams.serde.metricdata.{MetricDataSerde, MetricTankSerde} import com.expedia.www.haystack.trends.aggregation.TrendMetric import com.expedia.www.haystack.trends.config.AppConfiguration import com.expedia.www.haystack.trends.kstream.processor.{AdditionalTagsProcessorSupplier, ExternalKafkaProcessorSupplier, MetricAggProcessorSupplier} import com.expedia.www.haystack.trends.kstream.store.HaystackStoreBuilder import org.apache.kafka.common.serialization.{Serde, StringDeserializer, StringSerializer} import org.apache.kafka.streams.Topology import org.apache.kafka.streams.state.{KeyValueStore, StoreBuilder} import org.slf4j.LoggerFactory import scala.collection.JavaConverters class Streams(appConfiguration: AppConfiguration) extends Supplier[Topology] { private val LOGGER = LoggerFactory.getLogger(classOf[Streams]) private val TOPOLOGY_SOURCE_NAME = "metricpoint-source" private val TOPOLOGY_EXTERNAL_SINK_NAME = "metricpoint-aggegated-sink-external" private val TOPOLOGY_INTERNAL_SINK_NAME = "metric-data-aggegated-sink-internal" private val TOPOLOGY_AGGREGATOR_PROCESSOR_NAME = "metricpoint-aggregator-process" private val TOPOLOGY_ADDITIONAL_TAGS_PROCESSOR_NAME = "additional-tags-process" private val TOPOLOGY_AGGREGATOR_TREND_METRIC_STORE_NAME = "trend-metric-store" private val kafkaConfig = appConfiguration.kafkaConfig private def initialize(topology: Topology): Topology = { //add source - topic where the raw metricpoints are pushed by the span-timeseries-transformer topology.addSource( kafkaConfig.autoOffsetReset, TOPOLOGY_SOURCE_NAME, kafkaConfig.timestampExtractor, new StringDeserializer, new MetricTankSerde().deserializer(), kafkaConfig.consumeTopic) //The processor which performs aggregations on the metrics topology.addProcessor( TOPOLOGY_AGGREGATOR_PROCESSOR_NAME, new MetricAggProcessorSupplier(TOPOLOGY_AGGREGATOR_TREND_METRIC_STORE_NAME, appConfiguration.encoder), TOPOLOGY_SOURCE_NAME) //key-value, state store associated with each kstreams task(partition) // which keeps the trend-metrics which are currently being computed in memory topology.addStateStore(createTrendMetricStateStore(), TOPOLOGY_AGGREGATOR_PROCESSOR_NAME) // topology to add additional tags if any topology.addProcessor(TOPOLOGY_ADDITIONAL_TAGS_PROCESSOR_NAME, new AdditionalTagsProcessorSupplier(appConfiguration.additionalTags), TOPOLOGY_AGGREGATOR_PROCESSOR_NAME) if (appConfiguration.kafkaConfig.producerConfig.enableExternalKafka) { topology.addProcessor( TOPOLOGY_EXTERNAL_SINK_NAME, new ExternalKafkaProcessorSupplier(appConfiguration.kafkaConfig.producerConfig), TOPOLOGY_ADDITIONAL_TAGS_PROCESSOR_NAME ) } // adding sinks appConfiguration.kafkaConfig.producerConfig.kafkaSinkTopics.foreach(sinkTopic => { if(sinkTopic.enabled){ val serde = Class.forName(sinkTopic.serdeClassName).newInstance().asInstanceOf[Serde[MetricData]] topology.addSink( s"${TOPOLOGY_INTERNAL_SINK_NAME}-${sinkTopic.topic}", sinkTopic.topic, new StringSerializer, serde.serializer(), TOPOLOGY_ADDITIONAL_TAGS_PROCESSOR_NAME) } }) topology } private def createTrendMetricStateStore(): StoreBuilder[KeyValueStore[String, TrendMetric]] = { val stateStoreConfiguration = appConfiguration.stateStoreConfig val storeBuilder = new HaystackStoreBuilder(TOPOLOGY_AGGREGATOR_TREND_METRIC_STORE_NAME, stateStoreConfiguration.stateStoreCacheSize) if (stateStoreConfiguration.enableChangeLogging) { storeBuilder .withLoggingEnabled(JavaConverters.mapAsJavaMap(stateStoreConfiguration.changeLogTopicConfiguration)) } else { storeBuilder .withLoggingDisabled() } } override def get(): Topology = { val topology = new Topology initialize(topology) } }
Example 23
Source File: KStreamBuilderS.scala From kafka-streams-scala with Apache License 2.0 | 5 votes |
package com.github.aseigneurin.kafka.streams.scala import java.util.regex.Pattern import com.github.aseigneurin.kafka.streams.scala.ImplicitConversions._ import org.apache.kafka.common.serialization.Serde import org.apache.kafka.streams.kstream.{GlobalKTable, KStreamBuilder} import org.apache.kafka.streams.processor.TopologyBuilder object KStreamBuilderS { val inner = new KStreamBuilder def stream[K, V](topics: String*) (implicit keySerde: Serde[K], valSerde: Serde[V]): KStreamS[K, V] = inner.stream[K, V](keySerde, valSerde, topics: _*) def stream[K, V](offsetReset: TopologyBuilder.AutoOffsetReset, topics: String*) (implicit keySerde: Serde[K], valSerde: Serde[V]): KStreamS[K, V] = inner.stream[K, V](offsetReset, keySerde, valSerde, topics: _*) def stream[K, V](topicPattern: Pattern) (implicit keySerde: Serde[K], valSerde: Serde[V]): KStreamS[K, V] = inner.stream[K, V](keySerde, valSerde, topicPattern) def stream[K, V](offsetReset: TopologyBuilder.AutoOffsetReset, topicPattern: Pattern) (implicit keySerde: Serde[K], valSerde: Serde[V]): KStreamS[K, V] = inner.stream[K, V](offsetReset, keySerde, valSerde, topicPattern) def table[K, V](topic: String, storeName: String) (implicit keySerde: Serde[K], valSerde: Serde[V]): KTableS[K, V] = inner.table[K, V](keySerde, valSerde, topic, storeName) def table[K, V](offsetReset: TopologyBuilder.AutoOffsetReset, topic: String, storeName: String) (implicit keySerde: Serde[K], valSerde: Serde[V]): KTableS[K, V] = inner.table[K, V](offsetReset, keySerde, valSerde, topic, storeName) def globalTable[K, V](topic: String, storeName: String) (implicit keySerde: Serde[K], valSerde: Serde[V]): GlobalKTable[K, V] = inner.globalTable(keySerde, valSerde, topic, storeName) def merge[K, V](streams: KStreamS[K, V]*): KStreamS[K, V] = { val streamsJ = streams.map { streamS => streamS.inner } inner.merge(streamsJ: _*) } }
Example 24
Source File: KGroupedTableS.scala From kafka-streams-scala with Apache License 2.0 | 5 votes |
package com.github.aseigneurin.kafka.streams.scala import com.github.aseigneurin.kafka.streams.scala.ImplicitConversions._ import org.apache.kafka.common.serialization.Serde import org.apache.kafka.streams.kstream._ import org.apache.kafka.streams.processor.StateStoreSupplier import org.apache.kafka.streams.state.KeyValueStore class KGroupedTableS[K, V](inner: KGroupedTable[K, V]) { def count(storeName: String): KTableS[K, Long] = { inner.count(storeName) .mapValues[Long](javaLong => Long.box(javaLong)) } def count(storeSupplier: StateStoreSupplier[KeyValueStore[_, _]]): KTableS[K, Long] = { inner.count(storeSupplier) .mapValues[Long](javaLong => Long.box(javaLong)) } def reduce(adder: (V, V) => V, subtractor: (V, V) => V, storeName: String): KTableS[K, V] = { val adderJ: Reducer[V] = (v1: V, v2: V) => adder(v1, v2) val subtractorJ: Reducer[V] = (v1: V, v2: V) => subtractor(v1, v2) inner.reduce(adderJ, subtractorJ, storeName) } def reduce(adder: Reducer[V], subtractor: Reducer[V], storeSupplier: StateStoreSupplier[KeyValueStore[_, _]]): KTableS[K, V] = { val adderJ: Reducer[V] = (v1: V, v2: V) => adder(v1, v2) val subtractorJ: Reducer[V] = (v1: V, v2: V) => subtractor(v1, v2) inner.reduce(adderJ, subtractorJ, storeSupplier) } def aggregate[VR](initializer: () => VR, adder: (K, V, VR) => VR, subtractor: (K, V, VR) => VR, storeName: String): KTableS[K, VR] = { val initializerJ: Initializer[VR] = () => initializer() val adderJ: Aggregator[K, V, VR] = (k: K, v: V, va: VR) => adder(k, v, va) val subtractorJ: Aggregator[K, V, VR] = (k: K, v: V, va: VR) => subtractor(k, v, va) inner.aggregate(initializerJ, adderJ, subtractorJ, storeName) } def aggregate[VR](initializer: () => VR, adder: (K, V, VR) => VR, subtractor: (K, V, VR) => VR, aggValueSerde: Serde[VR], storeName: String): KTableS[K, VR] = { val initializerJ: Initializer[VR] = () => initializer() val adderJ: Aggregator[K, V, VR] = (k: K, v: V, va: VR) => adder(k, v, va) val subtractorJ: Aggregator[K, V, VR] = (k: K, v: V, va: VR) => subtractor(k, v, va) inner.aggregate(initializerJ, adderJ, subtractorJ, aggValueSerde, storeName) } def aggregate[VR](initializer: () => VR, adder: (K, V, VR) => VR, subtractor: (K, V, VR) => VR, storeSupplier: StateStoreSupplier[KeyValueStore[_, _]]): KTableS[K, VR] = { val initializerJ: Initializer[VR] = () => initializer() val adderJ: Aggregator[K, V, VR] = (k: K, v: V, va: VR) => adder(k, v, va) val subtractorJ: Aggregator[K, V, VR] = (k: K, v: V, va: VR) => subtractor(k, v, va) inner.aggregate(initializerJ, adderJ, subtractorJ, storeSupplier) } }
Example 25
Source File: ExampleKafkaStreamsSpec.scala From embedded-kafka with MIT License | 5 votes |
package net.manub.embeddedkafka.streams import net.manub.embeddedkafka.Codecs._ import net.manub.embeddedkafka.ConsumerExtensions._ import net.manub.embeddedkafka.EmbeddedKafkaConfig import net.manub.embeddedkafka.streams.EmbeddedKafkaStreams._ import org.apache.kafka.common.serialization.{Serde, Serdes} import org.apache.kafka.streams.StreamsBuilder import org.apache.kafka.streams.kstream.{Consumed, KStream, Produced} import org.scalatest.Assertion import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec class ExampleKafkaStreamsSpec extends AnyWordSpec with Matchers { implicit val config: EmbeddedKafkaConfig = EmbeddedKafkaConfig(kafkaPort = 7000, zooKeeperPort = 7001) val (inTopic, outTopic) = ("in", "out") val stringSerde: Serde[String] = Serdes.String() "A Kafka streams test" should { "be easy to run with streams and consumer lifecycle management" in { val streamBuilder = new StreamsBuilder val stream: KStream[String, String] = streamBuilder.stream(inTopic, Consumed.`with`(stringSerde, stringSerde)) stream.to(outTopic, Produced.`with`(stringSerde, stringSerde)) runStreams(Seq(inTopic, outTopic), streamBuilder.build()) { publishToKafka(inTopic, "hello", "world") publishToKafka(inTopic, "foo", "bar") publishToKafka(inTopic, "baz", "yaz") withConsumer[String, String, Assertion] { consumer => val consumedMessages = consumer.consumeLazily[(String, String)](outTopic) consumedMessages.take(2).toList should be( Seq("hello" -> "world", "foo" -> "bar") ) val h :: _ = consumedMessages.drop(2).toList h should be("baz" -> "yaz") } } } "allow support creating custom consumers" in { val streamBuilder = new StreamsBuilder val stream: KStream[String, String] = streamBuilder.stream(inTopic, Consumed.`with`(stringSerde, stringSerde)) stream.to(outTopic, Produced.`with`(stringSerde, stringSerde)) runStreams(Seq(inTopic, outTopic), streamBuilder.build()) { publishToKafka(inTopic, "hello", "world") publishToKafka(inTopic, "foo", "bar") withConsumer[String, String, Assertion] { consumer => consumer.consumeLazily[(String, String)](outTopic).take(2) should be( Seq("hello" -> "world", "foo" -> "bar") ) } } } "allow for easy string based testing" in { val streamBuilder = new StreamsBuilder val stream: KStream[String, String] = streamBuilder.stream(inTopic, Consumed.`with`(stringSerde, stringSerde)) stream.to(outTopic, Produced.`with`(stringSerde, stringSerde)) runStreams(Seq(inTopic, outTopic), streamBuilder.build())( withConsumer[String, String, Assertion]({ consumer => publishToKafka(inTopic, "hello", "world") val h :: _ = consumer.consumeLazily[(String, String)](outTopic).toList h should be("hello" -> "world") }) )(config) } } }
Example 26
Source File: CirceSerdes.scala From kafka-streams-circe with Apache License 2.0 | 5 votes |
package com.goyeau.kafka.streams.circe import java.nio.charset.StandardCharsets import java.util import io.circe.parser._ import io.circe.{Decoder, Encoder} import org.apache.kafka.common.errors.SerializationException import org.apache.kafka.common.serialization.{Deserializer, Serde, Serdes, Serializer} object CirceSerdes { implicit def serializer[T: Encoder]: Serializer[T] = new Serializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = () override def serialize(topic: String, caseClass: T): Array[Byte] = Encoder[T].apply(caseClass).noSpaces.getBytes(StandardCharsets.UTF_8) override def close(): Unit = () } implicit def deserializer[T: Decoder]: Deserializer[T] = new Deserializer[T] { override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = () override def deserialize(topic: String, data: Array[Byte]): T = Option(data).fold(null.asInstanceOf[T]) { data => decode[T](new String(data, StandardCharsets.UTF_8)) .fold(error => throw new SerializationException(error), identity) } override def close(): Unit = () } implicit def serde[CC: Encoder: Decoder]: Serde[CC] = Serdes.serdeFrom(serializer, deserializer) }