EventoObtenha 50% de desconto no seu ingresso para MongoDB.local Londres em outubro 2. Use o código WEB50Saiba mais >>
Desenvolvedor MongoDB
Central de desenvolvedor do MongoDBchevron-right
Idiomaschevron-right
Javachevron-right

Java - Change Streams

Maxime Beugnet10 min read • Published Feb 01, 2022 • Updated Sep 09, 2024
MongoDBFluxos de alteraçõesJava
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Início rápido
star-empty
star-empty
star-empty
star-empty
star-empty

Atualizações

O repositório de início rápido do MongoDB Java está disponível no GitHub.

28 de fevereiro de 2024

  • Atualizar para o Java 21
  • Atualize o driver Java para 5.0.0
  • Atualize logback-classic para 1.2.13

14 de novembro de 2023

  • Atualizar para o Java 17
  • Atualize o driver Java para 4.11.1
  • Atualize o mongodb-crypt para 1.8.0

25 de março de 2021

  • Atualize o driver Java para 4.2.2.
  • Exemplo de criptografia no nível do campo do lado do cliente adicionado.

21 de outubro de 2020

  • Atualize o driver Java para 4.1.1.
  • O registro do driver Java agora está ativado por meio da popular APISLF4J, então adicionei logback no pom.xml e um arquivo de configuração logback.xml.

Introdução

Emblema do Java
Os change stream foram introduzidos no MongoDB 3.6. Eles permitem que os aplicativos acessem alterações de dados em tempo real sem a complexidade e o risco de afetar o oplog.
Os aplicativos podem usar fluxos de alteração para assinar todas as alterações de dados em uma única coleção, um banco de dados ou uma implantação inteira e reagir imediatamente a elas. Como os fluxos de alterações usam a estrutura de agregação, um aplicativo também pode filtrar alterações específicas ou transformar as notificações à vontade.
Nesta publicação do blog, conforme comprometido na primeira publicação do blog desta série, mostrarei como aproveitar os change stream do MongoDB usando Java.

Configuração

Usarei o mesmo repositório de sempre nesta série. Se você ainda não tiver uma cópia dele, poderá cloná-lo ou apenas atualizá-lo, caso já o tenha:
Se você ainda não configurou seu cluster gratuito no MongoDB Atlas, agora é um ótimo momento para fazê-lo. Você tem todas as instruções nesta postagem do blog.

Fluxos de alterações

Nesta publicação do blog, trabalharei no arquivo chamado ChangeStreams.java, mas é super fácil trabalhar com os Change Streams .
Mostrarei 5 exemplos diferentes para mostrar alguns recursos do change stream. Por uma questão de simplicidade, mostrarei apenas os pedaços de código relacionados diretamente ao change stream. Você pode encontrar toda a amostra de código na parte inferior desta postagem do blog ou no Github.
Para cada exemplo, você precisará iniciar 2 programas Java na ordem correta se quiser reproduzir meus exemplos.
  • O primeiro programa é sempre aquele que contém o código Change Streams.
  • O segundo será um dos programas Java que já usamos nesta série de postagens de blog Java. Você pode encontrá-los no repositório do Github. Elas gerarão operações MongoDB que observaremos na saída do change stream.

Um simples Change Streams sem filtros

Vamos começar com o change stream mais simples que podemos criar:
Como você pode ver, tudo o que precisamos é de myCollection.watch()! É isso aí.
Isso retorna um ChangeStreamIterable que, conforme indicado por seu nome, pode ser iterado para retornar nossos eventos de alteração. Aqui, estou iterando sobre meu Change Stream para imprimir meus documentos de eventos de alteração na saída padrão do Java.
Também posso simplificar este código assim:
Reutilizarei essa interface funcional nos meus exemplos a seguir para facilitar a leitura.
Para executar este exemplo:
  • Remova o comentário apenas do exemplo 1 do arquivoChangeStreams.java e inicie-o em seu IDE ou em um console dedicado usando Maven na raiz do seu projeto.
  • Inicie MappingPOJO.java em outro console ou no seu IDE.
No MappingPOJO, estamos realizando 4 operações do MongoDB:
  • Estou criando um novo documento Gradecom o métodoinsertOne(),
  • Estou procurando este documentoGrade usando o métodofind(),
  • Estou substituindo inteiramente este Grade usando o métodofindOneAndReplace(),
  • e, finalmente, estou excluindo esse Grade usando o métododeleteOne().
Isso é confirmado na saída padrão de MappingJava:
Vamos verificar o que temos na saída padrão de ChangeStreams.java (prettified):
Como você pode ver, somente 3 operações aparecem no Change Stream:
  • insert,
  • substituir,
  • excluir.
Isso era esperado porque a operaçãofind() é apenas um documento de leitura do MongoDB. Não está mudando nada, portanto, não gerando um evento no Change Stream.
Agora que terminamos o exemplo básico, vamos explorar algumas funcionalidades dos Change Streams.
Encerre o programa Change Stream que iniciamos anteriormente e vamos continuar.

Um simples Change Stream filtrando pelo tipo de operação

Agora vamos fazer a mesma coisa, mas vamos imaginar que estamos interessados apenas em operações de inserção e exclusão.
Como você pode ver aqui, estou usando o recurso de pipeline de agregação do change stream para filtrar os eventos de mudança que deseja processar.
Remova o comentário do exemplo 2 em ChangeStreams.java e execute o programa seguido por MappingPOJO.java, assim como fizemos anteriormente.
Aqui estão os eventos de mudança que estou recebendo.
Desta vez, estou recebendo apenas os eventos 2 , insert e delete. O eventoreplace foi filtrado em comparação com o primeiro exemplo.

Alterar o comportamento padrão do Stream com operações de atualização

Igual ao anterior, desta vez estou filtrando meu change stream para manter apenas as operações de atualização.
Desta vez, siga estas etapas.
  • remova o comentário do exemplo 3 em ChangeStreams.java,
  • se você nunca executou Create.java, execute-o. Usaremos esses novos documentos na próxima etapa.
  • iniciar Update.java em outro console.
Em seu console do change stream, você deverá ver 13 eventos de atualização. Aqui está o primeiro:
Como você pode ver, estamos recuperando nossa operação de atualização no campoupdateDescription, mas estamos obtendo apenas a diferença com a versão anterior desse documento.
O campofullDocument é null porque, por padrão, o MongoDB apenas envia a diferença para evitar sobrecarregar o change stream com informações potencialmente inúteis.
Vejamos como podemos alterar esse comportamento no próximo exemplo.

Fluxo de alterações com "Pesquisa de atualização"

Para esta parte, descomente o exemplo 4 de ChangeStreams.java e execute os programas conforme acima.
Adicionei a opção UPDATE_LOOKUP desta vez, para que também possamos recuperar o documento inteiro durante uma operação de atualização.
Vamos ver novamente a primeira atualização no meu fluxo de alterações:
Observação: o programaUpdate.java atualiza um campo criado "comentários" que não existe em meu POJO Grade, que representa o esquema original desta collection. Assim, o campo não aparece na saída porque não está mapeado.
Se eu quiser ver esse campocomments, posso usar um MongoCollection não mapeado automaticamente para meu POJOGrade.java .
Então é isso que obtenho no meu change stream:
Reduzi o campocomments para mantê-lo legível, mas ele contém 14 vezes o mesmo comentário no meu caso.
O documento completo que estamos recuperando aqui durante nossa operação de atualização é o documento após a ocorrência da atualização. Leia mais sobre isso em nossa documentação.

Change Streams são retomáveis

Neste exemplo final 5, simulei um erro e estou reiniciando meu Change Stream a partir de um resumeToken que obtive de uma operação anterior em meu Change Stream.
É importante observar que um fluxo de alterações será retomado automaticamente diante de um incidente "" . Em geral, o único motivo pelo qual um aplicativo precisa reiniciar o fluxo de alterações manualmente a partir de um token de retomada é se houver um incidente no próprio aplicativo e não no fluxo de alterações (por exemplo, um operador decidiu que o aplicativo precisa ser reiniciado).
Para este exemplo final, o mesmo que anterior. Descomente a parte 5 (que é apenas chamar o método acima) e comece ChangeStreams.java depois Update.java.
Esta é a saída que você deve obter:
Como você pode ver aqui, consegui parar de ler meu Change Stream e, a partir do resumeToken que coletei anteriormente, posso iniciar um novo Change Stream a partir deste ponto no tempo.

Código final

ChangeStreams.java (código: ):
Lembre-se de descomentar apenas um exemplo de Change Stream por vez.

Encerrando

Os Change Streams são muito fáceis de usar e configurar no MongoDB. Eles são a chave para qualquer sistema de processamento em tempo real.
O único problema restante aqui é como colocar isso em produção corretamente. Change Streams são principalmente um loop infinito, processando um fluxo infinito de eventos. O multiprocessamento é, obviamente, obrigatório para esse tipo de configuração, especialmente se o tempo de processamento for maior do que o tempo que separa 2 eventos.
Se você quiser aprender mais e afundar seu conhecimento com mais rapidez, recomendamos que você confira o treinamento M220J: MongoDB para programadores Java disponível gratuitamente na MongoDB University.
Na próxima publicação no blog, mostrarei as transações ACID multidocumento em Java.

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Início rápido
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Exemplo de código

Crie um rastreador de livros Java do MongoDB Spring Boot para iniciantes


Mar 22, 2023 | 0 min read
Tutorial

Projetos de coleção única no MongoDB com dados Spring (Parte 2)


Aug 12, 2024 | 10 min read
Artigo

Driver Java: migrando do 4.11 a 5.0


Mar 01, 2024 | 3 min read
Tutorial

Introdução ao Azure Spring Apps e ao MongoDB Atlas: um guia passo a passo


Jan 27, 2024 | 5 min read
Sumário