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.

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:

Agora, para usar esse método, você precisa definir o objeto de consulta apropriado. Isso é simples:

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.

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).

Autor

Postado por Laurent Doguin

Laurent é um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve código em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programação reativa e outras coisas que estão na moda. Ele também foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experiência para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Relações com Desenvolvedores na Couchbase.

Deixar uma resposta