Almacenamiento de métricas con fecha y hora en Couchbase con Spring
Tengo anteriormente en el blog una introducción a Spring Data Couchbase. Este post es una continuación. Os mostraré cómo utilizo los conectores sociales de Spring para almacenar datos procedentes de Twitter.
Estructura del documento
Una pregunta que nos hacen a menudo sobre el desarrollo Java es: "¿tenemos un ODM ( Object Document Mapper)?". Mientras que actualmente no hay ODM Java proporcionado en nuestro SDK, hay uno con spring-data-couchbase. Así que vamos a hablar un poco sobre POJO y cómo se mapean como JSON para ser almacenados en Couchbase. He aquí un ejemplo práctico con la clase TwitterUpdate:
Probablemente hayas notado algunas anotaciones, cada una de las cuales ayuda a spring-data-couchbase a mapear el POJO a un documento Couchbase. Vamos a repasar rápidamente las básicas.
@Documento
Su propósito es señalar a spring-data-couchbase que la clase anotada será almacenada como un documento Couchbase. Puede utilizar la opción "expiry" para establecer un TTL para todos estos objetos almacenados. El valor por defecto es 0, lo que significa que el objeto no expirará.
@Id
Su propósito es definir qué campo del documento se utilizará como clave para almacenarlo en Couchbase. Este campo es obligatorio y debe tener un máximo de 250 caracteres.
@Campo
Su propósito es decir que el campo anotado será parte del documento almacenado en Couchbase. El comportamiento por defecto utiliza el nombre del campo como clave del objeto JSON, pero puedes definir el tuyo propio dando un valor personalizado a la anotación Field. Mira el campo clave como ejemplo.
El POJO ya está listo. Para almacenarlo podría usar el CouchbaseClient Bean tal y como hice en el post anterior. Pero la idea aquí es crear un repositorio personalizado,.
Repositorios de datos de Spring
Si has estado haciendo código empresarial Java durante un tiempo o estás familiarizado con Spring, entonces es casi seguro que esperas un Repositorio. Ahora mismo Spring Data Couchbase soporta el repositorio CRUDRepository. Te da acceso a métodos CRUD básicos (get, save, delete, update, findAll).
Es fácil configurar esto. Todo lo que tienes que hacer es crear una interfaz que extienda la interfaz CRUDRepository, a continuación, utilizar genéricos para definir el tipo de objeto y la clave utilizada para almacenar tus Datos con este repositorio.
1 2 3 4 |
paquete org.couchbase.defensa.métricas.twitter; importar org.springframework.datos.repositorio.CrudRepository; público interfaz TwitterUpdateRepository extiende CrudRepository<TwitterUpdate, Cadena> {} |
Para asegurarte de que esto funciona como se espera, y que la implementación del repositorio será generada automáticamente por Spring Framework en tiempo de ejecución, asegúrate de añadir @EnableCouchbaseReposititories en tu clase Application. Esta implementación de repositorio será un Spring Bean y como tal será inyectable.
Si intentas usar los métodos findAll, deleteAll o count, no funcionarán. La razón es que dependen de una vista personalizada en el lado de Couchbase. Todos los demás métodos funcionan porque se basan en la clave del documento. Así que vamos a crear la vista all para nuestro POJO. La convención es que un findAlgo añadido a un repositorio se basará en el método algo vista. Así que ahora tenemos que crear una vista llamada todos para la TwitterUpdate documento de diseño. Esto es realmente sencillo. Si desea utilizar el método de recuento, no se olvide de añadir el recuento de reducir haciendo clic en uno de los incorporados en reducir:
La siguiente pregunta que te puedes hacer es ¿Cómo consulto usando algo que no sea la clave del documento? Tradicionalmente con Couchbase creas una nueva vista usando como clave cualquier propiedad sobre la que quieras buscar. En mi caso va a ser 'doc.account'.
Usando la misma convención que antes, podemos añadir un método findByAccount a nuestra interfaz TwitterUpdateRepository. Este método tomará un objeto Query como parámetro. Esto también significa que necesitamos que la vista sea llamada byAccount:
1 2 3 4 5 6 7 8 9 10 11 12 |
paquete org.couchbase.defensa.métricas.twitter; importar com.couchbase.cliente.protocolo.vistas.Consulta; importar org.springframework.datos.repositorio.CrudRepository; importar java.util.Colección; público interfaz TwitterUpdateRepository extiende CrudRepository<TwitterUpdate, Cadena> { Colección<TwitterUpdate> findByAccount(Consulta consulta); } |
Ahora, para utilizar este método, debe definir el objeto de consulta adecuado. Es muy sencillo:
1 2 3 4 |
Consulta consulta = nuevo Consulta(); consulta.setKey("Couchbase"); Colección<TwitterUpdate> tUpdates = twitterUpdateRepository.findByAccount(consulta); |
Podría usar el repositorio directamente en mi método principal pero eso sería malo, semánticamente malo. La llamada a la parte de 'persistencia' de tu aplicación normalmente viene del lado del negocio. Pertenece a un Servicio.
Servicios de primavera
Para crear un servicio Spring, añada una nueva clase y anótela con la anotación @Service. Es un poco como usar la anotación @Component, pero con un significado extra-semántico. De nuevo, los servicios son donde pones tu lógica de negocio. Hay otras anotaciones especializadas como Controller o Repository. ¿Por qué esta separación? Puede ser útil diferenciarlas cuando te diviertes con AOP.
Puedo autowirear la clase Twitter porque la he declarado como un bean en mi clase Application y porque he añadido la anotación @ComponentScan. Todas sus propiedades están definidas en un fichero de propiedades al igual que lo estaban para la configuración de mi Couchabse Server. Proviene del proyecto spring-social-twitter y me permitirá ejecutar fácilmente algunas consultas contra la API de Twitter. Esto me permite crear mi objeto Twitter Update y almacenarlo en Couchbase a través del TwitterUpdateRepository.
1 2 3 4 5 6 |
@Judía Twitter twitter() { devolver nuevo TwitterTemplate(twitterConsumerKey, twitterConsumerSecret, twitterAccessToken, twitterAccessTokenSecret); } |
Algo interesante que hay que ver aquí es cómo se construye la clave del documento. Empieza con 'tw' para twitter, luego el nombre de la cuenta que he buscado y por último la marca de tiempo. Esto debería permitirme hacer algunas consultas interesantes en el futuro, una vez que añada métricas de otras cuentas de Twitter u otras redes sociales. Me imagino un buen panel para visualizar las tendencias de todas estas cuentas.
Espero que os haya servido de ayuda. A continuación haré otra entrada en el blog sobre un caso de uso algo más avanzado para Spring (Caché, Validación y programación).