Armazenamento de métricas com registro de data e hora no Couchbase com o Spring
Eu tenho blogado anteriormente uma introdução ao Spring Data Couchbase. Esta postagem é uma continuação. Mostrarei como utilizo os conectores sociais do Spring para armazenar dados provenientes do Twitter.
Estrutura do documento
Uma pergunta que recebemos com frequência sobre o desenvolvimento em Java é: "temos um ODM (Object Document Mapper)?". Embora atualmente não haja um ODM em Java fornecido em nosso SDK, há um com o spring-data-couchbase. Então, vamos falar um pouco sobre POJO e como eles são mapeados como JSON para serem armazenados no Couchbase. Aqui está um exemplo prático com a classe TwitterUpdate:
Você provavelmente notou algumas anotações, cada uma das quais ajuda o spring-data-couchbase a mapear o POJO para um documento do Couchbase. Vamos examinar rapidamente as mais básicas.
@Documento
Sua finalidade é sinalizar para o spring-data-couchbase que a classe anotada será armazenada como um documento do Couchbase. Você pode usar a opção "expiry" para definir um TTL para todos esses objetos armazenados. O valor padrão é 0, o que significa que o objeto não expirará.
@Id
Sua finalidade é definir qual campo do documento será usado como chave para armazená-lo no Couchbase. Esse campo é obrigatório e deve ter no máximo 250 caracteres.
@Campo
Sua finalidade é dizer que o campo anotado fará parte do documento armazenado no Couchbase. O comportamento padrão usa o nome do campo como a chave do objeto JSON, mas você pode definir o seu próprio dando um valor personalizado à anotação Field. Veja o exemplo do campo key.
O POJO agora está pronto. Para armazená-lo, eu poderia usar o Bean CouchbaseClient, como fiz na postagem anterior. Mas a ideia aqui é criar um repositório personalizado.
Repositórios de dados do Spring
Se você já trabalha com código corporativo Java há algum tempo ou está familiarizado com o Spring, é quase certo que esteja esperando um repositório. No momento, o Spring Data Couchbase oferece suporte ao repositório CRUDRepositório. Ele fornece acesso a métodos CRUD básicos (obter, salvar, excluir, atualizar, encontrar tudo).
É fácil configurar isso. Tudo o que você precisa fazer é criar uma interface que estenda a interface CRUDRepository e, em seguida, usar genéricos para definir o tipo do objeto e a chave usada para armazenar seus dados com esse repositório.
1 2 3 4 |
pacote org.couchbase.defesa de direitos.métricas.twitter; importação org.estrutura de mola.dados.repositório.CrudRepository; público interface TwitterUpdateRepository se estende CrudRepository<TwitterUpdate, Cordas> {} |
Para garantir que isso funcione conforme o esperado e que a implementação do repositório seja gerada automaticamente pelo Spring Framework em tempo de execução, adicione o @EnableCouchbaseReposititories à sua classe de aplicativo. Essa implementação do repositório será um Spring Bean e, portanto, será injetável.
Se você tentar os métodos findAll, deleteAll ou count, eles não funcionarão imediatamente. O motivo é que eles dependem de uma exibição personalizada no lado do Couchbase. Todos os outros métodos funcionam porque dependem da chave do documento. Portanto, vamos criar a visualização all para nosso POJO. A convenção é que um findAlgo adicionado a um repositório dependerá do método algo view. Portanto, neste momento, precisamos criar uma exibição chamada todos para o TwitterUpdate documento de design. Isso é muito simples. Se você quiser usar o método de contagem, não se esqueça de adicionar a redução de contagem clicando em uma das reduções incorporadas:
A próxima pergunta que você pode se fazer é: Como faço uma consulta usando algo que não seja a chave do documento? Tradicionalmente, no Couchbase, você cria uma nova visualização usando como chave a propriedade que deseja pesquisar. No meu caso, será "doc.account".
Usando a mesma convenção de antes, podemos adicionar um método findByAccount à nossa interface TwitterUpdateRepository. Esse método receberá um objeto Query como parâmetro. Isso também significa que precisamos que a visualização seja chamada byAccount:
1 2 3 4 5 6 7 8 9 10 11 12 |
pacote org.couchbase.defesa de direitos.métricas.twitter; importação com.couchbase.cliente.protocolo.visualizações.Consulta; importação org.estrutura de mola.dados.repositório.CrudRepository; importação java.util.Coleção; público interface TwitterUpdateRepository se estende CrudRepository<TwitterUpdate, Cordas> { Coleção<TwitterUpdate> findByAccount(Consulta consulta); } |
Agora, para usar esse método, você precisa definir o objeto de consulta apropriado. Isso é simples:
1 2 3 4 |
Consulta consulta = novo Consulta(); consulta.setKey("Couchbase"); Coleção<TwitterUpdate> tUpdates = twitterUpdateRepository.findByAccount(consulta); |
Eu poderia usar o repositório diretamente no meu método principal, mas isso seria ruim, ou seja, semanticamente ruim. A chamada para a parte de "persistência" do seu aplicativo geralmente vem do lado comercial das coisas. Ela pertence a um serviço.
Serviços Spring
Para criar um serviço do Spring, adicione uma nova classe e anote-a com a anotação @Service. É um pouco como usar a anotação @Component, mas com um significado extra-semântico. Novamente, os serviços são onde você coloca sua lógica comercial. Há outras anotações especializadas, como Controller ou Repository. Por que essa separação? Pode ser útil diferenciá-las quando você estiver se divertindo com AOP.
Posso fazer o autowire da classe Twitter porque a declarei como um bean na minha classe Application e porque adicionei a anotação @ComponentScan. Todas as suas propriedades estão definidas em um arquivo de propriedades, assim como estavam na minha configuração do Couchabse Server. Ele vem do projeto spring-social-twitter e permitirá que eu execute facilmente algumas consultas à API do Twitter. Isso me permite criar meu objeto Twitter Update e armazená-lo no Couchbase por meio do TwitterUpdateRepository.
1 2 3 4 5 6 |
@Feijão Twitter twitter() { retorno novo TwitterTemplate(twitterConsumerKey, twitterConsumerSecret, twitterAccessToken, twitterAccessTokenSecret); } |
Algo interessante de se observar aqui é como a chave do documento é construída. Ela começa com "tw" para o Twitter, depois o nome da conta que pesquisei e, em seguida, o registro de data e hora. Isso deve me permitir fazer algumas consultas interessantes no futuro, quando eu adicionar métricas de outras contas do Twitter ou de outras redes sociais. Estou vendo um bom painel de controle surgindo para visualizar as tendências em todas essas contas.
Espero que isso tenha ajudado. Em seguida, farei outra postagem no blog sobre um caso de uso um pouco mais avançado do Spring (armazenamento em cache, validação e agendamento).