{"componentChunkName":"component---src-templates-blog-post-js","path":"/kafka-sink/","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>No último <a href=\"https://programadev.com.br/kafka-connector/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">artigo</a> foi mostrado como é possível a partir de uma fonte de dados externa, alimentar um tópico do <strong>Kafka</strong> através do <strong>Kafka Source</strong>. Agora será visto como podemos fazer a operação inversa onde as informações de um tópico alimentarão uma fonte de dados externa através do <strong>Kafka Sink</strong>, nesse exemplo será usado o banco de dados não relacional <strong>MongoDB</strong>.</p>\n<h2 id=\"Kafka-Sink\" style=\"position:relative;\">Kafka Sink<a href=\"#Kafka-Sink\" aria-label=\"Kafka Sink 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>Como foi visto no artigo passado o <strong>Kafka Source</strong> é uma ferramenta <em>open source</em> criado pela <strong>Apache</strong>, essa ferramenta facilita a comunicação em sistemas externos ao <strong>Kafka</strong>, com isso conseguimos trazer dados de fontes externas e o oposto também pode ocorrer graças ao <strong>Kafka Sink</strong>, que realiza essa operação de <em>sink</em> (escoar) para sistemas externos.</p>\n<h2 id=\"Data-Mountaineer\" style=\"position:relative;\">Data Mountaineer<a href=\"#Data-Mountaineer\" aria-label=\"Data Mountaineer 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>Data Mountaineer</strong> é uma empresa com foco em BigData e streaming de dados que se juntou com a <strong>Landoop</strong> e fornece o connector que se liga ao <strong>Kafka Connect</strong> e realiza a operação de <strong>Sink</strong> que nesse caso será com o <strong>MongoDB</strong>.</p>\n<h2 id=\"Projeto\" style=\"position:relative;\">Projeto<a href=\"#Projeto\" aria-label=\"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 consistirá na configuração de um connector que irá receber mensagens de um tópico do <strong>Kafka</strong> e irá salvar essas informações no <strong>MongoDB</strong>, também será criado um projeto <strong>Java</strong> que estará conectado ao banco de dados e irá expor via <strong>API REST</strong> os dados para consulta.</p>\n<p>Focando na parte que será apresentada temos um desenho do fluxo:</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: 9.202453987730062%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAAsSAAALEgHS3X78AAAAf0lEQVQI1x2MUQqDMBQEvX3OYK8URFAMFBqaUKmpXwVDG5KnI2ZhYWc/pvmsCzlnlFJorbkyzzPDMNRfRDDG4JyjlFJ5HEdCCBxyELYF/32zZ2GLG839MfH/JdpbS9d1Vei9rzvGWKWX0FpLSqm273ucd0gu2OCZXk/2Iqxr4ARX8JM2bMTt3AAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"kafka source sink\"\n        title=\"kafka source sink\"\n        data-src=\"/static/9de042d8118b5a6862915f56b55c1775/a6d36/kafka-source-sink.png\"\n        data-srcset=\"/static/9de042d8118b5a6862915f56b55c1775/222b7/kafka-source-sink.png 163w,\n/static/9de042d8118b5a6862915f56b55c1775/ff46a/kafka-source-sink.png 325w,\n/static/9de042d8118b5a6862915f56b55c1775/a6d36/kafka-source-sink.png 650w,\n/static/9de042d8118b5a6862915f56b55c1775/e548f/kafka-source-sink.png 975w,\n/static/9de042d8118b5a6862915f56b55c1775/bb3ba/kafka-source-sink.png 1121w\"\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>Onde podemos ver de forma resumida o fluxo de dados que começa com o banco de dados <strong>MySQL</strong>, onde as alterações são capturadas pelo <strong>Debezium</strong> e através do <strong>Kafka Connect</strong> são enviadas ao broker do <strong>Kafka</strong> e também via <strong>Kafka Connect</strong> os dados são consumidos de um tópico e enviados ao <strong>Data Mountaineer</strong> e serão inseridos no <strong>MongoDB</strong>.</p>\n<h2 id=\"Adicionando-o-Mongo-ao-Docker-Compose\" style=\"position:relative;\">Adicionando o Mongo ao Docker Compose<a href=\"#Adicionando-o-Mongo-ao-Docker-Compose\" aria-label=\"Adicionando o Mongo ao Docker Compose 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>É necessário adicionar o <strong>MongoDB</strong> ao docker-compose como abaixo:</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\">  <span class=\"token key atrule\">mongo</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">image</span><span class=\"token punctuation\">:</span> mongo\n    <span class=\"token key atrule\">container_name</span><span class=\"token punctuation\">:</span> mongo\n    <span class=\"token key atrule\">depends_on</span><span class=\"token punctuation\">:</span> \n    <span class=\"token punctuation\">-</span> kafka<span class=\"token punctuation\">-</span>cluster    \n    <span class=\"token key atrule\">ports</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> 27017<span class=\"token punctuation\">:</span><span class=\"token number\">27017</span>\n    <span class=\"token key atrule\">networks</span><span class=\"token punctuation\">:</span> \n      <span class=\"token punctuation\">-</span> kafka<span class=\"token punctuation\">-</span>network</code></pre></div>\n<h2 id=\"Acessando-o-MongoDB\" style=\"position:relative;\">Acessando o MongoDB<a href=\"#Acessando-o-MongoDB\" aria-label=\"Acessando o MongoDB 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 acessar o <strong>MongoDB</strong> via terminal:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">docker <span class=\"token builtin class-name\">exec</span> -it mongo mongo</code></pre></div>\n<p>E vamos acessar a collection <strong>taxpayer</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">use taxpayer</code></pre></div>\n<h2 id=\"Configurando-Kafka-Sink\" style=\"position:relative;\">Configurando Kafka Sink<a href=\"#Configurando-Kafka-Sink\" aria-label=\"Configurando Kafka Sink 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 o <strong>Kafka Sink</strong> basta acessar novamente o dashboard, através da imagem <em>landoop/kafka-lenses-dev</em> e clicar em <strong>Connectors</strong> no lado esquerdo e depois no botão <strong>New Connector</strong>.</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: 62.576687116564415%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABUElEQVQ4y52Su04CQRSG50nsFCwE6Sx0QRZjiDYaX0Beg8TS5zEKURJvvYkm9lSGwsYLy97msr8zZx0uK4I4yZe5nf+b2cmyxnEDB4dHqLo7KFdcOM42nPLf2XIqlK3X9+HWdsFOmqd4eHyGN/Dx0ffghyH8YEF05tPz0R8EYEv5TZy1rmFaEMXUJ/9AaaQesNLGHtqd+1SoT0qSBEopgnNOvV2L49FcSDmsE8KME3CpwHKFMs7b6Q1jI6Bwii00kMTOSaggVXqQGZs1Eq6Wari4vCWhCZjgT4CIy/Q5pu6PDmH59RpaV3dULGUass0Umhbpt3177yMMo+Ga7cdrSbhSqM4V9l5e0bl5QrfbmyqbFBZHQi4Evcs49lO8gOt9SfNsjYVnhSEXtJhFmIARf4dmMSGMtNCEsmTls2C5ojshnHeDuTdcXnOGv81vN1yEL+j/sjumY5XAAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"new connector\"\n        title=\"new connector\"\n        data-src=\"/static/3a6ced4dd368370f42f1f40fb0523075/a6d36/new-connector.png\"\n        data-srcset=\"/static/3a6ced4dd368370f42f1f40fb0523075/222b7/new-connector.png 163w,\n/static/3a6ced4dd368370f42f1f40fb0523075/ff46a/new-connector.png 325w,\n/static/3a6ced4dd368370f42f1f40fb0523075/a6d36/new-connector.png 650w,\n/static/3a6ced4dd368370f42f1f40fb0523075/e548f/new-connector.png 975w,\n/static/3a6ced4dd368370f42f1f40fb0523075/3c492/new-connector.png 1300w,\n/static/3a6ced4dd368370f42f1f40fb0523075/be061/new-connector.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>Será exibida a tela com os conectores disponíveis e entre eles o conector do <strong>MongoDB</strong> basta clicar nele que será aberta a tela para inserir as configurações.</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: 62.576687116564415%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABxklEQVQ4y4WTyW7UQBCG/SIcScKBLDcOxJOxJyIRuYB4AfIaSNx4ISAJi1iScyQOvESkzIxnbPfi7nb/VLXt0SwWKalku6vq81/V3dH523O8ev0Gw2SEJDnG4CjFYTxEvOThe5CGWDwYNh43z8P4CEl6jJPTM6SjF4jev/uA2z9/oZTGdDpDWZaQUkJrHdaUUvReocjHyGYTiovgiuO6i2uUQqIgjx5tP8fHyx9gmxcCVWVQ1x7rVnsH0cKNtegzLosOnr3E1fcbCCFwN54hlxVcXcN7T+A6OL9XxpICRepV+OlKvH0aVyN6sp/g85dflEQtz0tYx+p8KOicTVaWOpChRUUql+Od2wA8GAUg24yAPBdj3QawUBaTOc2W5qpbhb3Anf0RLlpgxkBSwO2tAj2146nldhP+B9zaHeLy2zXNwGCczUOyc5sKDbWZ5wLyoZa3dhMC3sDaAvfTjJIb4PIc2Zyt6GgwUD+kMMHF19+hqJQ8v3ojsQFqOgllUFgZE9b6gXvJYlN46zvznbdAPlaTLIfU/eoWwO29dAFsWl23ViGpEqLZELO2aSvAx09jfLr62QyebgDfkl73fBO4yIXCvhxe/we957EnyyZHpwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"mongo sink\"\n        title=\"mongo sink\"\n        data-src=\"/static/c2781b44b4872c713de52169faedb571/a6d36/mongo-sink.png\"\n        data-srcset=\"/static/c2781b44b4872c713de52169faedb571/222b7/mongo-sink.png 163w,\n/static/c2781b44b4872c713de52169faedb571/ff46a/mongo-sink.png 325w,\n/static/c2781b44b4872c713de52169faedb571/a6d36/mongo-sink.png 650w,\n/static/c2781b44b4872c713de52169faedb571/e548f/mongo-sink.png 975w,\n/static/c2781b44b4872c713de52169faedb571/3c492/mongo-sink.png 1300w,\n/static/c2781b44b4872c713de52169faedb571/be061/mongo-sink.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>Nessa tela iremos inserir as seguintes configurações:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">connector.class<span class=\"token operator\">=</span>com.datamountaineer.streamreactor.connect.mongodb.sink.MongoSinkConnector\nconnect.mongo.kcql<span class=\"token operator\">=</span>UPSERT INTO taxpayer SELECT after FROM irs-conn.decider.complaint_taxpayer PK after.document<span class=\"token punctuation\">;</span>UPSERT INTO taxpayer SELECT after FROM irs-conn.decider.defaulted_taxpayer PK after.document\nconnect.mongo.connection<span class=\"token operator\">=</span>mongodb://mongo:27017\ntasks.max<span class=\"token operator\">=</span><span class=\"token number\">2</span>\n<span class=\"token assign-left variable\">topics</span><span class=\"token operator\">=</span>irs-conn.decider.complaint_taxpayer,irs-conn.decider.defaulted_taxpayer\n<span class=\"token assign-left variable\">name</span><span class=\"token operator\">=</span>mongo\nconnect.mongo.db<span class=\"token operator\">=</span>taxpayer</code></pre></div>\n<p>Vamos bater ponto a ponto essa configuração:</p>\n<ul>\n<li><code class=\"language-text\">name</code>: Nome da conexão.</li>\n<li><code class=\"language-text\">connector.class</code>: É a classe que é carregada para fazer a conexão com o <strong>MongoDB</strong>.</li>\n<li><code class=\"language-text\">connect.mongo.connection</code>: URI de conexão com o banco de dados.</li>\n<li><code class=\"language-text\">connect.mongo.db</code>: Nome da collection no Mongo.</li>\n<li><code class=\"language-text\">tasks.max</code>: Máximo de tasks para essa conexão.</li>\n<li><code class=\"language-text\">topics</code>: Aqui deve ser informado quais são os tópicos que serão “escutados” pelo <strong>Kafka Connect</strong> para delegar ao <strong>Data Mountaineer</strong></li>\n<li><code class=\"language-text\">connect.mongo.kcql</code>: <strong>KCQL</strong> é como diz <a href=\"https://docs.lenses.io/2.1/lenses-sql/kcql.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">documentação</a>, <strong>SQL for Kafka Connect</strong>, não é algo incomum a própria <strong>Confluent</strong> possui algo similar que é o <strong>kSQL</strong> que nada mais é do que uma forma de simplificar a manipulação de dados e streams através de queries <strong>SQL</strong>. Como no nosso exemplo iremos capturar dados de dois tópicos precisamos criar duas <em>queries</em> para fazer <strong>UPSERT</strong> no <strong>MongoDB</strong>.</li>\n</ul>\n<p>Após clicar em <strong>Create Connector</strong> a nova conexão deve ser listada como mostrado 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: 62.576687116564415%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABg0lEQVQ4y5WSvU7DMBDH/SCslA8JShcGJNI2aVUGFhAvADwGAxuvw1AQICRgYUJiYOgDsCExtE2bDzv2nzunTUIKrWrlpztf7P+dfRbnp2c4Oj6B67VRb3hwnCacejO1Rep/s+800HTb6Bwcwmt1IC4vrvD2/gF/NEZ/MEQQhhgHobVBGGVw7D+UkpBxDH8cQKxU9nDdfQSPIJLQZLUBZKKJxIqxb+NEYn5DH3qffbz2vjCKEojqbgc3909WMKTN2hhorZGQiFIJoazPMUUJ2Nr/E8sMRhG+BwFCSYKbNQ/du1QwimKb0ZAoI6XKfCaOpRVgn5PpgigPRUcTG7VWJphuMBm0rzQ3kxMU7MTnivlqxPpOC7cPL1Zw6I+zajirVCoTYWuvgY6dV5iuY9/GWLCy7WaCITWFrzkV1dRB327KYyY7XkxdnSZjIV6TClZdaspzuojuLNGmgC7N5yPLghEJps9liinNFzMjyJ3K0aX5YsRa1ZtT4fKI1S0nf4czFS7PD5HZsfe5ABi7AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"mongo config\"\n        title=\"mongo config\"\n        data-src=\"/static/68f1a7b59db7a80c9e2162e047db7136/a6d36/mongo-config.png\"\n        data-srcset=\"/static/68f1a7b59db7a80c9e2162e047db7136/222b7/mongo-config.png 163w,\n/static/68f1a7b59db7a80c9e2162e047db7136/ff46a/mongo-config.png 325w,\n/static/68f1a7b59db7a80c9e2162e047db7136/a6d36/mongo-config.png 650w,\n/static/68f1a7b59db7a80c9e2162e047db7136/e548f/mongo-config.png 975w,\n/static/68f1a7b59db7a80c9e2162e047db7136/3c492/mongo-config.png 1300w,\n/static/68f1a7b59db7a80c9e2162e047db7136/be061/mongo-config.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=\"Monitorando-o-MongoDB\" style=\"position:relative;\">Monitorando o MongoDB<a href=\"#Monitorando-o-MongoDB\" aria-label=\"Monitorando o MongoDB 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 podemos realizar alterações no <strong>MySQL</strong> e elas serão enviadas para os tópicos correspondentes e serão capturadas pelo <strong>Kafka Sink</strong> e enviadas ao <strong>MongoDB</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">></span> db.taxpayer.find<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>.<span class=\"token function-name function\">pretty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"_id\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"890.955.180-19\"</span>,\n        <span class=\"token string\">\"after\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token string\">\"document\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"890.955.180-19\"</span>,\n                <span class=\"token string\">\"email\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"teste@teste.com\"</span>,\n                <span class=\"token string\">\"name\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"Sandra Nair Sueli Ribeiro\"</span>,\n                <span class=\"token string\">\"status\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"DEFAULTED\"</span>\n        <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"_id\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"869.097.474-10\"</span>,\n        <span class=\"token string\">\"after\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token string\">\"document\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"869.097.474-10\"</span>,\n                <span class=\"token string\">\"email\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"fake@fake.com.br\"</span>,\n                <span class=\"token string\">\"name\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"Joao Alface\"</span>,\n                <span class=\"token string\">\"status\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"COMPLAINT\"</span>\n        <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"Projeto-Java\" style=\"position:relative;\">Projeto Java<a href=\"#Projeto-Java\" aria-label=\"Projeto Java 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 iniciar o projeto foi utilizado o <strong>Spring Initializr</strong> onde foi adicionado as dependências de <strong>Web</strong>, <strong>Lombok</strong> e <strong>Spring Data Mongo</strong>.</p>\n<p>Iniciando pelo domínio dessa aplicação temos a <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\">@Data</span>\n<span class=\"token annotation punctuation\">@Builder</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Taxpayer</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> document<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> email<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> status<span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E nos casos de uso dessa aplicação queremos que seja possível buscar os <strong>Taxpayers</strong> pelo número de documento, email e listar todos. Para isso foi criado a classe <strong>SearchTaxpayer</strong>:</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 keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">SearchTaxpayer</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">TaxpayerRepository</span> taxpayerRepository<span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">SearchTaxpayer</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">TaxpayerRepository</span> taxpayerRepository<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>taxpayerRepository <span class=\"token operator\">=</span> taxpayerRepository<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Taxpayer</span> <span class=\"token function\">searchByEmail</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">final</span> <span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Taxpayer</span><span class=\"token punctuation\">></span></span> optionalTaxpayer <span class=\"token operator\">=</span> taxpayerRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByEmail</span><span class=\"token punctuation\">(</span>email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>optionalTaxpayer<span class=\"token punctuation\">.</span><span class=\"token function\">isPresent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TaxpayerNotFoundException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Taxpayer not found\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">return</span> optionalTaxpayer<span class=\"token punctuation\">.</span><span class=\"token function\">get</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\">public</span> <span class=\"token class-name\">Taxpayer</span> <span class=\"token function\">searchByDocument</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> document<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">final</span> <span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Taxpayer</span><span class=\"token punctuation\">></span></span> optionalTaxpayer <span class=\"token operator\">=</span> taxpayerRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByDocument</span><span class=\"token punctuation\">(</span>document<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>optionalTaxpayer<span class=\"token punctuation\">.</span><span class=\"token function\">isPresent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TaxpayerNotFoundException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Taxpayer not found\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">return</span> optionalTaxpayer<span class=\"token punctuation\">.</span><span class=\"token function\">get</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\">public</span> <span class=\"token class-name\">List</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 function\">findAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> taxpayerRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findAll</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><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Para ela funcionar é necessário criar a classe <strong>TaxpayerRepository</strong> que nada mais é que a interface que servirá como <em>port</em> no conceito de <em>ports and adapters</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">TaxpayerRepository</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token class-name\">Optional</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 function\">findByEmail</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token class-name\">Optional</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 function\">findByDocument</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> document<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">List</span><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Taxpayer</span><span class=\"token punctuation\">></span><span class=\"token punctuation\">></span></span> <span class=\"token function\">findAll</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<p>E agora criamos o nosso <strong>Adapter</strong> para ele, mas primeiro faremos as configurações que o <strong>MongoDB</strong> necessita, primeiro criando a nossa entidade de banco de dados:</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 annotation punctuation\">@Document</span><span class=\"token punctuation\">(</span>collection <span class=\"token operator\">=</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\">TaxpayerEntity</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token annotation punctuation\">@Id</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> id<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">After</span> after<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\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\">After</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> document<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> email<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> status<span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Como estamos usando <strong>Spring Data</strong> o trabalho é muito simplificado bastando criar uma interface que estenda de <strong>MongoRepository</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">MongoTaxpayerRepository</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">MongoRepository</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TaxpayerEntity</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span><span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TaxpayerEntity</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">findByAfter_Email</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TaxpayerEntity</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">findByAfter_Document</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> document<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Agora criamos o <strong>Adapter</strong> implementando a <strong>TaxpayerRepository</strong>:</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 keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">MongoTaxpayer</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">TaxpayerRepository</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">MongoTaxpayerRepository</span> mongoTaxpayerRepository<span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">MongoTaxpayer</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">MongoTaxpayerRepository</span> mongoTaxpayerRepository<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>mongoTaxpayerRepository <span class=\"token operator\">=</span> mongoTaxpayerRepository<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 class-name\">Optional</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 function\">findByEmail</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> email<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">final</span> <span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TaxpayerEntity</span><span class=\"token punctuation\">></span></span> optionalTaxpayerEntity <span class=\"token operator\">=</span> mongoTaxpayerRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByAfter_Email</span><span class=\"token punctuation\">(</span>email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>optionalTaxpayerEntity<span class=\"token punctuation\">.</span><span class=\"token function\">isPresent</span><span class=\"token punctuation\">(</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\">Optional</span><span class=\"token punctuation\">.</span><span class=\"token function\">empty</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\">final</span> <span class=\"token class-name\">After</span> after <span class=\"token operator\">=</span> optionalTaxpayerEntity<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getAfter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">Optional</span><span class=\"token punctuation\">.</span><span class=\"token function\">of</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Taxpayer</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">name</span><span class=\"token punctuation\">(</span>after<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 punctuation\">.</span><span class=\"token function\">document</span><span class=\"token punctuation\">(</span>after<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\">email</span><span class=\"token punctuation\">(</span>after<span class=\"token punctuation\">.</span><span class=\"token function\">getEmail</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\">status</span><span class=\"token punctuation\">(</span>after<span class=\"token punctuation\">.</span><span class=\"token function\">getStatus</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\">build</span><span class=\"token punctuation\">(</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 class-name\">Optional</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 function\">findByDocument</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> document<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">final</span> <span class=\"token class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TaxpayerEntity</span><span class=\"token punctuation\">></span></span> optionalTaxpayerEntity <span class=\"token operator\">=</span> mongoTaxpayerRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByAfter_Document</span><span class=\"token punctuation\">(</span>document<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>optionalTaxpayerEntity<span class=\"token punctuation\">.</span><span class=\"token function\">isPresent</span><span class=\"token punctuation\">(</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\">Optional</span><span class=\"token punctuation\">.</span><span class=\"token function\">empty</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\">final</span> <span class=\"token class-name\">After</span> after <span class=\"token operator\">=</span> optionalTaxpayerEntity<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getAfter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">Optional</span><span class=\"token punctuation\">.</span><span class=\"token function\">of</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Taxpayer</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">name</span><span class=\"token punctuation\">(</span>after<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 punctuation\">.</span><span class=\"token function\">document</span><span class=\"token punctuation\">(</span>after<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\">email</span><span class=\"token punctuation\">(</span>after<span class=\"token punctuation\">.</span><span class=\"token function\">getEmail</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\">status</span><span class=\"token punctuation\">(</span>after<span class=\"token punctuation\">.</span><span class=\"token function\">getStatus</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\">build</span><span class=\"token punctuation\">(</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 class-name\">Optional</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">List</span><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Taxpayer</span><span class=\"token punctuation\">></span><span class=\"token punctuation\">></span></span> <span class=\"token function\">findAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token keyword\">final</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TaxpayerEntity</span><span class=\"token punctuation\">></span></span> taxpayerEntityList <span class=\"token operator\">=</span> mongoTaxpayerRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span> <span class=\"token operator\">==</span> taxpayerEntityList <span class=\"token operator\">||</span> taxpayerEntityList<span class=\"token punctuation\">.</span><span class=\"token function\">isEmpty</span><span class=\"token punctuation\">(</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\">Optional</span><span class=\"token punctuation\">.</span><span class=\"token function\">empty</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\">final</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Taxpayer</span><span class=\"token punctuation\">></span></span> taxpayerList <span class=\"token operator\">=</span> taxpayerEntityList<span class=\"token punctuation\">.</span><span class=\"token function\">stream</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>taxpayerEntity <span class=\"token operator\">-></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">final</span> <span class=\"token class-name\">After</span> after <span class=\"token operator\">=</span> taxpayerEntity<span class=\"token punctuation\">.</span><span class=\"token function\">getAfter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token keyword\">return</span> <span class=\"token class-name\">Taxpayer</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">name</span><span class=\"token punctuation\">(</span>after<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 punctuation\">.</span><span class=\"token function\">document</span><span class=\"token punctuation\">(</span>after<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\">email</span><span class=\"token punctuation\">(</span>after<span class=\"token punctuation\">.</span><span class=\"token function\">getEmail</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\">status</span><span class=\"token punctuation\">(</span>after<span class=\"token punctuation\">.</span><span class=\"token function\">getStatus</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\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">collect</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Collectors</span><span class=\"token punctuation\">.</span><span class=\"token function\">toList</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">Optional</span><span class=\"token punctuation\">.</span><span class=\"token function\">of</span><span class=\"token punctuation\">(</span>taxpayerList<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Com o adaptador criado vamos criar o controller que irá receber as requisições <strong>REST</strong> e delegar para a classe <strong>SearchTaxpayer</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\n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">SearchTaxpayer</span> searchTaxpayer<span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@GetMapping</span>\n    <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\">List</span><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Taxpayer</span><span class=\"token punctuation\">></span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getAllTaxpayers</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\">ResponseEntity</span><span class=\"token punctuation\">.</span><span class=\"token function\">ok</span><span class=\"token punctuation\">(</span>searchTaxpayer<span class=\"token punctuation\">.</span><span class=\"token function\">findAll</span><span class=\"token punctuation\">(</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\">@GetMapping</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"document\"</span><span class=\"token punctuation\">)</span>\n    <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\">Taxpayer</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getTaxpayerByDocument</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@RequestParam</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"document\"</span><span class=\"token punctuation\">)</span> <span class=\"token class-name\">String</span> document<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <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>searchTaxpayer<span class=\"token punctuation\">.</span><span class=\"token function\">searchByDocument</span><span class=\"token punctuation\">(</span>document<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\">@GetMapping</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"email\"</span><span class=\"token punctuation\">)</span>\n    <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\">Taxpayer</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getTaxpayerByEmail</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@RequestParam</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"email\"</span><span class=\"token punctuation\">)</span> <span class=\"token class-name\">String</span> email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <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>searchTaxpayer<span class=\"token punctuation\">.</span><span class=\"token function\">searchByEmail</span><span class=\"token punctuation\">(</span>email<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 punctuation\">}</span></code></pre></div>\n<p>Após subir a aplicação e fazendo uma requisição para url <code class=\"language-text\">localhost:8080/taxpayer/</code> teremos como resultado:</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 punctuation\">{</span>\n        <span class=\"token property\">\"document\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"890.955.180-19\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"email\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"teste@teste.com\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Sandra Nair Sueli Ribeiro\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"status\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"DEFAULTED\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"document\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"1234567890\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"email\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"fake@fake.com.br\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Joao Alface\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"status\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"COMPLAINT\"</span>\n    <span class=\"token punctuation\">}</span>\n<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 vimos a outra ponta do <strong>Kafka Connect</strong>, o <strong>Kafka Sink</strong> e foi apresentado um exemplo prático de como podemos ter bases ou até mesmo aplicações que podem receber dados através de streams com as ferramentas que o <strong>Kafka</strong> disponibiliza.</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 do projeto está no <a href=\"https://github.com/guilhermegarcia86/kafka-series/tree/kafka-sink\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub</a></p>","fields":{"slug":"/kafka-sink/"},"frontmatter":{"date":"02 de março de 2021","description":"Enviando informações do Kafka para o seu banco de dados","title":"Kafka Sink","tags":["Kafka","Kafka Sink","Banco de Dados"],"author":"Guilherme Alves","image":{"id":"21858179-1878-5709-825a-11e57664847d","publicURL":"/static/eefe09db48f9b545e356f86917dab18d/capa-mongo-data-kafka.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACH0lEQVQoz31Tz4sScRSfgwv6J+yhS2ywGySRLQutQS0dtkNUYBjuGgv5Mw0ERUHq0EVQ8WCIeFCEFH/dCtyT0CEIEwmLCBVES3eNDaRA1E1nPs28ccqWpQcf5s2H9z7fN28+XwZ8cBxHYDmWQO+Ycyx7Kk7GbDajekYSxGINO+f+E8PhED6fD7FY7B+ekRr5c3E0OsD38SHlxPHT9no9tFottNttNJtNNBoNTCYTVCoVmEwmWK1WdLtdlMtljMdjccLW4DNsT25hx3wV9w1XYH96G50fDX5MQKVSgWEYyOVy6PV6yGQyOBwOOtBmsyGfzxN0Oh1CoZAo+OrdCyjPyPHg2TbuONSU77/PUtPa+TUSlC0tIRwOU+5yudDpdKDVamlCs9kMt9uNXC4nCr7+9BKb68vYS93Fvec3sXl5GW8a+ySoVF4gkfWNDVzf2qLc7/cjEAggkUjA6/UiGAyiVqvRjyHBwewIO/ynbj+6hBsPL2LXpMZPDMBNOV5QSSJnV1ehUCgo93g8tC+NRgOn0wmDwQCLxYJIJAJGssCHg7fYtaix9/gaPh6WiTv+dYxzKysksghhd0LY7Xak02mUSiXabzKZFCeURPujL/g2+grRSqLfisUiUqkUMpkMstks4vE46vU6qtUqTWY0GtHv9wlkG8ztxrKzvzY8xbgnYzqdIhqNolAo/OHI2NItkXwnYLFAWLTQvAiBWwzpRgnP32xzucamvYweAAAAAElFTkSuQmCC","aspectRatio":1.7777777777777777,"src":"/static/eefe09db48f9b545e356f86917dab18d/0823f/capa-mongo-data-kafka.png","srcSet":"/static/eefe09db48f9b545e356f86917dab18d/c67b7/capa-mongo-data-kafka.png 320w,\n/static/eefe09db48f9b545e356f86917dab18d/d3930/capa-mongo-data-kafka.png 640w,\n/static/eefe09db48f9b545e356f86917dab18d/0823f/capa-mongo-data-kafka.png 1280w,\n/static/eefe09db48f9b545e356f86917dab18d/c730b/capa-mongo-data-kafka.png 1920w,\n/static/eefe09db48f9b545e356f86917dab18d/55bfe/capa-mongo-data-kafka.png 2240w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":7}},"pageContext":{"slug":"/kafka-sink/","previous":{"fields":{"slug":"/kafka-connector/"},"frontmatter":{"title":"Kafka Connector","date":"23 fev, 2021"}},"next":{"fields":{"slug":"/express-rest-I/"},"frontmatter":{"title":"NodeJS e Express","date":"06 abr, 2021"}}}},"staticQueryHashes":["63159454"]}