{"componentChunkName":"component---src-templates-blog-post-js","path":"/kafka-producer-avro/","result":{"data":{"markdownRemark":{"html":"<p>Vamos iniciar uma série de artigos sobre Kafka, a intenção será mostrar a criação de diversas aplicações que irão se comunicar de forma assíncrona utilizando o <strong>Apache Kafka</strong>.</p>\n<p>Trabalhar com assincronicidade não é uma tarefa simples e fácil, mas extremamente importante em grandes sistemas que precisam manipular grandes volumes de dados.</p>\n<p>Pensando nisso o LinkedIn desenvolveu uma ferramenta para comunicação de mensagens assíncronas, levando em consideração contextos onde o grande volume de dados seja algo impactante, posteriormente se tornando <em>Open Source</em> pela Apache o Kafka é uma ferramente robusta, rápida e escalável.</p>\n<p>Existem muitas ferramentas de mensageria disponíveis e não entraremos aqui no mérito de qual é melhor ou pior, vamos demonstrar que apesar de ser uma ferramenta com suas peculiaridades o <strong>Kafka</strong> pode ser configurado e utilizado de forma rápida, produtiva e sem grandes dores de cabeça para isso.\nNesse artigo criaremos um produtor de mensagens com <strong>Kafka</strong>, também iremos mostrar a vantagem de usarmos um validador para as nossas mensagens através de contratos com <strong>Schema Registry</strong> e utilizaremos <strong>Spring Boot</strong>.</p>\n<p>Também não vamos nos alongar muito nos conceitos sobre o que é o <strong>Kafka</strong> e suas específicidades caso tenha interesse sugerimos os seguintes artigos:</p>\n<ul>\n<li><a href=\"https://kafka.apache.org/intro\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Introdução ao Kafka pela Apache</a></li>\n<li><a href=\"https://www.confluent.io/what-is-apache-kafka/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">O que é Kafka pela Confluent</a></li>\n<li><a href=\"https://www.redhat.com/pt-br/topics/integration/what-is-apache-kafka\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">O que é Kafka pela RedHat</a></li>\n</ul>\n<h2 id=\"Criando-o-ambiente\" style=\"position:relative;\">Criando o ambiente<a href=\"#Criando-o-ambiente\" aria-label=\"Criando o ambiente 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>Antes de mais nada vamos montar a nossa infra estrutura com o <strong>Kafka</strong>, mas nesse exemplo não iremos instalar o <strong>Kafka</strong> e todos os outros serviços dele pois além de ser custoso para a máquina que vai rodá-lo não é necessário com a abordagem que faremos. Ao invés disso usaremos <strong>Docker</strong> e <strong>Docker Compose</strong> para levantar o nosso ambiente.</p>\n<p>Utilizaremos a imagem disponibilizada pela <strong>Landoop</strong> que nos fornece todo o ambiente de desenvolvimento necessário para utilizarmos as funcionalidades do <strong>Kafka</strong>, além disso vamos utilizar em conjunto com <strong>Docker Compose</strong> para termos controle sobre as configurações de variáveis de ambiente, portas e rede.</p>\n<p>O nosso <strong>docker-compose.yml</strong> ficará assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"dockerfile\"><pre class=\"language-dockerfile\"><code class=\"language-dockerfile\">version<span class=\"token punctuation\">:</span> <span class=\"token string\">'2'</span>\n\nservices<span class=\"token punctuation\">:</span>\n  <span class=\"token comment\"># this is our kafka cluster.</span>\n  kafka<span class=\"token punctuation\">-</span>cluster<span class=\"token punctuation\">:</span>\n    image<span class=\"token punctuation\">:</span> landoop/fast<span class=\"token punctuation\">-</span>data<span class=\"token punctuation\">-</span>dev<span class=\"token punctuation\">:</span>cp3.3.0\n    environment<span class=\"token punctuation\">:</span>\n      ADV_HOST<span class=\"token punctuation\">:</span> 127.0.0.1         <span class=\"token comment\"># Change to 192.168.99.100 if using Docker Toolbox</span>\n      RUNTESTS<span class=\"token punctuation\">:</span> 0                 <span class=\"token comment\"># Disable Running tests so the cluster starts faster</span>\n      FORWARDLOGS<span class=\"token punctuation\">:</span> 0              <span class=\"token comment\"># Disable running 5 file source connectors that bring application logs into Kafka topics</span>\n      SAMPLEDATA<span class=\"token punctuation\">:</span> 0               <span class=\"token comment\"># Do not create sea_vessel_position_reports, nyc_yellow_taxi_trip_data, reddit_posts topics with sample Avro records.</span>\n    ports<span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> 2181<span class=\"token punctuation\">:</span>2181                 <span class=\"token comment\"># Zookeeper</span>\n      <span class=\"token punctuation\">-</span> 3030<span class=\"token punctuation\">:</span>3030                 <span class=\"token comment\"># Landoop UI</span>\n      <span class=\"token punctuation\">-</span> 8081<span class=\"token punctuation\">-</span>8083<span class=\"token punctuation\">:</span>8081<span class=\"token punctuation\">-</span>8083       <span class=\"token comment\"># REST Proxy, Schema Registry, Kafka Connect ports</span>\n      <span class=\"token punctuation\">-</span> 9581<span class=\"token punctuation\">-</span>9585<span class=\"token punctuation\">:</span>9581<span class=\"token punctuation\">-</span>9585       <span class=\"token comment\"># JMX Ports</span>\n      <span class=\"token punctuation\">-</span> 9092<span class=\"token punctuation\">:</span>9092                 <span class=\"token comment\"># Kafka Broker</span></code></pre></div>\n<p>Para rodar basta abrirmos o terminal onde está localizado o nosso arquivo <strong>docker-compose.yml</strong> e executar:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">docker-compose up -d</code></pre></div>\n<p>Após fazer isso podemos acessar <a href=\"http://localhost:3030/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">http://localhost:3030/</a> e conseguiremos abrir o dashboard que a <strong>Landoop</strong> disponibiliza e teremos algo parecido com isso:</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: 57.05521472392638%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB20lEQVQoz3VSPY/UMBDdjp9Aiygpaa6i4TcgJH4DOqH7NxQI0QAVDUJUh0Ch4AQCsit27wS3SLAkt2Q3n45jJ3bymDF4iQ4R6WnGM57nNzOZFEUBRlkW2GYFns/OcPgpRjCP8Dn4gG9BiO9vFziKE7yKEryJfiJdLJCGIdL5HL7eYyKlBEM1Elklcf2hwKW7Na7dS/Fs7wBPL97Ck6v7uBIc48LLY1w+nOHHwR1EN28g3r8NKQRk08DzTOq6BkM6KzE703i9rDCNFTbhEqtgiuTjKd6nFV5EG7wjK78uUU5DNKdf4Os9dgodKVnTKphGALYFfz1hYMcawBCaGlortMOAjsL1qPavQj78sQWpLEpS0Sh0bYveWNjOQHcd+R1OigYnuQQlXV76DseEO4U0R6kkNtstsixzca01OlY29Fhb4H6s8YDGkli42JjMEXqyXYII8zynrZeOzBCZ7XtXXJJ5tLF4TBD9fwiTJEFDW/IJ3Wp3rqrK2Z7ImNQYJwnrosI6r8gdYK39l3C1WkEpBUHr98TcbkvzYSJvlctJlKyeIMgfC/F2EkWRI+QAXxC12BGyujExK+poOewPpJDz9fmlcGvjOXIBX+RH+IHf7RrXgZ8rg/Mcl+d+m1/Ylzy93N0qswAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"kafka dash\"\n        title=\"kafka dash\"\n        data-src=\"/static/daa976a6607db021facad89b0d47862c/a6d36/kafka-dash.png\"\n        data-srcset=\"/static/daa976a6607db021facad89b0d47862c/222b7/kafka-dash.png 163w,\n/static/daa976a6607db021facad89b0d47862c/ff46a/kafka-dash.png 325w,\n/static/daa976a6607db021facad89b0d47862c/a6d36/kafka-dash.png 650w,\n/static/daa976a6607db021facad89b0d47862c/e548f/kafka-dash.png 975w,\n/static/daa976a6607db021facad89b0d47862c/3c492/kafka-dash.png 1300w,\n/static/daa976a6607db021facad89b0d47862c/be061/kafka-dash.png 3584w\"\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=\"Schema-Registry\" style=\"position:relative;\">Schema Registry<a href=\"#Schema-Registry\" aria-label=\"Schema Registry 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>Antes de iniciarmos o projeto vamos entender o que é o Schema Registry e por que ele é importante.</p>\n<p>O <strong>Kafka</strong> envia e recebe mensagens porém não faz validação sobre o que está sendo enviado ou recebido até que a aplicação consumidora tente realizar a desserialização da mensagem e caso o contrato da aplicação consumidora não seja compatível ocorrerá um erro. Para evitar isso a <strong>Confluent</strong> criou o <strong>Schema Registry</strong> para fazer a validação de contratos e metadados das mensagens que são trafegadas.</p>\n<p>A grosso modo o <strong>Schema Registry</strong> valida se a mensagem que está sendo enviada por uma aplicação é compatível. Podemos usar vários formatos de arquivos para criar os nossos <em>schemas</em> como <em>XML</em>, <em>CSV</em>, <em>JSON</em> mas aqui usaremos <em>Apache Avro</em> que é um formato desenvolvido para criação de schemas com tipagem.</p>\n<p>O <strong>Schema Registry</strong> é um componente apartado do <strong>Kafka</strong> como na imagem abaixo:</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: 36.19631901840491%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAAAwElEQVQoz32RCQ6AIAwE/f+38DEe8RY8QGsGU2KikaShdLfbBbJlWWTfd9m27TMU++Mo7pyTjORvgU/TJE3TSNd14r1/cc7zjHtd15Kh/ixqTiPYuq5x5yYEZ5wcx/ESrKrqFqQAQUk0DcMgIYR4RpwcHC6OEWU9+6IgzUTf92KtlXEc0z7PcyQbYyTP8/RO4IjSw+C2bePAsixvhxwg40Sn4USvArEoiuRG6+T6WcpLDplM6Fs9gyZ194VTR5QbXQMpIrVMgC21AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"schema registry\"\n        title=\"schema registry\"\n        data-src=\"/static/07a09e0f77520023d2d177b54dfc6205/a6d36/schema-registry.png\"\n        data-srcset=\"/static/07a09e0f77520023d2d177b54dfc6205/222b7/schema-registry.png 163w,\n/static/07a09e0f77520023d2d177b54dfc6205/ff46a/schema-registry.png 325w,\n/static/07a09e0f77520023d2d177b54dfc6205/a6d36/schema-registry.png 650w,\n/static/07a09e0f77520023d2d177b54dfc6205/e548f/schema-registry.png 975w,\n/static/07a09e0f77520023d2d177b54dfc6205/51ed8/schema-registry.png 1021w\"\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=\"Avro\" style=\"position:relative;\">Avro<a href=\"#Avro\" aria-label=\"Avro 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 começarmos a criar o nosso produtor de mensagens vamos aproveitar o projeto do artigo sobre <a href=\"https://programadev.com.br/spring-security-jwt/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Spring Security com JWT</a>. </p>\n<p>Essa aplicação é usada para simular o envio de dados para receita federal, a princípio fazemos um <strong>POST</strong> com os dados de um contribuinte contendo o nome e o CPF.</p>\n<p>Vamos começar criando o nosso <strong>Avro</strong>, dentro da pasta <em>resources/avro</em> criamos o arquivo <em>taxpayer-v1.avsc</em> contendo o nosso schema:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n     <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"record\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token property\">\"namespace\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"com.irs.register.avro.taxpayer\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"TaxPayer\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token property\">\"version\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"1\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token property\">\"fields\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n       <span class=\"token punctuation\">{</span> <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"name\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"doc\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Name of TaxPayer\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n       <span class=\"token punctuation\">{</span> <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"document\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"doc\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Document of TaxPayer\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n       <span class=\"token punctuation\">{</span> <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"situation\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"boolean\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"default\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"doc\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Legal situation of TaxPayer\"</span> <span class=\"token punctuation\">}</span>\n     <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O nosso <strong>Avro</strong> contém os metadados de <em>type</em>, <em>namespace</em>, <em>name</em> e <em>version</em>. Também adicionamos os campos da nossa entidade no array <em>fields</em> e nele conseguimos além do <em>name</em> colocar outros atributos como tipagem com o <em>type</em> e valores padrão com o campo <em>default</em>.</p>\n<p>Vamos adicionar as dependências no projeto:</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>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<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>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 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></code></pre></div>\n<p>E também precisamos adicionar o plugin que irá interpretar o nosso <strong>Avro</strong> e vai gerar a classe Java correspondente.</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>build</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>plugins</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>plugin</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.springframework.boot<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>spring-boot-maven-plugin<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>plugin</span><span class=\"token punctuation\">></span></span>\n\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>plugin</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.springframework.boot<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>spring-boot-maven-plugin<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>plugin</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token comment\">&lt;!--for specific record --></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>plugin</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-maven-plugin<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            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>executions</span><span class=\"token punctuation\">></span></span>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>execution</span><span class=\"token punctuation\">></span></span>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>phase</span><span class=\"token punctuation\">></span></span>generate-sources<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>phase</span><span class=\"token punctuation\">></span></span>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>goals</span><span class=\"token punctuation\">></span></span>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>goal</span><span class=\"token punctuation\">></span></span>schema<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>goal</span><span class=\"token punctuation\">></span></span>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>goal</span><span class=\"token punctuation\">></span></span>protocol<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>goal</span><span class=\"token punctuation\">></span></span>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>goal</span><span class=\"token punctuation\">></span></span>idl-protocol<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>goal</span><span class=\"token punctuation\">></span></span>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>goals</span><span class=\"token punctuation\">></span></span>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>configuration</span><span class=\"token punctuation\">></span></span>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>sourceDirectory</span><span class=\"token punctuation\">></span></span>${project.basedir}/src/main/resources/avro<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>sourceDirectory</span><span class=\"token punctuation\">></span></span>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>stringType</span><span class=\"token punctuation\">></span></span>String<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>stringType</span><span class=\"token punctuation\">></span></span>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>createSetters</span><span class=\"token punctuation\">></span></span>false<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>createSetters</span><span class=\"token punctuation\">></span></span>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>enableDecimalLogicalType</span><span class=\"token punctuation\">></span></span>true<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>enableDecimalLogicalType</span><span class=\"token punctuation\">></span></span>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>fieldVisibility</span><span class=\"token punctuation\">></span></span>private<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>fieldVisibility</span><span class=\"token punctuation\">></span></span>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>configuration</span><span class=\"token punctuation\">></span></span>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>execution</span><span class=\"token punctuation\">></span></span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>executions</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>plugin</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token comment\">&lt;!--force discovery of generated classes --></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>plugin</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.codehaus.mojo<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>build-helper-maven-plugin<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>3.0.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>executions</span><span class=\"token punctuation\">></span></span>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>execution</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>add-source<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>phase</span><span class=\"token punctuation\">></span></span>generate-sources<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>phase</span><span class=\"token punctuation\">></span></span>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>goals</span><span class=\"token punctuation\">></span></span>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>goal</span><span class=\"token punctuation\">></span></span>add-source<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>goal</span><span class=\"token punctuation\">></span></span>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>goals</span><span class=\"token punctuation\">></span></span>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>configuration</span><span class=\"token punctuation\">></span></span>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>sources</span><span class=\"token punctuation\">></span></span>\n                            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>source</span><span class=\"token punctuation\">></span></span>target/generated-sources/avro<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>source</span><span class=\"token punctuation\">></span></span>\n                        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>sources</span><span class=\"token punctuation\">></span></span>\n                    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>configuration</span><span class=\"token punctuation\">></span></span>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>execution</span><span class=\"token punctuation\">></span></span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>executions</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>plugin</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>plugins</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>build</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Com isso feito podemos rodar o comando <code class=\"language-text\">mvn generate-sources</code> e a nossa classe será gerada em <em>target/generated-sources/avro/TaxPayer.java</em>.</p>\n<h2 id=\"Configurando-o-Kafka\" style=\"position:relative;\">Configurando o Kafka<a href=\"#Configurando-o-Kafka\" aria-label=\"Configurando o Kafka 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>Precisamos configurar a nossa aplicação para se conectar com o <strong>Kafka</strong>. O <strong>Kafka</strong> contém uma série de configurações customizáveis e para deixar mais flexível vamos usar algumas delas via <em>properties</em>.</p>\n<p>Vamos criar a nossa classe de configuração dos nossos <em>properties</em>:</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 annotation punctuation\">@ConfigurationProperties</span><span class=\"token punctuation\">(</span>\n    prefix <span class=\"token operator\">=</span> <span class=\"token string\">\"kafka\"</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token annotation punctuation\">@Data</span>\n<span class=\"token annotation punctuation\">@NoArgsConstructor</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">KafkaProperties</span> <span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">></span></span> bootstrapServers<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> acksConfig<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> retriesConfig<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">Class</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token operator\">?</span><span class=\"token punctuation\">></span></span> keySerializer <span class=\"token operator\">=</span> <span class=\"token class-name\">StringSerializer</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">Class</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token operator\">?</span><span class=\"token punctuation\">></span></span> valueSerializer <span class=\"token operator\">=</span> <span class=\"token class-name\">KafkaAvroSerializer</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> schemaRegistryUrl<span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E no nosso arquivo <em>application.yml</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"yml\"><pre class=\"language-yml\"><code class=\"language-yml\"><span class=\"token key atrule\">kafka</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">bootstrapServers</span><span class=\"token punctuation\">:</span> 127.0.0.1<span class=\"token punctuation\">:</span><span class=\"token number\">9092</span> \n  <span class=\"token key atrule\">acksConfig</span><span class=\"token punctuation\">:</span> all\n  <span class=\"token key atrule\">retriesConfig</span><span class=\"token punctuation\">:</span> <span class=\"token number\">10</span>\n  <span class=\"token key atrule\">schemaRegistryUrl</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"http://127.0.0.1:8081\"</span></code></pre></div>\n<p>Aqui temos as configurações para conectar no <strong>Kafka</strong>, no <strong>Schema Registry</strong>, como iremos fazer serialização e desserialização, também temos a configuração de <strong>Acks</strong> que é a confirmação do envio da mensagem, nesse caso queremos que todas as mensagens enviadas informem que foram enviadas positivamente e por fim temos a configuração de <strong>Retries</strong> que irá indicar o reenvio de mensagens que falharem. Existem muitas outras configurações que podemos adicionar mas por hora essas atendem muito bem a nossa aplicação.</p>\n<p>Com o nosso <em>properties</em> criado podemos fazer a configuração do <strong>Kafka</strong> injetando a classe <strong>KafkaProperties</strong> e configurando o nosso <strong>Bean</strong> do produtor do <strong>Kafka</strong>:</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\">MessagingConfigTaxPayer</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">MessagingConfigPort</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</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\">KafkaProperties</span> kafkaProperties<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token annotation punctuation\">@Bean</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"taxpayerProducer\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">KafkaProducer</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 function\">configureProducer</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\t\t\n        properties<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        properties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>ACKS_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getAcksConfig</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        properties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>RETRIES_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getRetriesConfig</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        properties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>KEY_SERIALIZER_CLASS_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getKeySerializer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        properties<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>VALUE_SERIALIZER_CLASS_CONFIG<span class=\"token punctuation\">,</span> kafkaProperties<span class=\"token punctuation\">.</span><span class=\"token function\">getValueSerializer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        properties<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\t\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">KafkaProducer</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>properties<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<h2 id=\"Configurando-o-Produtor\" style=\"position:relative;\">Configurando o Produtor<a href=\"#Configurando-o-Produtor\" aria-label=\"Configurando o Produtor 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>Agora vamos criar o nosso produtor que implementa a interface <strong>MessagingPort<T></strong> que possui três métodos:</p>\n<ul>\n<li><code class=\"language-text\">String topic()</code></li>\n<li><code class=\"language-text\">ProducerRecord&lt;String, T&gt; createProducerRecord(T t)</code></li>\n<li><code class=\"language-text\">void send(CommonDTO dto)</code></li>\n</ul>\n<p>Esses três métodos fornecem o que precisamos para conseguir enviar uma mensagem pelo Kafka e no nosso exemplo será uma classe tipada para a nossa classe <strong>TaxPayer</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Service</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\">TaxpayerService</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">MessagingPort</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</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 annotation punctuation\">@Qualifier</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"taxpayerProducer\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">KafkaProducer</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> producer<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\">String</span> <span class=\"token function\">topic</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token string\">\"taxpayer-avro\"</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t\t\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">ProducerRecord</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 function\">createProducerRecord</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">TaxPayer</span> taxPayer<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n\t\t<span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ProducerRecord</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 keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">topic</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> taxPayer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t<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\">send</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CommonDTO</span> taxpayerDTO<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\n\n\t\t<span class=\"token class-name\">TaxPayer</span> taxPayer <span class=\"token operator\">=</span> <span class=\"token class-name\">TaxPayer</span><span class=\"token punctuation\">.</span><span class=\"token function\">newBuilder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">setName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">TaxpayerDTO</span><span class=\"token punctuation\">)</span> taxpayerDTO<span class=\"token punctuation\">)</span><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>\n\t\t\t\t<span class=\"token punctuation\">.</span><span class=\"token function\">setDocument</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">TaxpayerDTO</span><span class=\"token punctuation\">)</span> taxpayerDTO<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getDocument</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">setSituation</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><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>\n\t\t\n\t\t\n\t\tproducer<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">createProducerRecord</span><span class=\"token punctuation\">(</span>taxPayer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>rm<span class=\"token punctuation\">,</span> ex<span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>ex <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Data sent with success!!!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n\t\t\t\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Fail to send message\"</span><span class=\"token punctuation\">,</span> ex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token punctuation\">}</span>\n\t\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t\tproducer<span class=\"token punctuation\">.</span><span class=\"token function\">flush</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\tproducer<span class=\"token punctuation\">.</span><span class=\"token function\">close</span><span class=\"token punctuation\">(</span><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<p>Detalhando cada método.</p>\n<p>No método <em>topic</em> nós setamos o nome do tópico no <strong>Kafka</strong>.</p>\n<p>O método <em>createProducerRecord</em> recebe como parâmetro o nosso <strong>TaxPayer</strong> e devolve um <strong>ProducerRecord</strong>.</p>\n<p>O método <em>send</em> recebe um <strong>CommonDTO</strong>, que nada mais é do que uma interface de marcação para os <strong>DTOs</strong> da aplicação, nele podemos ver que usamos o <strong>Builder</strong> que a <strong>TaxPayer</strong> fornece, passando os dados que iremos receber no <strong>POST</strong> da <strong>API</strong>.</p>\n<p>Também é nesse método que fazemos o envio da mensagem para o <strong>Kafka</strong>, podemos ver que o método <em>send</em> do <strong>KafkaProducer</strong> recebe o nosso <strong>TaxPayer</strong> mas também executa uma função de <em>callback</em> onde fazemos uma simples verificação de sucesso ou erro e logamos o resultado. Após isso “atualizamos” a transação e fechamos.</p>\n<h2 id=\"Controller\" style=\"position:relative;\">Controller<a href=\"#Controller\" aria-label=\"Controller 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>Precisamos criar a porta de entrada da aplicação, o lugar que irá receber os dados e repassar para a nossa <strong>Service</strong>.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@RestController</span>\n<span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/taxpayer\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TaxpayerController</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\">TaxpayerService</span> taxpayerService<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token annotation punctuation\">@PostMapping</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token class-name\">ResponseEntity</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TaxpayerDTO</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">postTaxpayer</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@RequestBody</span> <span class=\"token class-name\">TaxpayerDTO</span> taxpayer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\t\t\n\t\ttaxpayerService<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>taxpayer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token keyword\">return</span> <span class=\"token class-name\">ResponseEntity</span><span class=\"token punctuation\">.</span><span class=\"token function\">ok</span><span class=\"token punctuation\">(</span>taxpayer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Criamos o endpoint <em>/taxpayer</em> que recebe um <strong>TaxpayerDTO</strong> e chama a <strong>TaxpayerService</strong> que é a responsável por enviar a nossa mensagem.</p>\n<p>A nossa classe <strong>TaxpayerDTO</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Data</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TaxpayerDTO</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CommonDTO</span><span class=\"token punctuation\">{</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> document<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\">String</span> <span class=\"token function\">getType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token string\">\"TaxPayerDTO\"</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Executando\" style=\"position:relative;\">Executando<a href=\"#Executando\" aria-label=\"Executando 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>Vamos executar a aplicação e enviar um <strong>POST</strong> para conferir o funcionamento, para enviar os dados foi utilizado o <a href=\"https://www.4devs.com.br/gerador_de_pessoas\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Gerador de Pessoas</a> e também é necessário enviar o token <strong>JWT</strong> para autorização a esse recurso, para saber mais sobre isso consultar o artigo sobre <a href=\"https://programadev.com.br/spring-security-jwt/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Spring Security com JWT</a>.</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: 47.852760736196316%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABCUlEQVQoz61S2U0EMQxN/wXQCEVsAXTAH7uamSST20ketmGQWGkZhLD0ZDuHr2eTc8YYE6Mm5N2hxYBeC4gIvfcfUUqBtRazRVCJapt1XSHY2NljVIQQEMVmfdj3kPOUWMeMp0vB8wv7foWRT3738N4h2AW73djf9UPmao9KRX+HVElobL/agaurGMHBVM1Y4GPlijKoNR7B0CCT9ZhT/UeYcwAQTE1kqGTUUpFqR+vyYCpEDvu3kAQG/ygS1Dy6+CtMTAkpJ2Ws8fyIms7urDV5W6kyKY1HxcSVBOIYxi0LrrcNb4vD5gMa7xY+Z3jW3hfwkaQwH4Z035jlzGswDjLO274PLtI56Ds8thItn2wgCgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"post kafka\"\n        title=\"post kafka\"\n        data-src=\"/static/91c212e178ee6ac97fbb3e49a156eae6/a6d36/post-kafka.png\"\n        data-srcset=\"/static/91c212e178ee6ac97fbb3e49a156eae6/222b7/post-kafka.png 163w,\n/static/91c212e178ee6ac97fbb3e49a156eae6/ff46a/post-kafka.png 325w,\n/static/91c212e178ee6ac97fbb3e49a156eae6/a6d36/post-kafka.png 650w,\n/static/91c212e178ee6ac97fbb3e49a156eae6/e548f/post-kafka.png 975w,\n/static/91c212e178ee6ac97fbb3e49a156eae6/3c492/post-kafka.png 1300w,\n/static/91c212e178ee6ac97fbb3e49a156eae6/db1b2/post-kafka.png 2900w\"\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<p>E como estamos usando o <em>dashboard</em> da <strong>Landoop</strong> podemos acessar e ver que o nosso <strong>Schema</strong> foi criado e que o nosso tópico também foi criado e que ele possui os dados enviados.</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: 42.94478527607362%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABVUlEQVQoz42Ry07CQBSG+zSKQAEVg4nG9/FCjMELFokkunDlE7hw4doXYiFYCkk1wHQuHezld6ahEpOCnsyXycyc85/LGNWdGsxSGfmCucAsq7sKimYJhaKJtfWNDHLI5QuobG6jslVFbf8Atd09GKfWLepXN6g328l+YnVgPb/i8ekFjfYdzlodHF+2srmwcHh+jSO9N5po3T/AeOv1MXCGsAcO3m0bfXuA3tDFx9jD55RgQqbwGAMTAlz4EH4WUr0JeJTC6Ha7cBwHruvC8zwQQjBVQr5yIAoqGcI4RBgF+I8Zw9EIlDIIFSylTJjNZuCcg6nsE+7B/5JArFYcryQMQxi+CkqCdVsp8zNXrRBBIQOZBGhbJqYtiiIYqYgWTYV/EqhkY0bAVNvaOY5XCyYVLkTYL0E+r5D6AkEYIIqjP+eXVKhnt6xC/XN6ninpjLNI378BsxpwL/gPjuYAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"schema dash\"\n        title=\"schema dash\"\n        data-src=\"/static/3021abb0845bf76d643158dacb63a3bb/a6d36/schema-dash.png\"\n        data-srcset=\"/static/3021abb0845bf76d643158dacb63a3bb/222b7/schema-dash.png 163w,\n/static/3021abb0845bf76d643158dacb63a3bb/ff46a/schema-dash.png 325w,\n/static/3021abb0845bf76d643158dacb63a3bb/a6d36/schema-dash.png 650w,\n/static/3021abb0845bf76d643158dacb63a3bb/e548f/schema-dash.png 975w,\n/static/3021abb0845bf76d643158dacb63a3bb/3c492/schema-dash.png 1300w,\n/static/3021abb0845bf76d643158dacb63a3bb/05214/schema-dash.png 3570w\"\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<p>A cima vemos o nosso <em>schema</em> criado.</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: 26.380368098159508%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAABDklEQVQY023M20rDQBAG4LyM1aZN0hNUfCIx1QubtrFSFY/gheidF75WxYLFnEyaVMVEEo2S/Z1NbUFx4dsZ/tkdobm6BqXWgChVsVJSZsoKilIFJbmKZVFGQZRQKHLlHxKWeKVcrtTpfx0yqTWaEC6vb9DZP4Y2OESbdA9OsHd6jrOLK/Qob3X6WN/uYaOto9Xtk12omo5Nyrf0QZ6p1KvaDu05gmDZNkzLhh8EC5NgCsN9Bp89GCYx8Oh6+cyb+HAcB77nwTAtuJQPh7e4G41wPx5DCOjR0/QFURghimbCMMRr+IbP9AssY8iyDP8exhaVkSRJIPCLi+P4l+Q9QUrLY/KRpvnSv/iSeZ3334j6NPV4oVaCAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"topic dash\"\n        title=\"topic dash\"\n        data-src=\"/static/b60ffd8dcae2af9dda83e141d33b1c0e/a6d36/topic-dash.png\"\n        data-srcset=\"/static/b60ffd8dcae2af9dda83e141d33b1c0e/222b7/topic-dash.png 163w,\n/static/b60ffd8dcae2af9dda83e141d33b1c0e/ff46a/topic-dash.png 325w,\n/static/b60ffd8dcae2af9dda83e141d33b1c0e/a6d36/topic-dash.png 650w,\n/static/b60ffd8dcae2af9dda83e141d33b1c0e/e548f/topic-dash.png 975w,\n/static/b60ffd8dcae2af9dda83e141d33b1c0e/3c492/topic-dash.png 1300w,\n/static/b60ffd8dcae2af9dda83e141d33b1c0e/be061/topic-dash.png 3584w\"\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<p>E aqui temos o nosso tópico criado e vemos a informação que foi enviada.</p>\n<h2 id=\"Consumindo-via-Terminal\" style=\"position:relative;\">Consumindo via Terminal<a href=\"#Consumindo-via-Terminal\" aria-label=\"Consumindo via Terminal 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>Podemos produzir, consumir, criar e fazer todas as operações do <strong>Kafka</strong> via terminal, agora para fins de exemplo vamos consumir a mensagem que enviamos via terminal.</p>\n<p>Podemos fazer isso acessando o nosso <strong>Schema Registry</strong> via <strong>Docker</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">docker run -it --rm --net<span class=\"token operator\">=</span>host confluentinc/cp-schema-registry:3.3.1 <span class=\"token function\">bash</span></code></pre></div>\n<p>E para consumir a mensagem usaremos o utilitário de linha de comando <em>kafka-avro-console-consumer</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">kafka-avro-console-consumer --topic taxpayer-avro <span class=\"token punctuation\">\\</span>\n     --bootstrap-server localhost:9092 <span class=\"token punctuation\">\\</span>\n     --from-beginning <span class=\"token punctuation\">\\</span>\n     --property schema.registry.url<span class=\"token operator\">=</span>http://127.0.0.1:8081</code></pre></div>\n<p>Que irá produzir o resultado:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token punctuation\">{</span><span class=\"token string\">\"name\"</span><span class=\"token builtin class-name\">:</span><span class=\"token string\">\"Luís Marcelo da Conceição\"</span>,<span class=\"token string\">\"document\"</span><span class=\"token builtin class-name\">:</span><span class=\"token string\">\"216.172.648-06\"</span>,<span class=\"token string\">\"situation\"</span>:false<span class=\"token punctuation\">}</span></code></pre></div>\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>Segue o código completo no <a href=\"https://github.com/guilhermegarcia86/kafka-series/tree/avro/register\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub</a></p>","fields":{"slug":"/kafka-producer-avro/"},"frontmatter":{"date":"01 de janeiro de 2021","description":"Criando um produtor de mensagens com Kafka, Avro e Spring Boot","title":"Produzindo mensagens com Kafka e Schema Registry","tags":["Kafka","Spring Boot","Schema Registry","Java"],"author":"Guilherme Alves","image":{"id":"35fae678-8f16-5611-ae35-e08e57d32b5c","publicURL":"/static/7a31b5a7571996c80496f4e66ade7f25/kafka-java.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsSAAALEgHS3X78AAACUUlEQVQ4y5VTz68ZURT2N1j4D8RGiERsxMKGBUGIWIiFlbW3rQS7JizEsrvaNk1F00WbF9GfUiF9BKGvfiVeW4JQz4wxw9e5F4Okr01PcmbOnHvnu+c757uy2WyG7XaL+XyOVqtF4/V6DYZhqLMs+0ffr63332f7ZDzPUzCv1wudTod0Og1iBJjYbrfDg8Yz4kb+IiUjj0wmA5/Ph9FoBLVaLYGdvwnwuRPj2tfYcivsDgcTpxWOx2O4XC7o9XokEgmsViv4/X4YjUaUSiX6syAIF2Bs7QWY0lNs7ycSEwq4XC5polKpwGq10piAXl1doVAowGKxnKo80GNvnmP56hHW9RwFOTKQKFerVUpVoVAgGAzC6XTCbDbD4/EgHo+fKtwK+7j9BmzxCZjrxxf9oxWSwG63IxaL0aRKpaKD6Xa7yOVyF5uJ3U0WmN+LU/3Rwrz8DPxmg6GYY7nNqUKHw4FIJEITSqWSAnY6HWSz2fPjIYjU3te7+NQcoNYf4aY3xpLd4GOjh+/TXyfARqMBrVYLuVyOUChEB0QoEylFo9G9Qnjh0MsdXpfbyH+5xbtaB4sVS12ifBxKvV6HzWajcTKZRDgcRj6flwZF7OtwjP7PGYrNPl4WG/hQ72G94bFkOPDCXmKyjdiDyWQCt9sNjUaDVCpFFR8IBGAymVAulyXK3+4m+NwaoHI7FEEHIvU+3ta6aA5GtB3/FPZxEOeyONImOV6cPMcL0hqlTOQwnU5phQaDgWrwoau3O/jfTLZYLGhA7jPp434APDiOA2nH//pvd7/WeYM1qg4AAAAASUVORK5CYII=","aspectRatio":1.391304347826087,"src":"/static/7a31b5a7571996c80496f4e66ade7f25/9decb/kafka-java.png","srcSet":"/static/7a31b5a7571996c80496f4e66ade7f25/c67b7/kafka-java.png 320w,\n/static/7a31b5a7571996c80496f4e66ade7f25/d3930/kafka-java.png 640w,\n/static/7a31b5a7571996c80496f4e66ade7f25/9decb/kafka-java.png 641w","sizes":"(max-width: 641px) 100vw, 641px"}}}},"timeToRead":11}},"pageContext":{"slug":"/kafka-producer-avro/","previous":{"fields":{"slug":"/spring-security-jwt/"},"frontmatter":{"title":"Spring Security e JWT","date":"14 dez, 2020"}},"next":{"fields":{"slug":"/flyway-java/"},"frontmatter":{"title":"Versionando o banco de dados com Flyway","date":"11 jan, 2021"}}}},"staticQueryHashes":["63159454"]}