RxJavaAyer os dejé un código en bruto que arrancaba un servidor Ratpack y utilizaba un repositorio síncrono Couchbase, dejando el RxJava parte fuera. Tengo la intención de arreglar eso hoy, y también contarte más sobre Ratpack. Todavía no voy a mostrarte una API REST completa, pero ya llegaremos a eso :)

En mi ejemplo anteriorEstaba instanciando un nuevo objeto Repositorio cada vez que lo necesitaba. Debido a la forma en que se hacía, también abría una nueva conexión Cluter cada vez. Hay formas de evitar esto con Ratpack, como el registro.

Registro Ratpack

El ratpack registro es un almacén de objetos disponibles en contexto de un manejador. Por defecto se obtiene un registro vacío. Puede añadir instancias de objetos en. Estos objetos se recuperan por tipo. No pueden ser nombrados. Esto significa que sólo puedes tener un objeto por tipo en tu registro. Puede parecer extraño pero es realmente útil cuando se codifica en Groovy. Echa un vistazo a este ejemplo por ejemplo. Es muy fácil de leer.

En mi código sólo estoy usando el objeto Repository para acceder a Couchbase así que ese's el que pondré en el registro:

Como puedes ver recuperar un objeto del registro es fácil. Tienes que llamar al método get y dar el tipo del objeto como parámetro.

Esto funciona bastante bien para aplicaciones realmente ligeras. Puede ponerse mucho más serio usando el Módulo Guice.

Módulos Guice

Ratpack no es sólo un simple servidor web asíncrono y no bloqueante. It's también un amplio conjunto de módulos que le permiten añadir elegantemente nuevas características. El registro puede ser fácilmente extendido usando un framework DI. El más utilizado en Ratpack es Guice pero puedes utilizar Spring o cualquier otro soportado. Para activar el módulo Guice, necesitas añadir una línea en tu fichero build.gradle en la dependencia:

Ratpack tiene una gran integración con Gradle. Todos los módulos de Ratpack se pueden añadir así de simple. Ahora que el soporte de Guice está habilitado, puedo empezar añadiendo una configuración de registro adecuada. Añadiré instancias de Bucket y Repository a mi registro. El primer paso es crear un módulo Guice añadiendo una clase que extienda Guice's MóduloAbstracto.

Una vez creada esta clase, tengo que añadirla a mi registro Ratpack de la siguiente manera:

Y ahora tengo una configuración más limpia para mis futuras inyecciones de instancia. Pero todo sigue siendo síncrono. Así que cambiaré esa configuración para usar la versión asíncrona del Bucket y el Repository:

El siguiente paso es asegurarme de que puedo usar mis RxJava Observables en Ratpack. Y porque la vida es bella (algunos dirían bootiful), hay un módulo para eso.

Módulo RxJava

En Módulo RxJava tiene como objetivo crear un puente entre Rx Observables y Ratpack Promises. Al igual que el módulo Guice, se puede activar fácilmente añadiendo la dependencia adecuada:

También es necesario inicializar el módulo una vez por JVM. Así que el mejor lugar para ejecutar la inicialización aquí es antes de la init del servidor Ratpack. Esto se puede hacer llamando a:

El objeto RxRatpack tiene métodos estáticos para hacer la conversión Observable/Promise. El más sencillo funciona así:

Vale la pena mencionar que debido a que un Observable puede contener de cero a cualquier elemento, se transforma en una lista cuando se le da el resultado Promise. Así que si sólo tienes un objeto en tu Observable necesitas obtener explícitamente el primer elemento de la lista.

Lo que ha cambiado desde la versión anterior es el uso de un registro basado en Guice para DI y las llamadas a Couchbase son ahora todas asíncronas. Ahora estoy en una buena posición para empezar a crear una API REST adecuada para mis usuarios. Y este es el tema para otra entrada del blog.

Autor

Publicado por Laurent Doguin

Laurent es un metalero empollón que vive en París. Principalmente escribe código en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programación reactiva y otras cosas de moda. También fue Developer Advocate de Clever Cloud y Nuxeo, donde dedicó su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase.

Dejar una respuesta