{"componentChunkName":"component---src-templates-blog-post-js","path":"/kafka-streams/","result":{"data":{"markdownRemark":{"html":"<h2 id=\"Introducao\" style=\"position:relative;\">Introdução<a href=\"#Introducao\" aria-label=\"Introducao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Na documentação do Kafka Streams temos a seguinte descrição: “Kafka Streams é uma biblioteca cliente para construir aplicações e microserviços onde a entrada e saída de dados são armazenados nos clusters do Kafka. Ele combina a simplicidade de escrever e subir aplicações Java e Scala no lado do cliente com os benefícios da tecnologia de clusters do lado do servidor do Kafka”</p>\n<p>Isso significa que o Kafka Streams é uma ferramenta para processamento de fluxo de dados (streams) em tempo real que é integrada ao ambiente do Kafka. Possibilitando o processamento, transformação e persistência de dados em novos tópicos.</p>\n<p>Nesse artigo será mostrado um exemplo onde uma aplicação conectada ao Kafka utiliza a biblioteca do Kafka Streams para executar o processamento dos dados.</p>\n<h2 id=\"O-Projeto\" style=\"position:relative;\">O Projeto<a href=\"#O-Projeto\" aria-label=\"O Projeto permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Anteriormente em artigos passados foi mostrado como <a href=\"https://programadev.com.br/kafka-producer-avro/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">produzir mensagens com Kafka</a> e como <a href=\"https://programadev.com.br/kafka-consumer/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">consumir mensagens com Kafka</a> e agora vamos continuar com esse modelo onde o produtor irá enviar esses dados e tanto o consumidor simples quanto o nosso consumidor com Streams irá processar e para esse exemplo não iremos persistir em um novo tópico iremos apenas chamar um <strong>Processor</strong> que irá persistir em um banco de dados.\nA visão geral de como os projetos se comunicam com o Kafka seria algo assim:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 61.34969325153374%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAABEklEQVQoz4VSy46EMAzr//8TZ05c4QfQjIAF8X5DFmdxxXQEG8kKtK6dpDVyxr7vNm/bpliWRTPWruuIJEkkDEPLIc+4giDM8yzTNEnXdTIMgwXWsb+uq8RxLEEQWC4A0S9BEPhNA/xDBHD5DJj3ff8nyJauAgQN4P4heIBjQUBMBa8zuhOU8zCqaJpGc9u28n69JE1T3ftqmYENt2UOfRxHFQMHRjrTo2rwOVsTRZGSOFwc+skyKctSAbLv+5LnuTwFZ2w8z5OiKOyNItd1rd+sJDsMYESg3eRoFYbFaQSeCso/wZZBhlBVVWrKeWINe5y9uV6ACzrzUvion8JcD98J8tnwiTwVcduyK8i27oyZfwG6g691cuSNMQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"diagrama kafka\"\n        title=\"diagrama kafka\"\n        data-src=\"/static/673011c0e7927af171cc4f0073a066c2/a6d36/diagrama-kafka.png\"\n        data-srcset=\"/static/673011c0e7927af171cc4f0073a066c2/222b7/diagrama-kafka.png 163w,\n/static/673011c0e7927af171cc4f0073a066c2/ff46a/diagrama-kafka.png 325w,\n/static/673011c0e7927af171cc4f0073a066c2/a6d36/diagrama-kafka.png 650w,\n/static/673011c0e7927af171cc4f0073a066c2/e548f/diagrama-kafka.png 975w,\n/static/673011c0e7927af171cc4f0073a066c2/8de58/diagrama-kafka.png 1219w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h2 id=\"Iniciando-o-projeto\" style=\"position:relative;\">Iniciando o projeto<a href=\"#Iniciando-o-projeto\" aria-label=\"Iniciando o projeto permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>O projeto foi criado no site <a href=\"https://start.spring.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Spring Initializr</a> como um projeto <strong>Maven</strong> e para usarmos o <strong>Kafka Streams</strong> precisamos adicionar as dependências do <strong>Apache</strong> e também foi adicionado as dependências da <strong>Confluent</strong> para poder ser usado o suporte que existe para <strong>Schema Registry</strong> como Serialização e Deserialização (SerDe):</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\"><span class=\"token comment\">&lt;!-- https://mvnrepository.com/artifact/org.apache.avro/avro --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.apache.avro<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>avro<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>version</span><span class=\"token punctuation\">></span></span>1.10.1<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>version</span><span class=\"token punctuation\">></span></span>\n&lt;/dependency`\n\n<span class=\"token comment\">&lt;!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-streams --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.apache.kafka<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>kafka-streams<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token comment\">&lt;!--dependencies needed for the kafka part --></span>\n<span class=\"token comment\">&lt;!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.apache.kafka<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>kafka-clients<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token comment\">&lt;!-- https://mvnrepository.com/artifact/io.confluent/kafka-avro-serializer --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>io.confluent<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>kafka-avro-serializer<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>version</span><span class=\"token punctuation\">></span></span>5.3.0<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>version</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>dependency</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>io.confluent<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>kafka-streams-avro-serde<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>version</span><span class=\"token punctuation\">></span></span>5.3.0<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>version</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>exclusions</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>exclusion</span><span class=\"token punctuation\">></span></span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>groupId</span><span class=\"token punctuation\">></span></span>org.slf4j<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>groupId</span><span class=\"token punctuation\">></span></span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>artifactId</span><span class=\"token punctuation\">></span></span>slf4j-log4j12<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>artifactId</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>exclusion</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>exclusions</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>dependency</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>E também é necessário adicionar a tag que indica de onde deve ser baixado as dependências da <strong>Confluent</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>repositories</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>repository</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>id</span><span class=\"token punctuation\">></span></span>confluent<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>id</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>url</span><span class=\"token punctuation\">></span></span>https://packages.confluent.io/maven/<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>url</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>repository</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>repositories</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<h2 id=\"Configurando-Kafka-Properties\" style=\"position:relative;\">Configurando Kafka Properties<a href=\"#Configurando-Kafka-Properties\" aria-label=\"Configurando Kafka Properties permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>O <strong>Kafka</strong> é todo baseado em configurações que passamos via <strong>Properties</strong> como no exemplo:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Configuration</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">KafkaConfiguration</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">MessageConfiguration</span> <span class=\"token punctuation\">{</span>\n\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">KafkaProperties</span> kafkaProperties<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">Properties</span> <span class=\"token function\">configureProperties</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n\t\t<span class=\"token class-name\">Properties</span> properties <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Properties</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\tproperties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>APPLICATION_ID_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getApplicationId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tproperties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>GROUP_ID_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getGroupId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tproperties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>BOOTSTRAP_SERVERS_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getBootstrapServers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tproperties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>CLIENT_ID_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getClientId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\tproperties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>PROCESSING_GUARANTEE_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getProcessingGuaranteeConfig</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tproperties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>AUTO_OFFSET_RESET_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getOffsetReset</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tproperties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>DEFAULT_TIMESTAMP_EXTRACTOR_CLASS_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getTimeStampExtarctor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\tproperties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>SCHEMA_REGISTRY_URL_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getSchemaRegistryUrl</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tproperties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>DEFAULT_KEY_SERDE_CLASS_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getDefaultKeySerde</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tproperties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>DEFAULT_VALUE_SERDE_CLASS_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getDefaultValueSerde</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tproperties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>SPECIFIC_AVRO_READER_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">isSpecficAvroReader</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\t<span class=\"token keyword\">return</span> properties<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Das configurações acima vale ressaltar as seguintes:</p>\n<ul>\n<li><strong>APPLICATION_ID_CONFIG</strong>: Um identificador único do processo no cluster do Kafka.</li>\n<li><strong>GROUP_ID_CONFIG</strong>: O identificador do grupo de consumidores.</li>\n<li><strong>BOOTSTRAP_SERVERS_CONFIG</strong>: Pode ser uma lista de url’s de conexão com o cluster do Kafka.</li>\n<li><strong>SCHEMA_REGISTRY_URL_CONFIG</strong>: Url de conexão do <strong>Schema Registry</strong>.</li>\n<li><strong>DEFAULT_KEY_SERDE_CLASS_CONFIG</strong>: Definição do Serializador/Deserializador padrão para as chaves das mensagens.</li>\n<li><strong>DEFAULT_VALUE_SERDE_CLASS_CONFIG</strong>: Definição do Serializador/Deserializador padrão para as mensagens.</li>\n<li><strong>SPECIFIC_AVRO_READER_CONFIG</strong>: Indica que será usado uma classe específica para ler a mensagem <strong>Avro</strong></li>\n</ul>\n<h2 id=\"Configurando-o-processamento\" style=\"position:relative;\">Configurando o processamento<a href=\"#Configurando-o-processamento\" aria-label=\"Configurando o processamento permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Quando recebermos os nossos dados de <strong>Taxpayer</strong> há uma informação sobre a <em>situation</em> do contribuinte. Podemos usar isso e definir um processador específico para cada situação do contribuinte; caso seja <code class=\"language-text\">true</code> será processado pela classe <strong>TaxpayerProcessorSituationTrue</strong> e caso seja <code class=\"language-text\">false</code> pela <strong>TaxpayerProcessorSituationFalse</strong>. Para esse exemplo vamos processar cada contribuinte, de acordo com a sua <em>situation</em> e salvar em um banco de dados para cada tipo de situação do contribuinte.</p>\n<p>A <strong>API do Kafka Streams</strong> fornece uma interface chamada <strong>Processor</strong> para implementarmos um processador de dados e ainda temos uma abstração chamada <strong>AbstractProcessor</strong> que facilita ainda mais esse trabalho, então as classes ficam dessa forma para <em>situation</em> igual a <code class=\"language-text\">true</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Component</span>\n<span class=\"token annotation punctuation\">@Slf4j</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TaxpayerProcessorSituationTrue</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">AbstractProcessor</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">TaxpayerPort</span> repository<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> key<span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span> value<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Processing Taxpayer with situation :: \"</span> <span class=\"token operator\">+</span> value<span class=\"token punctuation\">.</span><span class=\"token function\">getSituation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token class-name\">ComplaintTaxpayer</span> complaintTaxpayer <span class=\"token operator\">=</span> <span class=\"token class-name\">ComplaintTaxpayer</span><span class=\"token punctuation\">.</span><span class=\"token function\">createDefaultedTaxpayer</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\trepository<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span>complaintTaxpayer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E para <em>situation</em> igual a <code class=\"language-text\">false</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Component</span>\n<span class=\"token annotation punctuation\">@Slf4j</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TaxpayerProcessorSituationFalse</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">AbstractProcessor</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n\n\t<span class=\"token annotation punctuation\">@Autowired</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">TaxpayerPort</span> repository<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> key<span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span> value<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Processing Taxpayer with situation :: \"</span> <span class=\"token operator\">+</span> value<span class=\"token punctuation\">.</span><span class=\"token function\">getSituation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token class-name\">DefaultedTaxpayer</span> defaultedTaxpayer <span class=\"token operator\">=</span> <span class=\"token class-name\">DefaultedTaxpayer</span><span class=\"token punctuation\">.</span><span class=\"token function\">createDefaultedTaxpayer</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\trepository<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span>defaultedTaxpayer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Configurando-o-Stream\" style=\"position:relative;\">Configurando o Stream<a href=\"#Configurando-o-Stream\" aria-label=\"Configurando o Stream permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Para configurar a <strong>Stream</strong> é necessário ser passado as <strong>Properties</strong> do cluster do <strong>Kafka</strong>, o nome do <em>tópico</em> e a configuração de <strong>SerDe</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">StreamsBuilder</span> streamsBuilder <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">StreamsBuilder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token class-name\">Serde</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> taxpayerAvroSerde <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SpecificAvroSerde</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\ntaxpayerAvroSerde<span class=\"token punctuation\">.</span><span class=\"token function\">configure</span><span class=\"token punctuation\">(</span><span class=\"token function\">getSerdeProperties</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token class-name\">KStream</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> stream <span class=\"token operator\">=</span> streamsBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">stream</span><span class=\"token punctuation\">(</span><span class=\"token function\">getTopic</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Consumed</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">with</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Serdes</span><span class=\"token punctuation\">.</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> taxpayerAvroSerde<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Nesse trecho de código podemos ver que o <strong>Kafka</strong> possui um <strong>Builder</strong> para as nossas <strong>Streams</strong>, ela recebe o <em>tópico</em> e a combinação <em>chave/valor</em> da mensagem que será recebida. Como estamos trabalhando com <strong>Schema Registry</strong> definimos que o valor dessa mensagem será um <strong>Serde<TaxPayer></strong>.</p>\n<p>Com o objeto <strong>KStream&#x3C;String, TaxPayer></strong> podemos fazer várias manipulações dos dados que irão chegar aqui para podermos filtrá-los e encaminhar para o <strong>Processor</strong> certo vamos usar o método <em>branch</em> que nos devolverá o um <strong>Array</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">KStream</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> branch <span class=\"token operator\">=</span> stream<span class=\"token punctuation\">.</span><span class=\"token function\">branch</span><span class=\"token punctuation\">(</span>\n\t\t\t\t<span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> tax<span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> tax<span class=\"token punctuation\">.</span><span class=\"token function\">getSituation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n\t\t\t\t<span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> tax<span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> tax<span class=\"token punctuation\">.</span><span class=\"token function\">getSituation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token boolean\">true</span>\n\t\t\t\t<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>No código acima usamos o método <em>branch</em> para fazer o nosso filtro por <em>situation</em> e podemos delegar para os <strong>Processors</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">branch<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> processorFalse<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbranch<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> processorTrue<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>O exemplo completo dessa configuração:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Autowired</span>\n<span class=\"token keyword\">private</span> <span class=\"token class-name\">TaxpayerProcessorSituationTrue</span> processorTrue<span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@Autowired</span>\n<span class=\"token keyword\">private</span> <span class=\"token class-name\">TaxpayerProcessorSituationFalse</span> processorFalse<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">private</span> <span class=\"token class-name\">KafkaStreams</span> kafkaStreams<span class=\"token punctuation\">;</span>\n\n<span class=\"token annotation punctuation\">@Override</span>\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getTopic</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token string\">\"taxpayer-avro\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token annotation punctuation\">@SuppressWarnings</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"unchecked\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token annotation punctuation\">@Override</span>\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">StreamsBuilder</span> <span class=\"token function\">creataStream</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token class-name\">StreamsBuilder</span> streamsBuilder <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">StreamsBuilder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token class-name\">Serde</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> taxpayerAvroSerde <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SpecificAvroSerde</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    taxpayerAvroSerde<span class=\"token punctuation\">.</span><span class=\"token function\">configure</span><span class=\"token punctuation\">(</span><span class=\"token function\">getSerdeProperties</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token class-name\">KStream</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span> stream <span class=\"token operator\">=</span> streamsBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">stream</span><span class=\"token punctuation\">(</span><span class=\"token function\">getTopic</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Consumed</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">with</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Serdes</span><span class=\"token punctuation\">.</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> taxpayerAvroSerde<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token class-name\">KStream</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> branch <span class=\"token operator\">=</span> stream<span class=\"token punctuation\">.</span><span class=\"token function\">branch</span><span class=\"token punctuation\">(</span>\n            <span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> tax<span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> tax<span class=\"token punctuation\">.</span><span class=\"token function\">getSituation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> tax<span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> tax<span class=\"token punctuation\">.</span><span class=\"token function\">getSituation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token boolean\">true</span>\n            <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    branch<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> processorFalse<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    branch<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> processorTrue<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">return</span> streamsBuilder<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">private</span> <span class=\"token class-name\">Map</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getSerdeProperties</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token class-name\">Collections</span><span class=\"token punctuation\">.</span><span class=\"token function\">singletonMap</span><span class=\"token punctuation\">(</span>SCHEMA_REGISTRY_URL_CONFIG<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">)</span>kakfaConfiguration<span class=\"token punctuation\">.</span><span class=\"token function\">configureProperties</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>SCHEMA_REGISTRY_URL_CONFIG<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Configurando-o-start\" style=\"position:relative;\">Configurando o start<a href=\"#Configurando-o-start\" aria-label=\"Configurando o start permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Com o <strong>Stream</strong> configurado é necessário fazer o start, onde será passado o <strong>Stream</strong>, as configurações do cluster <strong>Kafka</strong>, um <em>handler</em> de <strong>Exceptions</strong> e um <em>hook</em> para podermos lidar o <em>shutdown</em> da aplicação.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@PostConstruct</span>\n<span class=\"token annotation punctuation\">@Override</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">start</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token class-name\">StreamsBuilder</span> streamsBuilder <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">creataStream</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    kafkaStreams <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">KafkaStreams</span><span class=\"token punctuation\">(</span>streamsBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> kakfaConfiguration<span class=\"token punctuation\">.</span><span class=\"token function\">configureProperties</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    kafkaStreams<span class=\"token punctuation\">.</span><span class=\"token function\">setUncaughtExceptionHandler</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getUncaughtExceptionHandler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    kafkaStreams<span class=\"token punctuation\">.</span><span class=\"token function\">start</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">shutDown</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token annotation punctuation\">@Override</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">shutDown</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">Runtime</span><span class=\"token punctuation\">.</span><span class=\"token function\">getRuntime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">addShutdownHook</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Thread</span><span class=\"token punctuation\">(</span>kafkaStreams<span class=\"token operator\">::</span><span class=\"token function\">close</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">private</span> <span class=\"token class-name\">UncaughtExceptionHandler</span> <span class=\"token function\">getUncaughtExceptionHandler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>thread<span class=\"token punctuation\">,</span> exception<span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> exception<span class=\"token punctuation\">.</span><span class=\"token function\">printStackTrace</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Produzindo-em-um-novo-topico\" style=\"position:relative;\">Produzindo em um novo tópico<a href=\"#Produzindo-em-um-novo-topico\" aria-label=\"Produzindo em um novo topico permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Um ponto muito utilizado quando se trabalha com <strong>Streams</strong> é o processamento, transformação e produção de novos fluxos de dados, então podemos simular o recebimento de uma mensagem de <strong>Taxpayer</strong> e transformamos o <em>name</em> pra <em>lower case</em> e enviamos para um novo tópico chamado <em>name-lower-case-topic</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">KStream</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span><span class=\"token punctuation\">></span></span> nameLowerCase <span class=\"token operator\">=</span> stream<span class=\"token punctuation\">.</span><span class=\"token function\">mapValues</span><span class=\"token punctuation\">(</span>taxpayer <span class=\"token operator\">-></span> taxpayer<span class=\"token punctuation\">.</span><span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toLowerCase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nnameLowerCase<span class=\"token punctuation\">.</span><span class=\"token keyword\">to</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"name-lower-case-topic\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"Conclusao\" style=\"position:relative;\">Conclusão<a href=\"#Conclusao\" aria-label=\"Conclusao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Aqui foi mostrado uma forma de usar <strong>Kafka Streams</strong> porém essa biblioteca é muito extensa e tem muitos recursos, para mais informações consultar as documentações do <a href=\"https://kafka.apache.org/documentation/streams/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Apache Kafka Streams</a> e da <a href=\"https://docs.confluent.io/platform/current/streams/concepts.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Confluent Kafka Streams</a></p>\n<h2 id=\"Codigo-fonte\" style=\"position:relative;\">Código fonte<a href=\"#Codigo-fonte\" aria-label=\"Codigo fonte permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>O código fonte desse projeto pode ser encontrado no <a href=\"https://github.com/guilhermegarcia86/kafka-series/tree/kafka-streams\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub</a></p>","fields":{"slug":"/kafka-streams/"},"frontmatter":{"date":"02 de fevereiro de 2021","description":"Processando fluxo de dados em tempo real","title":"Kafka Streams com Java","tags":["Kafka","Streams","Java"],"author":"Guilherme Alves","image":{"id":"6901e635-e638-5e1e-96b5-a4bbb835d5bd","publicURL":"/static/21d5b19bb315aedb69ca2c0d768e2808/stre.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAC4jAAAuIwF4pT92AAABS0lEQVQ4y7VTv6uCUBj1bzXBCgQHiyBoM3DQycnBpkJwqsWloWhoaJFsqiVQKKeIFsH0PLzwgT+Kx3uv98Hxer97PNxzPZfDh4srHnmeg0ZCuf8nwe+E6T3LMoY6h6sTqYhcFy5QrJV5NC/WOGoWFccxBoMBdrtdQ/z5fDJQ+b7PUN9QxfLj8QDP85hOp1BVFafTqXFGt9uNjZfLBfP5HLZt43g8vt5hEATo9/sMo9EI1+sVlmVhuVzC8zw4jgNRFGGaJuO6rovZbIbtdlsVJCubzQaKoqDb7cIwDCRJguFwCEmSoOs6ZFmGpmlotVoYj8fo9XpYLBbs2zRNm5YLgU6ng8lkgna7jcPhwCyez2d2rvv9nlkNw5D11us1c1H+YRXLURRBEASsVqsf5bCcgkZs7vd7hUCxoL9Mc+q9zOG7AP/mxvzP1ftkfQHnuiDrY8kdVQAAAABJRU5ErkJggg==","aspectRatio":1.4096916299559472,"src":"/static/21d5b19bb315aedb69ca2c0d768e2808/0823f/stre.png","srcSet":"/static/21d5b19bb315aedb69ca2c0d768e2808/c67b7/stre.png 320w,\n/static/21d5b19bb315aedb69ca2c0d768e2808/d3930/stre.png 640w,\n/static/21d5b19bb315aedb69ca2c0d768e2808/0823f/stre.png 1280w,\n/static/21d5b19bb315aedb69ca2c0d768e2808/17523/stre.png 1747w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":8}},"pageContext":{"slug":"/kafka-streams/","previous":{"fields":{"slug":"/spring-validacao/"},"frontmatter":{"title":"Validando requisições com Spring Boot","date":"26 jan, 2021"}},"next":{"fields":{"slug":"/kafka-test/"},"frontmatter":{"title":"Testes no Kafka com JUnit","date":"11 fev, 2021"}}}},"staticQueryHashes":["63159454"]}