{"id":2239,"date":"2016-04-29T21:43:46","date_gmt":"2016-04-29T21:43:46","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2239"},"modified":"2016-04-29T21:43:46","modified_gmt":"2016-04-29T21:43:46","slug":"ratpack-couchbase-rxjava","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/ratpack-couchbase-rxjava\/","title":{"rendered":"Ratpack, Couchbase e RxJava"},"content":{"rendered":"<p><img decoding=\"async\" align=\"right\" alt=\"RxJava\" src=\"\/wp-content\/original-assets\/2016\/april\/ratpack-couchbase-rxjava\/rxjavalogo.png\" \/>Ontem, deixei voc\u00ea com um c\u00f3digo aproximado que iniciou um servidor Ratpack e usou um reposit\u00f3rio Couchbase s\u00edncrono, deixando o <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdks\/java-2.2\/rxjava.html?utm_source=blogs&#038;utm_medium=link&#038;utm_campaign=blogs\">RxJava<\/a> parte fora. Pretendo corrigir isso hoje e tamb\u00e9m falar mais sobre o Ratpack. Ainda n\u00e3o vou lhe mostrar uma API REST completa, mas chegaremos l\u00e1 :)<\/p>\n<p>Em minha <a href=\"\/blog\/pt\/getting-started-ratpack-couchbase\/\">exemplo anterior<\/a>Como eu estava fazendo isso, estava instanciando um novo objeto Repository toda vez que precisava de um. Devido \u00e0 maneira como isso era feito, tamb\u00e9m abria uma nova conex\u00e3o Cluter a cada vez. H\u00e1 maneiras de evitar isso com o Ratpack, como o registro.<\/p>\n<h2>Registro do Ratpack<\/h2>\n<p>O pacote de ratos <a href=\"https:\/\/ratpack.io\/manual\/current\/launching.html#registry\">registro<\/a> \u00e9 um armazenamento de objetos dispon\u00edveis no <a href=\"https:\/\/ratpack.io\/manual\/current\/context.html#context\">contexto<\/a> de um manipulador. Por padr\u00e3o, voc\u00ea obt\u00e9m um registro vazio. Voc\u00ea pode adicionar inst\u00e2ncias de objetos. Esses objetos s\u00e3o recuperados por tipo. Eles n\u00e3o podem ser nomeados. Isso significa que voc\u00ea s\u00f3 pode ter um objeto por tipo no seu registro. Isso pode parecer estranho, mas na verdade \u00e9 muito \u00fatil ao codificar em Groovy. D\u00ea uma olhada em <a href=\"https:\/\/github.com\/ratpack\/example-books\/blob\/master\/src\/ratpack\/ratpack.groovy\">este exemplo<\/a> por exemplo. \u00c9 muito f\u00e1cil de ler.<\/p>\n<p>No meu c\u00f3digo, estou usando apenas o objeto Repository para acessar o Couchbase, portanto, \u00e9 esse objeto que colocarei no registro:<\/p>\n<pre>\n<code>    public static void main(String... args) throws Exception {\n        RatpackServer.start(server -> server\n                .registryOf(registry ->registry.add(CouchbaseCluster.create().openBucket().repository()))\n                .handlers(chain -> chain.path(\"create\", ctx ->\n        {\n                    EntityDocument<User> document = EntityDocument.create(new User(\"ldoguin\", 31, \"Laurent\", \"Doguin\"));\n                    Blocking.get(() -> {\n                        Repository repo = ctx.get(Repository.class);\n                        return repo.upsert(document);\n                    }).then(entityDoc -> ctx.render(\"OK\"));\n                }).path(\"get\", ctx -> {\n                    Blocking.get(() -> {\n                        Repository repo = ctx.get(Repository.class);\n                        EntityDocument<User> ldoguin = repo.get(\"ldoguin\", User.class);\n                        return ldoguin;\n                    }).then(user -> ctx.render(user.content().toString()));\n                })));\n    }\n<\/code><\/pre>\n<p>Como voc\u00ea pode ver, recuperar um objeto do registro \u00e9 f\u00e1cil. Voc\u00ea precisa chamar o m\u00e9todo get e fornecer o tipo do objeto como par\u00e2metro.<\/p>\n<p>Isso funciona muito bem para aplicativos realmente leves. Pode ficar muito mais s\u00e9rio usando o <a href=\"https:\/\/ratpack.io\/manual\/current\/guice.html#google_guice_integration\">M\u00f3dulo Guice<\/a>.<\/p>\n<h2>M\u00f3dulos Guice<\/h2>\n<p>O Ratpack n\u00e3o \u00e9 apenas um simples servidor da Web ass\u00edncrono e sem bloqueio. Ele tamb\u00e9m \u00e9 um conjunto abrangente de m\u00f3dulos que permite adicionar novos recursos de forma elegante. O registro pode ser facilmente estendido usando uma estrutura DI. O mais comumente usado no Ratpack \u00e9 o Guice, mas voc\u00ea pode usar o Spring ou qualquer outro suportado. Para ativar o m\u00f3dulo Guice, voc\u00ea precisa adicionar uma linha em seu arquivo <code>build.gradle<\/code> na depend\u00eancia:<\/p>\n<pre>\n<code>    dependencies {\n      compile ratpack.dependency(\"guice\"),\n              \"com.couchbase.client:java-client:2.2.5\" \n    }\n<\/code><\/pre>\n<p>O Ratpack tem uma \u00f3tima integra\u00e7\u00e3o com o Gradle. Todos os m\u00f3dulos do Ratpack podem ser adicionados de forma t\u00e3o simples quanto isso. Agora que o suporte ao Guice est\u00e1 ativado, posso come\u00e7ar adicionando uma configura\u00e7\u00e3o de registro adequada. Adicionarei inst\u00e2ncias de Bucket e Reposit\u00f3rio ao meu registro. A primeira etapa \u00e9 criar um m\u00f3dulo Guice adicionando uma classe que estende a classe Guice&apos;s <a href=\"https:\/\/google.github.io\/guice\/api-docs\/latest\/javadoc\/index.html?com\/google\/inject\/AbstractModule.html\">AbstractModule<\/a>.<\/p>\n<pre>\n<code>    public class Config extends AbstractModule {\n\n        protected void configure() {\n            CouchbaseCluster cc = CouchbaseCluster.create();\n            Bucket bucket = cc.openBucket();\n            bind(Bucket.class).toInstance(bucket);\n            bind(Repository.class).toInstance(bucket.repository());\n        }\n    }\n<\/code><\/pre>\n<p>Depois que essa classe for criada, preciso adicion\u00e1-la ao meu registro do Ratpack da seguinte forma:<\/p>\n<pre>\n<code>RatpackServer.start(server -> server.registry(Guice.registry(b -> b.module(Config.class)))\n<\/code><\/pre>\n<p>E agora tenho uma configura\u00e7\u00e3o mais limpa para minhas futuras inje\u00e7\u00f5es de inst\u00e2ncia. Mas tudo ainda \u00e9 s\u00edncrono. Portanto, vou alterar essa configura\u00e7\u00e3o para usar a vers\u00e3o ass\u00edncrona do Bucket e do Reposit\u00f3rio:<\/p>\n<pre>\n<code>    public class Config extends AbstractModule {\n\n        protected void configure() {\n            CouchbaseCluster cc = CouchbaseCluster.create();\n            Bucket bucket = cc.openBucket();\n            bind(AsyncBucket.class).toInstance(bucket.async());\n            bind(AsyncRepository.class).toInstance(bucket.repository().async());\n        }\n    }\n<\/code><\/pre>\n<p>A pr\u00f3xima etapa aqui \u00e9 garantir que eu possa usar meus observ\u00e1veis RxJava no Ratpack. E, como a vida \u00e9 bela (alguns diriam bootiful), existe um m\u00f3dulo para isso.<\/p>\n<h2>M\u00f3dulo RxJava<\/h2>\n<p>O <a href=\"https:\/\/ratpack.io\/manual\/current\/rxjava.html\">M\u00f3dulo RxJava<\/a> tem como objetivo criar uma ponte entre o Rx Observables e o Ratpack Promises. Como o m\u00f3dulo Guice, ele pode ser ativado facilmente com a adi\u00e7\u00e3o da depend\u00eancia apropriada:<\/p>\n<pre>\n<code>    dependencies {\n      compile ratpack.dependency(\"guice\"),\n              ratpack.dependency(\"rx\"),\n              \"com.couchbase.client:java-client:2.2.5\" \n    }\n<\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m precisa inicializar o m\u00f3dulo uma vez por JVM. Portanto, o melhor lugar para executar a inicializa\u00e7\u00e3o aqui \u00e9 antes do init do servidor Ratpack. Isso pode ser feito chamando:<\/p>\n<pre>\n<code>    RxRatpack.initialize();\n<\/code><\/pre>\n<p>O objeto RxRatpack tem m\u00e9todos est\u00e1ticos para fazer a convers\u00e3o Observable\/Promise. O mais simples funciona da seguinte forma:<\/p>\n<pre>\n<code>    RxRatpack.promise(repo.upsert(document)).then(entityDoc -> ctx.render(\"OK\"));\n<\/code><\/pre>\n<p>Vale a pena mencionar que, como um Observable pode conter de zero a qualquer elemento, ele \u00e9 transformado em uma lista quando fornecido ao resultado da Promise. Portanto, se voc\u00ea tiver apenas um objeto em seu Observable, precisar\u00e1 obter explicitamente o primeiro elemento da lista.<\/p>\n<pre>\n<code>    public static void main(String... args) throws Exception {\n        RxRatpack.initialize();\n        RatpackServer.start(server -> server.registry(Guice.registry(b -> b.module(Config.class)))\n                .handlers(chain -> chain.path(\"create\", ctx -> {\n                    EntityDocument<User> document = EntityDocument.create(new User(\"ldoguin\", 31, \"Laurent\", \"Doguin\"));\n                    AsyncRepository repo = ctx.get(AsyncRepository.class);\n                    RxRatpack.promise(repo.upsert(document)).then(entityDoc -> ctx.render(\"OK\"));\n                }).path(\"get\", ctx -> {\n                    AsyncRepository repo = ctx.get(AsyncRepository.class);\n                    RxRatpack.promise(repo.get(\"ldoguin\", User.class))\n                            .then(users -> ctx.render(users.get(0).content().toString()));\n                })));\n    }\n<\/code><\/pre>\n<p>O que mudou desde a vers\u00e3o anterior foi o uso de um registro baseado em Guice para DI e as chamadas do Couchbase agora s\u00e3o todas ass\u00edncronas. Agora estou em uma boa posi\u00e7\u00e3o para come\u00e7ar a criar uma API REST adequada para meus usu\u00e1rios. E esse \u00e9 o t\u00f3pico para outra postagem no blog.<\/p>","protected":false},"excerpt":{"rendered":"<p>Yesterday I left you with rough code that started a Ratpack server and used a synchronous Couchbase repository, leaving the RxJava part out. I intend to fix that today, and also tell you more about Ratpack. I am not going [&hellip;]<\/p>\n","protected":false},"author":49,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1818],"tags":[1635],"ppma_author":[9023],"class_list":["post-2239","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-ratpack"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Ratpack, Couchbase and RxJava - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/ratpack-couchbase-rxjava\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ratpack, Couchbase and RxJava\" \/>\n<meta property=\"og:description\" content=\"Yesterday I left you with rough code that started a Ratpack server and used a synchronous Couchbase repository, leaving the RxJava part out. I intend to fix that today, and also tell you more about Ratpack. I am not going [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/ratpack-couchbase-rxjava\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-04-29T21:43:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Ratpack, Couchbase and RxJava\",\"datePublished\":\"2016-04-29T21:43:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/\"},\"wordCount\":652,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"keywords\":[\"ratpack\"],\"articleSection\":[\"Java\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/\",\"name\":\"Ratpack, Couchbase and RxJava - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-04-29T21:43:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ratpack-couchbase-rxjava\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ratpack, Couchbase and RxJava\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/admin-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\\\/\\\/x.com\\\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/author\\\/laurent-doguin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ratpack, Couchbase and RxJava - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/ratpack-couchbase-rxjava\/","og_locale":"pt_BR","og_type":"article","og_title":"Ratpack, Couchbase and RxJava","og_description":"Yesterday I left you with rough code that started a Ratpack server and used a synchronous Couchbase repository, leaving the RxJava part out. I intend to fix that today, and also tell you more about Ratpack. I am not going [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/ratpack-couchbase-rxjava\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-04-29T21:43:46+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Ratpack, Couchbase and RxJava","datePublished":"2016-04-29T21:43:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/"},"wordCount":652,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["ratpack"],"articleSection":["Java"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/","url":"https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/","name":"Ratpack, Couchbase and RxJava - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-04-29T21:43:46+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/ratpack-couchbase-rxjava\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ratpack, Couchbase and RxJava"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/laurent-doguin\/"}]}},"acf":[],"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2239","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2239"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2239\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2239"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2239"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}