[Música] k [Música] [Aplausos] C [Música] Sil [Música] k [Música] k [Música] [Aplausos] h [Música] k [Música] k [Música] k [Música] [Aplausos] C [Música] C [Música] fala pessoal boa noite muito boa noite como é que vocês estão provavelmente alguns de vocês aí já tomaram até um susto né porque não temos hoje aqui o nosso queridíssimo Wesley Williams Mas quem tá aqui hoje é o Leonan então para quem ainda não me conhece muito prazer me chamo Leonan tá faço parte aqui do time da fyle e hoje juntamente com o meu amigo swak a gente vai est falando
um pouquinho de Java vamos est dando continuidade aí a nossa imersão full stack full cych tá sejam todos muito bem-vindos aí beleza Vamos lá gente primeira coisa hoje então a gente vai falar sobre um tema a O pessoal já começou a me reconhecer lán exatamente hoje então galera a gente vai falar de um tema que é bem legal tá a gente vai entrar em diversos conceitos aí que Independente se você utiliza Java ou não você vai precisar entender esses conceitos tá são indispensáveis aí para qualquer tipo de vedor então fica ligado porque é muito importante
beleza mas ã eu queria saber de vocês quem aqui é novo tá na primeira vez aqui nunca assistiu uma live Nossa e também quem já tá acompanhando aí toda a nossa imersão fala aqui no chat por favor vamos ver vamos ver galera dando boa noite aí show já temos aqui algumas pessoas que é a primeira vez na imersão para todo mundo que tá chegando agora aí sejam muito bem-vindos tá o Rafael o João né a Maria Eduarda ali show de bola show de bola ó aí ó o Renan também já é py massa já temos
bastante gente também é nosso aluno né enfim sejam todos muito bem-vindos tá pessoal e e vamos lá o que que a gente vai e ter nesse nesse primeiro momento basicamente eu vou passar um pequeno teaser tá de um dos nossos alunos e depois a gente vai começar Então a nossa live com o nosso amigo su Beleza então vamos lá bem eu já trabalho com com informática com desenvolvimento já uns 15 anos mais ou menos eu trabalhava numa empresa uma empresa grande e só que tipo eu tava sentindo falta de alguns desafios eu sabe não tava
muito feliz também na carreira Tudo tava meio que tipo pensando até caramba não preciso ficar só aqui porque ali eu tava basicamente só como um programador mesmo né Eu queria partir mais uma parte de engenharia uma parte um pouco mais Ampla e algumas vezes ah realmente falava no Será que eu tô na área certa e viha aquela né que a gente chama de síndrome do impostor falava será que é para mim isso Será que realmente eu tô numa trilha certa acho que eu tô ficando realmente minha zona de conforto tá pegando muito eu tô ficando
muito acomodado aqui foi um amigo meu que me apresentou eu falou putz você acompanha se foi realmente o canal da cy eu falei cara não não conheço o canal aí ele me passou o canal eu comecei a ver aí que eu fui falei adquirir que esse curso Realmente parece bom só que assim foi uma grave Surpresa porque ele tava melhor do que eu pensava aí comecei a fazer o curso e aí começou minha abrir um pouco a mente mais e tipo eu tô tô agregando conhecimento acho que tá na hora de eu testar esse esse
conhecimento indo pro mercado aí eu fui e falei não vamos lá fiz a entrevista o pessoal gostou e hoje eu tô lá e hoje eu vejo que tipo muito do que eu tô vendo ali no curso que eu né que eu venho estudando eu tô conseguindo aplicar então tipo e isso dá uma satisfação maior acho que tipo o benefício que te traz é muito alto para mim tipo me ajudou aí pra empresa que eu tô hoje bem atualmente eu tô trabalhando pro banco Itaú trabalho na na equipe de Engenharia e assim depois que eu comecei
fazer o curso eu comecei me sentir mais seguro cara foi assim realmente o curso que eu vi foi o curso mais completo que eu consegui encontrar hoje né Isso foi uma GR surpresa que eu tive Até recentemente né com o 3.0 Ah me ajudou me ajudou muito complementa algumas leituras que eu gosto de fazer cara LinkedIn direto é pinga pinga pinga ping e por enquanto falo não galera Acabei de chegar na empresa para TRS meses que eu tô aqui eu quero ficar um pouco vocês não estão aí só para vender curso vocês estão aí para
formar os profissionais show de bola pessoal e aqui já estamos com o suak Fala aí suak boa noite e aí meus queridos Bora para mais uma boa noite aí falar de javin hoje hein É isso aí adoro quem quem gosta vamos ver quem tá no chat aí quem é fã de Java Fala aí pra gente Pessoal quem é que trabalha fã vai mas quem trabalha é quem trabalha com Java Geralmente a galera tem aquela visão do Java antigo né que já caiu por terra há bastante tempo Ó mas tem bastante gente aqui falando que trabalha
com Java cara legal legal é isso Ó lá jav cotlin Marcelão show de bola show de bola carao Não credo Não credo não sa vocês vão ver como é delicinha programar com Java aqui hoje a gente vai fazer uma brincadeirinha show show de bola gente então vamos lá vamos começar o nosso o vídeo de hoje tá suak manda ver Compartilha aí sua tela e bora lá vamos lá vamos lá deixa eu tirar você da frente aqui para não para não bugar show de bola acho que bom todo mundo tá tá vendo aí pode voltar Leonan
pode voltar vamos trocar uma ideia não me deixa não me deixe sozinho aqui tá por aqui T por aqui eh Bom vamos lá pessoal a dinâmica hoje vai ser alab branas né O que que quero dizer com isso é uma dinâmica que a gente tem que ter paciência né a gente vai ficar aqui bastante tempo a gente vai construir um um sisteminha juntos eh porque eu eu poderia chegar aqui e só falar ó aqui Java 21 é concorrência estruturada como viw é virtual threads é Switch pattern switch expressions e mostrar só exemplos bestas mas eu
não gosto muito disso eu quero mostrar exemplos mais concretos de como a gente pode usar como que fica legal Eh vamos fazer um teste de stress também para entender um pouco mais sobre o virtual trads eh é comentaram ali que o branas editor Branco né o branas não tá mais com editor Branco viu depois que ele trocou de monitor acho que ele tá com editor escuro agora também Então eu acho que vai ser bem legal a gente vai criar um um pequeno sisteminha de pagamentos Eh claro não é tão a fundo assim o sistema de
pagamentos é mais um cru de usuário com uma brincadeira ali com as senhas e depois uma parte processar entre aspas um pagamento só para poder mostrar para vocês eh features interessantes eh eu já tô com um projetinho aqui que ele não tem nada né Ele só tem um Spring boot applic que a gente eh até pode já rodar aqui e eu vou mostrar para vocês o que tem de de dependência ó então a aplicação não tem nada tá rodando rodando com toket padrão nem mudei o Web Server e e o que que eu já coloquei
de dependência aqui só para não demorar tanto tempo assim né vendo dependência baixando o projeto do start.spring.io deixei uma dependenci Zinha do guava né do do Google e eh Starter web Starter web fluxs para mostrar para vocês eh mais pro final um servidor de aplicação web com trads convencionais depois um servidor de aplicação web com webflux e por último o servidor de aplicação web com virtual trads e com teste de stress para vocês entenderem na prática o que que muda Ok eh claro né eu vou eu vou mostrar também algumas features preview então por isso
que eu precisei fazer umas configuraçõe inhas aqui na na parte da compilação para habilitar features previews do Java e falta a barba falta a barba é o o bran é uma barba de respeito eu eu não consigo deixar tanto tempo assim eh e aí eu não vou conseguir focar tanto assim nos comentários né vou bater no olho eh conforme vai dando para ver mas o foco aqui vai ser focar né no no próprio na própria demo E aí o Leonan por favor Leonan vai me interrompendo Vamos fazer um bate-papo bem aberto enquanto a gente vai
vai codificando junto pode ser show de bola show de bola vou separando aqui também uns comentários legais Fechou então galera vamos lá vamos começar aqui eh já também fazendo um outro disclaimer né eu vou eu vou usar um pouquinho do que a gente já ensinou de Clean Arc de exagonal e não vai seguir 100% a risca eh o foco Não é esse né o foco ainda é o Java 21 não só Java 21 né mas todas as funcionalidades do Java 11 em diante que tem bastante coisa aí eh mas eu vou seguir um pouco desse
modelo para ficar eh mais claro e também para fazer o que a gente sempre prega né que é justamente trabalhar com com esse tipo de coisa então vamos lá que que eu vou começar fazendo aqui vamos suak pode falar só pra gente começar antes da gente começar a parte de código em si que é o que todo mundo quer ver tá se apresenta rapidão pra galera porque tem bastante gente que ainda não te conhece Tem bastante gente nova aqui na imersão Então acho que é muito importante aí você fazer aquela bela apresentação bem bonito fechou
eh bom pros novatos aí até PR os que já me conhecem prazer né Eu sou o Gabriel suque Eu trabalho no Mercado Livre né Eh tá completando se anos de mercado livre agora em dezembro dia 12 ou dia 11 eh aqui no Mercado Livre né Eu sou software Expert eh uma nomenclatura meio própria assim mas no mercado de Big Tex por exemplo é o equivalente a um steff de às vezes um Senior Staff dependendo se a empresa tem Tech Lead ou não né então basicamente eu eu atuo eh com os Tech leads e o Wesley
gosta de brincar que eu sou o Tech Lead dos Tech leads né então Eh eu já tô nessa área faz acabou de fazer 10 anos né acho que talvez é uns 10 aninhos eh antes disso eu trabalhava numa software House e uma software House bem bacana que ela era muito para frex né então me lembro que em 2016 assim 201 7 a gente já usava docker em produção num 2016 é já usava docker em produção numa época em que pouca gente usava e eu me lembro uma vez que eu fui numa numa apresentação im Masters
lá e o cara falou pô quem que usa docker em produção né é o maior mito que tem acho que todo mundo só gosta de ensinar docker Mas ning usa impr produção e a gente levantou a mão assim né Tipo pô a gente usa né Eh então era a software House bem bacana tive vários mentores lá e também sou professor né de Java aqui no full cycle né E já tá quase ano que vem completa do anos né a gente tá construindo aí dois microsserviços bem legais e bem práticos eh ensinando desde cafc e Rabbit
MQ desde elastic search base com myle a gente ensinou também integração com Ky CL né Tem tem bastante coisinha ali Então acho que é isso e para quem tá perguntando aí Isso aqui é o intelij né Eh eu ainda não sou tão fã de usar o vs code para Java Apesar de que tá vindo aí eh Apesar de que tá vindo sim uma eh uma grande comunidade de Java pro vs code a própria galera da da da jcp da jdk tão tão abraçando esse mundo do vs code princialmente por causa dos novos programadores que temm
usado a cada vez mais computadores mais leves né chromebooks etc então é tá vindo esse suporte mas eu ainda sou fã do intellij né Eu acho que é uma peça de software eh fantástica mas novamente né cada um usa o que quiser se quiser usar Eclipse fica à vontade intelij vest code e não tem Sublime Notepad mais mais quem é dessa época aí né fica à vontade e só dando um Panorama geral então eu tirei alguns prints aqui eh eu tirei alguns prints de uma palestra do Brian goatz que foi na se eu não me
engano ele fez essa palestra ess foi esse ano né faz um mês lá na no devox não lembro de qual país eu tirei alguns prints da palestra dele pra gente ver um pouquinho do que que a gente vai ver hoje antes de sair codando né que que a gente vai ver hoje então vamos aprender um pouquinho na prática sobre Record patterns né a jep 440 Eh vamos aprender um pouquinho sobre pattern matching for suite né 441 pattern matching for suite e o record patterns cara assim fizeram uma revolução no Java né o pattern matching como
como um todo é uma funcionalidade muito rica e muito moderna quer dizer falar moderna é complicado né onde já tem haskel e e outras linguagens que já fazem isso há muito tempo né É complicado mas é uma feature muito muito boa que ajuda diminuir muito a verbosidade né que reclamam do Java Eh vamos ver um pouquinho também de string TL né pô Século XX 2023 e só agora já tem tá tendo é porque ainda preview né só agora o jav vai ter string templates e mas a gente vai ver também o que que é isso
vou mostrar muito sobre virtual threads né já tenho várias talks aqui na full cycle falando sobre virtual trads e concorrência estruturada e scoped valys né mas hoje a gente vai ver na prática aqui o que que o que que isso faz tanta diferença assim e deixa eu ver acho que algumas coisas do Java 1 set também talvez a gente possa ver que é Simple Web Server a gente com certeza vai dar uma passadinha só para mostrar para vocês e da jdk11 a gente vai ver também sobre sealed classes records text Block eh Switch expressions tudo
isso a gente vai ver é embedado na Talk de hoje né construindo aí uma aplicação Zinha eh em conjuntos bacana eh e bom acho que já que a gente já tá falando aqui do da apresentação antes de começar a codificar né Eu já vou apresentar para vocês eh aonde o mundo do Java tá indo né Qual que é a perspectiva do Futuro pro Java nessa talk do bran gots ele ele deixa bem claro uma coisa que é ele não quer que o Java seja perfeito e a melhor linguagem para tudo eh é impossível né uma
linguagem ser boa em todas as áreas eh de aplicabilidade daquela linguagem né das áreas de de mercado mas ele deixou muito claro que ele quer que o Java seja bom em tudo que ele se propõe a fazer eh que ele seja bom no que nas coisas que que fazem ele é uma linguagem muito eh abrangente né não vai ser nichado vai ser abrangente e que em tudo que ele faça ele seja bom Claro não vai ser o melhor que uma Nagem nichada para aquilo mas ele vai ser bom e algum dos projetos ativos né que
que que estão trabalhando bastante na na comunidade são esses aqui os principais e aqui tem aqui os concorrentes óbvios né então o Project loom né o o nosso grande loom que pelas palavras do Brian gots né vai ser o o principal motivo de que as pessoas vão atualizar o Java pro 21 eh assim como era o principal motivo as lambidas do Java 8 né ele acredita que do Java 21 vai ser o loom Porque de fato já venho falando isso faz tempo né faz anos inclusive que esse projeto é um dos projetos mais ambiciosos da
jdk na minha visão né foi né já já tá agora em em produção que éa trazer go routines né coroutines Eh pro mundo do Java né E aqui no Java a gente chama de virtual trads e é construído em cima de continuations né e mas é basicamente Green threads né threads a nível de usuário né de user Space que são threads baratas de se manter diferente das threads que a gente tinha antes que eram threads do Kernel que eram threads pesada eram trads limitadas E aí você explodia a memória da sua máquina antes de você
antes de você conseguir utilizar os recursos como CPU né e agora não é mais assim né e os principais concorrentes obviamente é go e elixer né que eles já trabalham com eh com continuations né com go routines faz anos e agora a gente concorre diretamente com eles trad não é mais caro a gente pode spawnar 1 milhão de trads com tanto que seja virtual Rad que a gente não vai ter problema de memória né Além disso outros features bem ambiciosos né Eh zgc zgc é um um garbage collector com pausas de Sub milliseconds né então
para quem trabalha com aplicações de larga escala né Principalmente o pessoal do mercado livre que tá aí assistindo que eu já vi né Eh a gente já teve grandes problemas com o GC né fazer pausas grandes para limpar a memória e toda vez que o GC fazia uma pausa Grande 100 msos eh a aplicação parava por 100 msos Principalmente quando era um um uma pausa de stop the word né então a gente tinha bastante problema com isso E agora o zgc com sub milliseconds pause esse problema diminuir drasticamente e concorrentes linguagens concorrentes que não tem
GC né são o c e o Rust né então a gente vai começar concorrer pau a pau com essas linguagens eh algumas outras ó vou fazer uma pausa rápida né o Maro Leal falou já existe coroutines no cotlin essas do já vão funcionar mais ou menos da mesma forma ou tem Algo de diferente eh tem Algo de diferente é drasticamente diferente meu amigo por quê Porque o cotlin ele roda em cima da jvm e de todas as construções né de todos os primitivos da jvm no Project L né agora eh por que que eu falei
que é um projeto muito ambicioso eh porque tiveram que construir muita coisa da linguagem Java e da jvm e do bite code né das instruções da jvm para suportar iOS não bloqueantes né então antes quando a gente tinha iOS seja de e network ou de leitura em disco né O que o que principalmente afeta networking né porque ela tência não é controlada disco a gente ainda tem esses problemas mas tem vários cashes tem SD que agilizam muito esse tipo de leitura mas para Network né para eh chamadas de rede Esse era o principal problema do
do de blocking né de operações bloqueantes e com o lo foi reescrito tudo isso para que a nível de linguagem a gente não tenha uma eu bloqueante então assim como é no go né quando é detectado que vai ser feita uma chamada via rede a própria linguagem trata de suspender aquela execução né virtual Aquela aquele caminho né aquela trad eh e e dar aquela aquela Carrier thread né que é a trad do kerno que a gente tinha antes para uma outra rotina continuar ao invés de bloquear aquela trad do kerno né então ela vai muito
além das coroutines do cotlin E é claro que a cor routin do cottin vai se beneficiar disso né agora ela vai ficar bem comprado também e com o syntax Sugar do Cot vai ficar bem gostosinho de usar os dois juntos né mas é um projeto muito mais ambicioso isso aqui do Java tá eh temos também Panamá né Panamá é é a gente conseguir através do Java executar código nativo em C ou qualquer outra linguagem eh sem ter que trabalhar com jni né que que é uma é era um era uma API do Java muito antiga
e muito ruim de trabalhar agora o Panamá tá vindo tá reescrevendo isso e tá tornando muito mais fácil trabalhar com código nativo né você fazer chamadas de libs e direto do da jvm o Project Amber que é ele luta com o que comentaram aí né de de verbosidade de ser difícil de ensinar como ali a gente tá como a gente próprio viê na tabela né e diminuir a verbosidade do Java e trabalhar com com objetos e mais mais syntax Sugar né então obviamente V concorrer com c sharp cotlin leiden é um outro projeto que vai
melhorar muito Startup warm up time da aplicação né veio para concorrer com o go vem para trabalhar junto com o grau VM por exemplo projetiva halala né que é para trazer eh tipos genéricos e Construções eh de data objects programming aqui na linguagem e o Babylon né para para fazer uso aí de de lugares randômicos e e outro tipo de de interop abilidade que a gente usa muito com GPU e aqui no jav era difícil né Então ou seja o que que eu quis dizer com isso né são tem muito trabalho a ser feito o
pessoal da da da da comunidade jdk tá trabalhando muito forte em cima para atacar todas as frentes de que todas as linguagens outras são muito boas é claro que é difícil do Java superar todas essas linguagens nesses aspectos mas vai deixar de ser uma linguagem ruim para tudo isso vai ser uma linguagem boa para tudo isso não vai ser a mais otimizada mas vai ser uma linguagem boa para tudo isso né então Eh o futuro do Java é muito emissor E se ele já é muito usado e muito bom até hoje o futuro com certeza
vai ser muito mais top ainda super Claro temos algumas perguntas aí ó no no mercado livre a gente já tá usando j21 ainda não tá ainda tá em homologação e Mas muito em breve vai ter e pelo menos até ontem até a semana passada que eu tinha visto ainda não tinha mas muito em breve vai começar a utilizar sim tá bom e o problema que demorou tanto foi porque a própria disponibilidade do eclipse temurin né que é a versão aberta da Open jtk eh Demorou da dos builds abertos né Eh Demorou muito para ter a
a para disponibilizar o Build do do 21 ele ficou enrolando porque a própria eh openjdk atualizou os seus eh os seus contratos lá e aí teve esse esse pequeno rolinho aí mas agora já tá disponível os builds abertos da openk pela Eclipse temurin e muito em breve a gente deve começar a utilizar também boa perfeito como é que a gente tá aí de de viewers e likes bora bora soltar o like aí porque vai ter conteúdo aqui hein já temos mais de 400 pessoas e só 140 likes aí não dá aí não dá aí não
dá galera vamos começar a codificar agora apertem os cintos porque vai ter bastante código por aqui eh óbvio que nem tudo que eu vou trazer aqui vai ser focado no Java 21 né como eu comentei a gente vai codificar uma aplicação Então nem tudo é Java 21 mas justamente a gente vai construir essa aplicação para ter um contexto para usar as funcionalidades do ja21 Olha que bonito show de bola ó falta quatro likes para 200 já ia falar só começa com 200 já tá em 222 Então manda bala fechou Bora lá e vamos lá vamos
modificar então o que que a gente vai começar a fazer vamos começar atacando aqui a parte do domain tá e na no curso full cycle eu gosto de construir um módulo do gradle tá um submódulo do gradle aqui no meu no meu repositório no meu projeto para e um para domain um para application e um para infrastructure mas aqui como a gente vai fazer mais snx Sugar mesmo eu vou eu vou trabalhar como se fossem subpackages mesmo aqui da nossa aplicação eh Então vamos lá que que a gente vai construir aqui no nosso querido Java
eh de domain vamos começar definindo nossa classe de usuário tá e eu vou colapsar aqui o menu à esquerda pra gente focar aqui no centro da tela para que vocês possam ver tudo eh que que a gente vai começar declarando aqui vamos lá vamos declarar um eh vamos declarar algumas coisas que a gente vai ter aqui ó e por enquanto vocês estão vendo o Java convencional né para os afobados né para os as pessoas que T eh os apressados né fiquem tranquilo a gente vai trabalhar com todas as features mais modernas do Java aqui mas
eu quero mostrar o antes o depois das mudanças né então e como o Java tá tá mudando tá então como era antigamente né A gente vinha aqui Public user e definia os atributos né então pô string id e Private string Vamos colocar aqui um e-mail Private string password E aí Private string password Type e e normalmente a gente já começava assim né E você tinha tudo isso e aí eu vou utilizar daqui do ide né porque eu não sou besta Então vou utilizar do ide aqui para construir ó getters Então você tinha os seus montes
de acessores né já que a gente tá trabalhando com encapsulamento aqui eh e aí a gente precisava criar um Construtor né aqui ó user eh esse Construtor ele pô tem que receber tudo todos os parâmetros né ó como a ide é fantástica Olha como a ide eh nos ajuda né E aí a gente tem até um consultor vazio mas não né como a gente tá trabalhando com um domínio rico aqui não não vou abordar muito sobre DDD mas a gente tá trabalhando com domínio rico ou Semir rico e Vamos usar só um consultor padrão aqui
e e get Setter Construtor propriedades fica até difícil de enxergar né como que a gente vem trabalhando aqui nos javas mais modernos né então no Java mais moderno a gente trabalha com o record Class é um uma um tipo de classe né porque no fim das contas ele ele vira uma classe aonde a gente define Principalmente as propriedades direto aqui nele né muito parecido com o data Class do cotlin para quem conhece cotlin eh e a gente já consegue definir tudo aqui ó string ID string e-mail string password e string password Type e a gente
não precisa mais ser as propriedades aqui né porque ele já a gente já definiu aqui em cima tá vendo e a gente tamp pouco precisa do Construtor porque isso aqui já é um Construtor e tão pouco Opa e tão pouco precisa dos getters e setters porque a gente já tem acesso aqui ó aos getters por padrão e ele é imutável tá ele já é imutável então eu não consigo vir aqui depois que eu construí esse cara e ter um set ID né não tem ele é imutável eu não preciso sobrescrever o equals e hash code
ele já sobrescreve para mim né então Então o que era milhares de linha virou uma linha só né Então esse é o record Class Olha que bacana como a gente tá trabalhando com orientação a objeto domínio rico etc a gente não vai ter um password e um password Type assim a gente pode evoluir isso aqui também certo então o que que eu vou vamos vamos começar brincando aqui e vamos construir uma interface chamada password né Por que que ela é uma interface porque password pode ter várias implementações né normalmente nos nos sistemas mais e robustos
a gente já trabalha com várias implementações de password eu posso ter um PL text password super inseguro eu posso ter x um password super inseguro também X 56 512 eu posso ter pbk df2 eu posso ter bcrypt eu posso ter vários e toda vez ano a ano é lançado novos tipos de de de hashes de password eh conforme a computação vai avançando e a gente é interessante a gente ter isso aqui de maneira com que a gente possa evoluir eh sem depender e ficar hard Decode né a uma estrutura única e é óbvio que também
tô usando isso de desfecho para mostrar mais funcionalidades da linguagem né então vamos lá como que era antigamente a gente tinha aqui um Public interface password e a gente tinha alguns métodos aqui dentro né então vamos colocar aqui por exemplo string value que todos vão ter e bullan validate E aí recebe uma string password aqui eh e aí a gente começava as implementações aqui né então por exemplo plan text eh password e esse cara implementava o password eh e a gente já aprendeu sobre records aqui né então ele vai ser um Record Class e ele
vai ter um string value né que vai ser a senha que a gente tá encapsulando aqui então como o record Class Eu já mostrei para vocês ele já cria um getter para mim com o nome da propriedade então eu não preciso sobrescrever este este método de password porque ele já vai existir por padrão eu preciso só sobrescrever o meu querido validate e o validate vai ser eh value né vou pegar o valor que eu tenho aqui e vou fazer um equals password né e assim eu vou conseguir garantir que eh a gente tá validando corretamente
e vamos criar um teste super rápido aqui né também não vamos focar tanto em teste Mas ó deveria criar um password um password testing né já usando aqui o J 5 E aí vamos colocar aqui ó final var expected password ig a 1 2 3 4 5 6 New password password então var password E aí aqui vamos colocar ó password validate password criar um password a vamos sar esse teste para garantir que ele tá funcionando né então a gente conseguiu instanciar el ó lá show de bola passou conseguiu distanciar ele e validou né super simples
eh O que mais que dá pra gente fazer aqui ISO aqui não é novidade né isso aqui já já existe há muito tempo mas o que que a gente pode fazer que nos D mais segurança eh para continuar codificando e para continuar evoluindo com o nosso software E à medida que novas features são demandadas né a gente tem agora uma feature chamada sealed Class aqui né ou sealed interfaces né então é um contrato selado ou uma classe selada e aí a diferença desse dessa keyword siled é que eu preciso dizer quem que eu permito que
pode implementar ou estender a minha classe ou interface né E aí aqui eu preciso usar então ó permits PL Tex password né então agora eu começo a controlar e quem eu deixo estender ou deixo implementar e o que que eu ganho com isso eu ganho e uma feature chamada exhaustive check do Switch expressions né do swit pattern Ou seja eu não preciso eu vou mostrar para vocês já já tá eu não preciso mais por exemplo quando eu vier aqui eh eh criar um usuário né já vamos já vamos fazer ou melhor vamos fazer aqui ó
um Vamos fazer um password Factory aqui eh ou então simplesmente um password Type eu vou criar um enum esse password Type ele mentira Vamos a gente vai evoluir para menu mas antes eu vou mostrar para vocês o que eu tô querendo dizer com o Class ele é um password Type ele vai ter aqui um Public um factory meod que vai devolver um password ele vai chamar um Create por enquanto E aí ele vai receber aqui ó o nosso querido string password Type e stringo Apesar de que para eu mostrar para vocês não preciso muito disso
né Mas vamos lá e se vou criar um Switch Expression aqui e vou só aqui em cima mostrar para vocês um uma implementação de password né então password ig a new plan text password né E aí eu preciso de um um querido valor aqui e só para não conflitar né password é strategy se eu colocar esse cara aqui principalmente se eu falar que o tipo dele é genérico né é password o que que eu ganho aqui eu consigo falar que se password strategy for PL text password e ainda conseguir obter né Ó o string P
aqui eh eu consigo fazer qualquer coisa com ele e como por exemp devolver n Vamos colocar aqui ó var pass eu consigo obter esse cara e indo além eu se eu criar um tipo novo aqui ó por exemplo só vou retornar o plan aqui ó plan se eu criar um tipo novo Vamos criar um segundo uma segunda implementação aqui ó então para isso eu vou só vou copiar e aqui e vou mudar para x um password ao criar um tipo novo eu preciso ir lá na minha interface e permitir aquele tipo novo né então x
um password E aí eu sou obrigado Opa fechei aqui eu sou obrigado ó a implementar esse tipo novo aqui no meu Switch Expression então se eu tentar rodar um teste por exemplo o compilador não vai deixar avançar por quê Porque ele vai falar ó esse Switch não cobre todas as possibilidades do do do input que que ele quer dizer com isso eh no meu sutch aqui ó eu tô falando só se for PL text mas PL text não é mais minha única opção agora eu também posso ser x um E aí agora Se eu tentar
rodar ele obviamente vai deixar porque agora eu tô cobrindo todas as opções né então isso aqui é o que chama-se de exhaustive eh Check do Switch ou então obviamente eu poderia colocar um um default E aí pro default falo que vai ser qualquer asneira aqui mas aí se eu colocar um default perde toda a graça não é mesmo porque eu não vou ter o computador ao meu favor mais ok e então por enquanto eu vou deixar aqui isso aqui vamos implementar o o x um password e e como é que vai ser o x um
password eu vou criar aqui ó um Public static um password chamado Create eh que ele vai receber um string plan password ele vai devolver um New xum eu vou criar um uma um método eh Private static que vai devolver uma string E ele se chama hash e ele recebe uma string chamada eh PL text mesmo né e ele vai devolver então um eh hash xum que tá DPC né não é recomendados achar um para password tá gente eu tô fazendo aqui mais para ilustrar eh hash hashing string ele vai fazer o hash desse cara utilizando
o o shars o tf8 e vai me devolver a string desse cara né então e estou pegando esse meu PL text estou passando ele para uma hash function E e assinalando esse hash function para o meu value aqui né então aqui eu já estou persistindo esse cara de maneira rachada já não tá mais em PL Tex é seguro não é não é seguro porque x um não é recomendado para senhas mas já não é já não tá varado né então Eh aqui aqui pro pro nosso querido validate é a mesma coisa né então eu vou
pegar o meu value vou fazer o hash eh desse password que tá vindo e se o hash bater significa que tá ok e esse é pro Create né vamos também criar um outro chamado eh restore que daí ele não vai ele não é mais PL Tex né ele já é o password rado que a gente só vai instanciar aqui e aí para garantir que tá tudo funcionando né Vamos fazer pequenos pequenos testes Public void deveria rar a senha Vamos criar aqui nosso testezinho final bar melhor vamos só password igual a x51 Create a gente vai
passar aqui ó o plan é 1 2 3 4 5 6 e vamos fazer um asser aqui aert not equals password opa pera aí que travou password p value ele não é igual a 1 2 3 4 5 6 né não deveria ser igual e também já vamos fazer um outro um outro testezinho aqui ó eh deveria dar match nas senhas então eu tô criando com 1 2 3 4 5 6 agora a diferença aqui que vai ser assert true eh para password validate e esse cara vamos rodar aqui o os nossos dois testes eh
poderia mandar o link do Git ainda não tenho tá eh D em zoom caramba mais um se der mais um aqui eu não vou conseguir enxergar tá tão ruim assim José eh para todo mundo tá meio ruim de enxergar dá um zoom no código cara tá bem bem tranquilo pessoal como é que tá aí para vocês porque se eu der mais um aqui eu já não consigo enxergar mais mas posso tentar aqui ó vou colocar 30 dei 30 de zoom aqui cara tá bem bem tranquilo Fechou então ó os dois testes passaram né Ó cadê
aqui meu testezinho ó os dois testes passaram então estamos seguros de que tá tá funcionando essa nossa implementação a mesma coisa eu vou passar aqui pro PL text tá só que eu vou claro subir esses caras aqui para PL Text e aqui eh não tem muito segredo beleza por fim eh por fim vamos criar uma última implementação de senhas tá eh essa implementação ela vai ser uma mais forte que normalmente é mais utilizada aí tirando decrypt né eh pbk eh df2 acho que é é isso o nome deixa eu ver se é se é pbkdf2
É isso mesmo essa é uma que eu confesso não uso tanto né aqui quem usa quem tá acostumado com mundo Spring é utilizado BPT principalmente eh mas essa funciona bem também e o que que a gente tem de diferente aqui é que ela não tem só o string value né Ela também tem o string Salt aqui dentro dela que é o Salt eh o Salt normalmente é um um valor randômico que você concatena a senha para que Justamente não seja fácil e dessa senha ser conseguida ser encontrada através de brot Force né e a mesma
coisa né então a gente tem que ir lá no nosso querido password e falar que a gente permite essa nova esse essa nova implementação E aí o que que a gente vai fazer aqui ó Create então password e a gente vai chamar o hash mas antes disso a gente precisa eh construir aqui um Salt né Salt generate Salt e a gente vai criar um um Private static e que na verdade ele vai ser um byte Array mesmo tá então o que que a gente vai colocar aqui ó e var bytes igual a Byte E se
eu não me engano o sal ele tem 16 by perfeito a gente vai agora Random Random iG New secure Random Random generate next bytes passando os nossos queridos bytes ali em cima e aí por fim a gente vai retornar os nossos queridos Ah mentira vamos vamos retornar com string porque depois já fica fácil gente esse cara aqui em cima então para retornar como string a gente precisa usar o base encoding do Google guava também eh encode Bas 16 encode beleza vamos encodar esses bytes gerado em e B 16 aqui a partir desse momento a gente
já tem o Salt a gente vai passar o Salt pra função de hashing e também vamos armazenar esse salting aqui no nosso na nossa estrutura de dados né né então o nosso hashing agora ele leva o PL Text e um final string eh sal aqui e não é mais isso aqui né Agora ficou um pouquinho mais complicado o nosso eh Rash rushing function que agora a rushing function eu vou até colocar dentro de um de um try aqui né para evitar surpresas desagradáveis eh Então spec a gente vai ter que criar um New pbk e
pbe kec perfeito passando PL text P sharay depois disso a gente vai passar o nosso querido Salt pget bytes falando que ele é o tf8 quantas interações a gente quer e qual o tamanho final que a gente quer eu vou colocar 64 aqui dá para ir muito mais robusto muito mais além né mas eh por se tratar apenas de uma demo isso tá OK agora var password né que vai ser a senha gerada a gente vai utilizar Secret Key Factory só aqui vocês não tão decorar não tá gente isso aqui nem eu sei de cabeça
tô vendo uma colinha isso aqui é coisa que a gente usa uma vez na vida e outra na morte vou até copiar aqui qual é o algoritmo então é o algoritmo pbkdf2 com HMC x 500 e 12 vou gerar uma Secret passando a minha spec e a partir disso eu vou pegar encado a minha senha e eu vou retornar aqui a mesma coisa ó base b 64 encoding e 16 encode desse meu cara E aí é só para a gente pegar qualquer tipo de problema aqui né então pegar um trouble e vou dar um pr
Sec Trace e um throw New runtime d t porque se der algum erro ele vai explodir esse erro e tá tudo bem E agora aqui no validate e no validate a gente tem que verificar que D meche com o nosso e sal e aqui no restore vai ter uma pequena logiin né porque a gente vai armazenar no nosso banco de dados o password com o Salt Então a gente vai eh fazer o split Desse nosso Salt eh dólar dólar tal dólar dólar tal Porque a gente vai eu vou concatenar ele com o dólar dólar tá
E aí aqui a gente vai ter var eh All parts E aí basicamente var pass é igual All parts z0 e sal All parts 1 e a gente vai passar aqui pass pass e Salt é assim que a gente recupera do banco e como que a gente e cria ele né tá vendo aqui ó aqui ele tem o o Create Beleza então só vou e mover isso aqui para baixo e aí o seguinte a gente vai fazer o seguinte ó o value dele aqui tá vendo eu vou sobrescrever esse cara vou sobrescrever esse Val para
que a gente possa Ender um novo mecanismo eh e para que eu não devolva o valor interno da minha estrutura de dados aqui e sim devolva o valor que vai ser persistido ou que vai ser retornado né o valor de fato que é para ser utilizado né e não detalhe da implementação do meu valor então o que que eu vou retornar e é uma parada nova aqui que a gente tá utilizando que são os Strings templates né Antigamente como que era feito eu teria que fazer aqui um ou fazer value mais dólar dólar mais sal
né era uma maneira ou então eu poderia fazer assim porcentagem S dólar dólar porcentagem s e utilizar o Format que também é um método novo né antigamente era string P Format E aí Passaria o valor e o sal ou agora uma das novas features é string templates então eu uso aqui ó STR ponto e aí passo eh value dólar dólar Cadê dólar dólar e novamente sal aqui na frente e agora eu consigo fazer eh o que no o que no Java a gente chama de string template em outras linguagens né Muito chamado de interpolação e
em pleno século XXI Java tá vindo com isso agora né então Eh antes tarde do que nunca né e agora vamos criar um testezinho né para garantir que que ele também tá funcionando de maneira esperada Então vamos lá deixa eu já copiar o nome do do outro teste eh porque daí já fica tudo com o mesmo nome que é o do chá tá tem gente falando que vê veio feio é veio diferente vai eu não chamia de feio veio diferente mas você você vai se acostumar com certeza você vai se acostumar pbk password P Create
né e pro Create não tem o Salt o Salt vai ser gerado randomicamente né então aqui ó o Salt vai ser gerado aqui eh Opa fechei sem querer mas já vamos colocar aqui o nosso querido cas né porque senão vai dar vai dar chabu pbk password ele até aqui ó string pass string sal eh mas eu vou a gente pode até retornar aqui ó a mesma coisa que tem lá dentro ou melhor nem precisamos né nem precisamos eh colocar aqui como P fazer uma verificação eh [Música] a que a string gerada contén de certa forma
dólar dólar e concatenado ao Salt perfeito Então a gente vai garantir que o Salt está sendo aplicado ao meu valor e a mesma coisa aqui ó deveria dar match Então a gente vai criar esse cara deixa eu ajustar o auto Import aqui para remover o que não tá sendo mais utilizado criou com 2 3 4 5 6 e o validate deveria funcionar 1 2 3 4 5 6 também né Vamos executar para ver se tá tudo bonitinho e e deu chabu que great deixa eu ver se a gente tá usando alguma feature aqui aqui do
nosso querido pbk bf11 não estamos usando nenhuma feature aqui do Java 21 mas eu preciso configurar deixa eu configurar aqui no meu no meu test menos menos enable preview vamos ver se assim vai porque eu acho que tem problema talvez eu não configurei os testes é eu não configurei os testes para suportarem enable preview gênio não tem problema Depois a gente depois a gente garante que isso tá funcionando eh Beleza então recapitulando aqui o que que a gente já aprendeu do nosso querido Java 21 utilizando na prática né Vamos lá naquelas naquelas imagens ó Record
já aprendemos que que é o record patterns é isso aqui né é dentro na verdade isso aqui é dentro do Switch expressions a gente tá utilizando Record patterns né mas não precisa ser só dentro do Switch né poderia ser dentro de if também então por exemplo se password strategy é da instância PL text eu faço alguma coisa com ele né E aí Isso aqui sim é Record patterns tá vendo e eu fiz dentro de um instanceof Eu verifiquei se ele é se isso que é de qualquer tipo né password qualquer tipo de password Eu verifiquei
se ele é do tipo PL text password e fiz a desconstrução do valor de password que está dentro dele que está declarado aqui dentro tá vendo e aí eu poderia usar aqui dentro password para fazer qualquer coisa né então sei lá um System out poderia logar aqui a senha dele né então isso aqui é Record patterns pattern matching for Switch expressions né então Eh aqui a gente tá vendo já ó pattern matching for Switch expressions né estamos utilizando de pattern matchings aqui dentro dele que a gente já também já viu aqui em cima né estamos
utilizando do Record patterns aqui mas aqui embaixo não tem Record P nenhum ele só é de fato Switch expressions eh e Olha que legal né A gente vai ver isso mais paraa frente também mas olha que legal que isso que isso pode se tornar se eu falasse que isso aqui é Object por exemplo eh esse Switch expirations obviamente não tá cobrindo qualquer estratégias E então Eu precisaria de um default aqui qualquer coisa mas eh se eu se eu tô usando aqui o se eu tô recebendo um Object como parâmetro eu poderia vai falar trabalhar em
dois níveis eh em dois níveis de verificação aqui dentro do Switch pega essa Leonan você não vai nem acreditar que que eu poderia fazer aqui ó se eu falar como eu tô recebendo Object aqui né eu já não sei mais se ele é do tipo passwords tá é um Object então eu poderia falar se for password P Mas eu não quero só password P genérico eu quero quando for né ou seja o when é p instance PL text password e utilizar aqui da desconstrução dele para pegar o valor dentro dele Olha que Fantástico né eu
aqui tá uma micelânia de coisas né porque a gente ainda não aplicou no momento certo mas olha como a gente tá chegando avançado no Switch expressions para eh para o Java né porque outras linguagens já possuem isso o rest eu possui isso né então quando eh aqui o password strategy eu não sei que tipo que ele é ele é Object ele poderia ser qualquer coisa então se eu vou verificar se ele é a inter se ele é uma implementação na interface password se for e também for né Se for e quando for da implementação específica
do pl text password eu vou fazer alguma coisa aqui eh poderia fazer Poderia verificar outras coisas né então pô se for do password eh P e for se ela achar um password né eu já tô cobrindo aqui então não preciso mais eh só para não conflitar né então ó ch pass eh ou então se for pbk né então Eh eu consigo aplicar variações e verificações dentro do meu swit expressions para só entrar no meu sutch se for determinada condição né então isso aqui já é algo bastante avançado e pô bem legal né claro daria ao
invés de usar o w daria para usar sei lá eh e pon p. value maior que 5 value P length né Maior Que c tem tem várias outras coisas que poderiam ser feitas aí mas já dá para ver que tá ficando muito forte eh o Java né então acabei me desvirtuando das coisas aqui mas vamos voltar isso aqui vai mudar né o nosso nosso usuário ele agora tá ficando um pouco mais rico e a partir de agora ele não armazena mais password e o password Type ele armazena só password ele eu não preciso saber porque
a implementação dele vai me dizer qual é o tipo dele mas a gente vai ter que criar aqui Factory methods para criar este usuário e também para recuperar para para recuperar né calizar E deserializar este usuário então para criar eu preciso de um e-mail eu preciso de um password Type e eu preciso da própria senha em si que vai est em plain Text e aí eu vou retornar um New user o identificador del a gente pode utilizar aqui por exemplo eh two string E aí claro isso aqui a gente pode colocar dentro de um dentro
de uma outra classe né então por exemplo ID generator vou colocar ela como Opa como final para ninguém estender e vou disponibilizar static string next ID retornar isso aqui então agora sim a gente pode utilizar esse cara aqui vamos passar o e-mail e a gente vai precisar passar eh o password para ele pro password a gente vai agora voltar lá e vamos construir o password Type que ele vai funcionar como um factory method né Isso aqui tudo que eu tava mostrando para vocês ó ssó aqui tudo vai de vala a gente vai utilizar o password
Type como um en1 tá Quais são as possibilidades plan eh x um e pbk df2 é isso sempre me confundo E aí a gente vai ter aqui Private eh function eu vou definir dua dois duas propriedades para esse meu menu tá que um é recebe uma string e retorna um password e eu vou chamar de Create fn e a outra vai ser recebe uma eh recebe uma string e retorna um password também só que ela vai ser um restore fn beleza e aí Claro eh Esses caras são final e esse aqui é final eí eu
preciso construir o meu Construtor suporta esses dois carinhas E aí para cada um deles agora eh vai ter eh eu vou ter que especificar Qual que é a implementação né então o plane como vocês sabem bem É o Create e o restore do chá é o chá Create e x. restore e por fim é pbkdf2 Create I pbkdf2 restore Então eu tenho o meu en1 que ele já tem esses eh esses esses meus facilitadores e eu só vou disponibilizar aqui então dois métodos que é string Create ou melhor ele devolve um password né então Create
e ele vai receber aqui ó final string plane password ele vai retornar um e new ou melhor dis Creator fn apply PL text password a mesma coisa pro restore né então Public password restore final string password e ele vai devolver restore fn apply password aqui no fim das contas o que que é esse enum esse en1 é um uma Factory né Estou ele tá funcionando como uma Factory aqui dentro e aí eu eu estou usando um en1 aqui porque eh porque é uma facilidade que a linguagem nos dá me dá né então Eh aqui só
deixa eu corrigir o typo né Create e restore e como que a gente vai usar esse cara ó vou até criar um testezinho aqui ó eh Create test password a gente vai utilizar ele n Putz não sei nem se vai conseguir rodar Mas enfim eh Public void eh deveria criar plane text password E aí é basicamente ó plan P Create e vou até colocar aqui em cima ó final var exp expected password 1 2 3 4 5 6 e finar actual password passando esse cara E aí por último assertions P asser equals expected password aí
que travou Opa expected password deveria ser igual ao actual password P value justamente porque a gente tá usando uma estratégia de plan text né então Eh vamos executar aqui e Opa obviamente ele quebrou aqui né então ó plane text na verdade ó aqui a gente já tem o N1 né então ó password Type e eu vou usar o password Type P Create aqui então vamos voltar lá pro nosso teste né vai rodar aqui e ele ainda tá com esse chabu pera aí depois eu corrijo isso para pra gente fazer funcionar o nosso querido teste Então
por hora a gente pode fazer o teste da seguinte maneira ó eh vou colocar isso aqui no m e a gente a gente vai ver vou executar como uma aplicação Java mesmo só pra gente ver funcionando é tudo que tá no no package de teste ele vai ele vai chiar até eu corrigir isso aqui não tem problema Fechou então vamos continuar aqui que é do Create e vamos fazer o restore também né então a gente serializando a gente desi realizou agora a gente vai seri realizou agora a gente vai deserializar restore e aí o restore
vai receber todos os parâmetros né então ID e-mail eh password password Type Claro tem que receber password Type e o próprio password a diferença aqui que a gente vai vai chamar o restore aqui para voltar de password Type como password para dentro desse cara eh estou usando vs code não estou usando Eh interj perfeito Então já temos o nosso usuário aqui né já pra gente conseguir enxergar ele funcionando bonitinho vamos fazer outras coisas também ó vamos criar aqui uma camada de uma um pack infrastructure E aí nesse package infrastructure a gente vai colocar eu vou
até mover Ó ele aqui para dentro ó só para ficar com uma dam aqui dentro e vou criar um controllers ou Trip também pode ser e dentro desse Controller eu vou criar um user Controller né então aqui sem muito segredo né é Spring Zão da na veia eh request mapping value users ou seja Estou definindo um Controller eh um um rest uma rest api né cujo prefixo começa com barra users e aí eu vou colocar aqui ó vai devolver um user eu vou chamar ele de Create e esse cara vai ser um post mapping né
e ele vai receber aqui como parâmetro deixa eu criar aqui ele vai receber como parâmetro um Create user input que ele é um Record Class E aí para criar eu preciso de um string email string password Type e string password bacana E aqui então para fazer o bind do que tá vindo da da da da request para o meu objeto eu uso request Body Create user input e é isso E aí eu vou fazer basicamente ó user pon Create input email input eh password type que inclusive isso aqui é a gente pode usar o já
o en1 direto aqui tá password Type password Type e input pon password se a gente subir a aplicação por exemplo ó vou executar ela até no modo debug pra gente conseguir ver batendo aqui e retornando e eu abrir o Postman aqui já se Zoom deixa eu dar zoom aqui ó então ó Já deixei até aqui umas umas request zinhas mocad né então e-mail aqui ó qualquer e-mail @email.com com a senha do pbk df2 e uma senha aqui e do 1 2 3 45 6 vou executar não coloquei nenhum Break Point Mas a gente pode ver
que que funcionou né abr aspas o meu usuário foi criado então eu foi setado um ID randômico devolveu com o meu e-mail e a parte de password está devolvendo aqui ó o value e até devolvendo o s aqui eh bacana E aí Leonan que que você tá achando até agora cara muito louco principalmente aquela parte do Switch que você mostrou eu confesso que eu não sabia essa parte do do en ali cara bem legal Muito top né eh me me falaram do restore aqui só para eu corrigir então verdade muito obrigado tá tá prestando atenção
pontinho Extra aí pro nosso querido jonathon hein Obrigado por ter por ter me avisado show show de bola su quando você tá bebendo uma aguinha aí deixa eu botar n porque já tem um monte de pessoas aqui esperando doido atrás disso então pera aí pessoal vou colocar agora na Live tá o CR code E aí vocês cessem aí por favor vou deixar por um tempinho aí E aí galera que que vocês estão achando até agora estão curtindo aprendendo ó temos aqui até uma duvidazinha bacana que eu vou já jogar pro suak pessoal já tá na
tela tá show show de bola vou dar um Stop aqui agora a gente volta com essa dúvida que eu achei bem legal e depois a gente continua vamos lá manda dúvida aí qual que é cara o Gabriel Porto perguntou o seguinte o varno Java faz a tipagem de tipos complexos também eh de tipos complexos Como assim eh sim ele ele faz eh a inferencia de qualquer tipo tá não é só tipo primitivo não é só eh objetos ou classes da da linguagem qualquer coisa funciona eh inclusive até aqui funciona tá eu tô usando por Ah
eu acho que eu deletei ali o código fonte né no password Type eh mas ele funcionaria também se se eu fizesse assim por exemplo e sei lá Vamos definir aqui como var né var P iG New PL password com qualquer coisa se eu fosse verificar se P instance of Play password eu conseguiria colocar assim também ó tá vendo eu posso fazer a desconstrução com var eu eu acabei colocando string em tudo e mas o var também funciona aqui e também funciona Claro no swit expressions né então se eu colocar aqui como p i falar cas
text password eu consigo colocar aqui vara aqui também utilizar esse cara normal tá vendo Então o var agora el tá bem bem mais robusto tá ficando cada vez maiso do que do que quando veio lá atrás no Java 11 se eu não me engano Java 11 sim tem mais alguma duvidazinha aí por enquanto ó temos aqui do R Como chama o patter de formatar o retorno para outra camada que você utilizou no template no template string para desenrolar acho que ele tá referindo aquela parte do password que você utilizou o template string l pera aí
aonde que tá essa pergunta sbre como chama o pattern de formatar ah chama eh string template né no no Java el tá conhecido como string templates Jap 430 tá string templates isso aí show de bola cara E aí ele inclusive e in não vou nem me aventurar a fazer isso agora porque ainda não não tô dominando né mas dá para você criar o seu próprio string template é chamado de processor né Isso aqui é chamado de de ele é um processor você cria eh a partir de um template né e é inclusive uma uma interface
Você poderia por exemplo criar um próprio se lá Jason né é que é que não tem mas eu poderia criar o o o meu Jason ou qualquer outra coisa e para fazer igual o STR tá funcionando sabe isso que ficou legal ficou bem customizado posso fazer outras outros comportamentos posso fazer um de SQL vai fazer várias coisas não só não tem só ess esse não tem só esse STR fixo aqui sabe essa é pegada Show de bola show de bola show de bola Vamos lá ver Bacana Então dando a continuidade aqui que que eu quero
o que que eu vou fazer agora eh vamos avançar só um pouquinho com a estrutura pra gente conseguir mostrar uma outra parte que eu quero para vocês agora que é eu já até mostrei eu já até mostrei na verdade mas eu quero mostrar eh fazendo sentido agora tá bom então vamos lá eu vou criar aqui na verdade dentro do meu application alguns vou criar Por enquanto só um Main Class aqui mas na verdade não vai ser também ele é ele é um Dame porque eu quero criar a estrutura de de pastas aqui que é US
cases vou criar eh repository e vou criar um gateways tá E aí eu vou excluir isso aqui que que eu vou criar aqui de de de caso de uso o primeiro deles é justamente Eh vamos começar com Create né create user aqui do repository eu vou criar o user repository ele é uma interface tá E esse meu repositório ele vai ter alguns métodos como por exemplo user colocar save mesmo e ele recebe um user como parâmetro ele vai ter um método de optional e que vai retornar um user user of off ID E aí vai
receber um string user id e também vai ter um user of email né justamente para que a gente possa conseguir fazer até um login depois eh E se eu não me engano Ah tá beleza a gente também vai ter mais um aqui que ó ele vai retornar uma eh uma Sequence Collection mentira vai retornar uma uma Collection padrão porque não vai ter referência assim com esse Collection a gente vai ver depois e uma Collection chamado All users beleza aqui seria o listar todos né famoso e aí já vamos também aproveitar que a gente já tá
com a mão na massa a gente já vai criar a implementação desse cara então vou vir aqui dentro de infrastructure e vou criar um cara chamado reposit repositories e aqui dentro a gente vai ter o M reposit que implementa o user repository por enquanto tá isso aqui tudo que fazendo de repository US cas não tem nada demais isso aqui é só só bom e velho jav mesmo masero sentido coisa mostar você tudo funcionando nesse nessa implementação de repositório que é em memória ele vai ter um um mapa que é onde a gente vai armazenar esses
usuários né pra gente poder recuperar depois eu vou chamar este mapa de table e eu vou criar um index reverso também que é a email index E aí eu vou instanciar esse ao instanciar né esse meu repository eu vou instanciar um New concurrent Rash map e aqui a mesma coisa new current Rash map o save ele vai retornar a usuário Mas ó dist table PP user.id e user e email index user. email e user o get por identificador optional of nullable dis table.get userid o nosso querido get por e-mail ele vai na e-mail index email
e o listar todos é basicamente dis ptable values né não tem muito segredo Então já temos uma implementação em memória de uma persistência de um repositório e esse cara aqui eu vou já anotar ele como um service tá ou como as pessoas gostam também o @component né do Spring que é pro Spring fazer eh a leitura desses dessas classes e criar para mim a implementação e disponibilize como um Bin né que eu posso injetar esse Car em outros lugares Ok então temos a implementação básica aqui do nosso repositório eh no nosso Create user eu vou
anotar ele como nem vou anotar ele na verdade né a gente vai declarar ele depois justamente para não ter muito de Framework aqui nessa camada de application e nem Framework na camada de domain o que que o nosso Create user que ele é um caso de uso vai ter né ele vai precisar do user repository então ó criei aqui no Construtor e aqui normalmente né recomendado usar ó Object P requires no nul né e ele vai ter todo todo caso de uso ele implementa o padrão Command né ou seja ele só tem um único método
que recebe uma entrada recebe uma saída e então a gente vai definir como a entrada dos casos de uso sempre um Record Class específico né e o output também sempre um Record Class de output nunca a gente vai retornar ou receber uma uma entidade de domínio Public eh output Execute e a gente vai ter aqui o nosso querido final input que que a gente vai receber aquilo que a gente já sabe né que é string e-mail e password Type e string password eu tô codificando meio rápido né Eh tô codificando meio rápido porque senão a
gente vai ficar aqui a noite inteira né mas eu quero mostrar ainda de virtual threads e concorrência estruturada né A gente tá chegando lá aperta os SOS aí se falar que se vocês acharem que tipo ah pô tá demorando muito quer que eu encurte eu encurto mas se se vocês estão curtindo toda essa construção de contexto Manda aí que tá de boa que a gente segue fazendo fazendo esse caminho longo mas que eu tenho certeza que vocês vão aprender muito Ok eh e o output que que a gente vai retornar vamos retornar Só um só
o user ID aqui né não tem problema então como é que vai ser aqui a o nosso caso de uso basicamente né vai ser eh dis ou melhor user pon Create input pon email input P password Type input password E aí eu vou pegar o nosso dis puser repository P save passar esse cara E aí o resultado dele é um user né então um user criado aqui e a gente vai dar um return basicamente No new output user ID aqui ó show de bola esse é o caso de uso como que eu faço para declarar
esse Bin aqui do Spring sem ter que colocar anot dentro dele a gente pode de duas maneiras né A primeira vir aqui dentro do me infrastructure criar um package configurations por exemplo e criar uma classe chamada US Case config eu falo que ele é um configuration E aí aqui eu declaro o meu Bin né Create user create user E aí aqui em cima eu coloco anation Bin E aí eu devolv o meu objeto né E claro que o Create user precisa de user repository Então eu preciso injetar o meu user repository aqui na minha classe
de configuration E aí eu devolvo aqui para ele ó Pronto agora ele é um bindo Spring e eu não precisei colocar nenhuma notation Não precisei acoplar o meu caso de uso ao Framework algum tá essa é uma maneira uma outra maneira de fazer é para não ficar complexo e você não tem que ficar declarando na mão todos os seus os seus beins né os seus casos de uso é utilizada a especificação de CDI né e do próprio Java porque daí todos os os frameworks né Como o próprio quarc usa a especificação de CDI o Spring
tem compatibilidade para especificação de CDI o micronaut tem compatibilidade também e a você não precisaria ficar fazendo isso aqui que eu vou fazer em todos os cantos eh você só usaria a anotação @named eí ele funcionaria mas não vou trazer esse esse cara agora então assim funciona eh e bom como agora a gente tem um caso de uso a gente pode utilizar esse caso de uso aqui no nosso Controller né não preciso mais fazer isso na mão então eu vou colocar aqui eh essa nossa implementação do caso de uso e aqui basicamente a gente vai
chamar ó dis P Create user Execute passando um New input Create user input passando esses caras e aí a gente vai ter aqui ó um final output perfeito e aí eu quer queria mostrar uma outra coisa para vocês agora que é esse cara não precisa ser só um user né a gente pode utilizar aqui ó como um response en e o que que a gente retorna aqui por exemplo ó e vamos retornar Vamos criar um triat aqui bem e bem D mesmo e a gente vai ter um eh tenta chamar o caso de uso se
der certo retorna respon created esse Creator ele recebe como parâmetro um u. Create que porque ele vai colocar esse caminho no header né como location E aí aqui ó Antigamente como é que a gente fazia ó fazia assim ó barra users barra porcentagem s. formatted output P userid E aí devolvia o bar como output mas isso aqui é coisa velha né E aí a gente também pode catar aqui ó como um Trouble e agora a gente tem o nosso string template que eu mostrei para vocês já então vamos colocar aqui ó string template E aí
ó a gente vai criar a interpolação que é barra users barra isso isso aqui e chamar aqui dentro ó interpolação no Java Olha que lindo e se der algum tipo de erro a gente vai dar como respon P internal server erro E aí meu amigo eh corre pro abraço né então a gente vai criar aqui um um para não ter que criar uma um Record Class de erro Tá eu vou criar um mapa mesmo eh com o error com o valor t ponto eh Get message e se der erro ele vai retornar um um simples
objeto com atributo chamado error e qual que é a mensagem de erro aqui show de bola vamos ver vamos ver se tá funcionando isso aqui né já que o teste aqui não tá funcionando vamos rodar aqui ó a nossa application vamos lá ó vou rodar aqui no modo debug inclusive eh vai subir o nosso o nosso servidor de aplicação ó subiu na porta 8080 vamos lá eu vou fazer o post aqui de usuário novamente tum ó lá já chamou o nosso caso de uso ele devolveu aqui que o user ID foi esse se eu for
os readers aqui nossa esse Branco tá me cegando né tá cegando vocês também esse Branco tá dolorido Olha o header aqui ó devolveu barra users barid só que como a gente não tem essa rota ainda não adianta eu chamar né mas já tá tá duro de ver né mas já tá funcionando aqui perfeitamente vamos fazer a rota de get agora rapidão vamos fazer a rota de G aqui ó vamos lá então eu vou criar o caso de de uso aqui ó get user of ID mesma coisa né ó Record input E aí ele vai receber
uma string ID ele vai ter o record output que é string ID string email e nem vou devolver senha tá nem nem vamos devolver senha Vamos deixar a senha ofuscada Public eh putut Execute e ele recebe o final input aqui eh a gente vai precisar do nosso querido user repository vamos eh criar o nosso Construtor objects P requires no nul E aí aqui a gente vai retornar basicamente ó dis P user repository user of ID passando esse cara E aí como ele é opcional n ele pode não existir se ele não existir a gente vai
lançar um New runtime Exception user not found sem tratar mesmo e se existir obviamente a gente prisa mapear né fazer um map de user para o new output Opa New output E aí o output é basicamente it pid it. email ah isso aqui poderia ser Construtor Sim a gente poderia criar no Construtor então basicamente ó Public output recebendo um user e a gente chama dis e deixa eu importar o user aqui user di user.id user pil e a gente nem precisa mais dessa lambda aqui a gente poderia passar aqui ó output 2 P 2 p
New que ele vai fazer referência a esse método a esse Construtor n essa sobrecarga aqui dentro show de bola como a gente já sabe né a gente precisa declarar este caso de uso Então vamos lá use Case config E aí igual a gente fez ali Public use Case pá return New US cas config passando esse cara E aí @ Bin aqui show de bola lá no nosso Controller a mesma coisa que a gente já sabe vamos injetar esse cara ó get user of ID vamos precisar colocar no Construtor também final objects P requires no nul
E aí agora a gente consegue ter finalmente a nossa o nosso endp aqui response entity user of ID ele é um get né cujo value dele é simplesmente ID aqui e aí pra gente extrair esse ID da ROTA é com pef string id e basicamente mesma coisa que a gente fez ali em cima try Fin output IgG user Execute New getuser input passando id e faltou deixar como público né os meus Record classes aqui para que a gente possa acessar eles de fora e aí a gente vai dar um return de resp entity ponok output
ou então catch runtime Exception E aí a gente sabe que se for um runtime Exception a gente já retorna um eh not found mesmo sem dó nem piedade show de bola Vamos subir de novo aqui a minha aplicação ó restarte essa Live vai ficar gravada sim vai ficar gravado eh acho vai né Lun vai né Live vai ficar gravada assim tá Pessoal vocês também vão receber todo mundo tem inscrito na imersão lá no e-mail o replay dela então fica tranquilo show de bola então ó já restarte né aqui a minha aplicação se eu chamar aqui
o post ó ele vai criar agora a gente consegue até usar essa rota aqui ó o location né Então deixa eu ver se é isso aqui ó get passando location ele Ó funcionou então a gente já tem o nosso get user aqui funcionando bonitamente show de bola estamos caminhando galera agora vamos fazer o seguinte ó Opa agora agora eu quero mostrar para vocês uma parada bem legal que é a parte dos virtual thread né que que é o virtual thread e como que a gente vai ver na prática tá bom dentro aqui dos meus resear
Tá eu já deixei preparado duas propriedades aqui para facilitar a primeira delas é o Spring pthreads pval enabled né ou seja habilitar virtual threads dentro do mundo do Spring eh e fazer com que o Spring configure que o meu servidor de aplicação web já utilize virtual threads por enquanto ele tá falso tá pra gente entender como que é eh como funciona hoje em dia ainda né antes do Java 21 e eu estou configurando aqui que o meu servidor de aplicação vai ter 10 trads para processar requests o que que isso significa fazendo uma analogia com
eh um restaurante por exemplo né Eh significa que eu vou ter eh 10 atendentes em um mundo aonde esses atendentes eles fazem tudo ou seja ele atende e ele cozinha eh e o que que o que que Como como que é para vocês entenderem essa analogia né o que como que se dá na prática imagina que você chegou no restaurante e esse restaurante tem 10 atendentes Então por enquanto tem só você o um atendente vai lá e fala oi Fulano o que que você quer e aí você vai olhar o cardápio você vai pensar e
ele vai estar esperando né você você olhar o cardápio pensar escolhi eu quero ovos com salsicha aí ele vai anotar vai até a cozinha vai vai preparar para você vai esperar ficar pronto e vai vir aqui te trazer e ele vai ficar disponível para ser atendido por outra pessoa eh nesse cenário o atendente ele fez tudo né E a gente tem um um recurso limitado no nosso restaurante a gente não pode colocar 1 milhão de atendentes porque não vai ter espaço certo então a gente tem vai vamos supor a gente tem dois beleza Eh se
chegar você e mais um Ou seja você chegou sentou numa mesa foi um atendente chegou mais uma pessoa sentou numa mesa chegou o atendente eh o terceiro que chegar e sentar numa mesa ele não vai conseguir pedir nada porque não vai ter atendente para para atender ele concorda ele só vai conseguir atender alguém depois que uma outra mesa tiver tiver pedido tiver com seu pedido em mã tiver comendo feliz aí sim esse esse segundo garçom vai est disponível para que eh ele atenda outras mesas então a analogia é essa é essa é exatamente essa né
Então nesse cenário eu tô configurando aqui meu pull de trads para ter dois eh para ter dois cozinheiros e eu não estou usando o conceito de virtual threads né então Ou seja eu só vou ter dois cozinheiros para atender todo mundo e a gente vai ver o que que isso vai acontecer na prática só para não ficar tão ruim eu vou aumentar um pouquinho vai normalmente tem sei lá 40 trads aqui 50 trads né que dependendo do seu response time 40 TR vai funcionar muito bem e a gente vai ver isso acontecendo na prática Ok
então vamos lá que que eu vou fazer aqui de de adicional para vocês entenderem na prática isso funcionando eu vou lá no meu user Controller e aqui no meu Create por exemplo eu vou adicionar um segundo parâmetro que é um parâmetro mocado mesmo que o nome dele name vai ser latence né vou adicionar uma latência Extra o default value dele é 10 e ele é required false in latency Ok E aí eu vou fazer aqui ó basicamente um trad pon slip para essa latência né eu vou fazer essa minha trad dormir e o quanto eu
passar ali para ela e aí eu vou subir a minha aplicação aqui agora tá a gente vai Executar a aplicação e eu preparei um scriptz inho aqui ó usando a ferramenta de teste de carga chamada k6 e para ele simular eu vou simular dois vamos começar com pouco né ou melhor pode ser com 10 mesmo vou começar com 10 virtual users eu vou rodar por 20 segundos e eu vou chamar o método de create user aqui ó então ele na verdade ele ele vamos vou comentar esses de cima e vou basicamente chamar só esse cara
aqui isso aqui tudo eu vou comentar e ele vai dormir por um segundo né O que que esse teste de stress faz ele para cada vu aqui que é virtual user é como se fosse uma uma trad que vai ficar num num Wi true infinito Então nesse caso tem 10 10 trads em paralelo nesse w infinito fazendo o qu fazendo isso aqui que é basicamente né ele vai eu vou ler eu vou ler aqui da minha lista de usuários que eu deixei já Prontinho uma lista de usuários aqui ó uma lista de usuários tem acho
que 80 ou 70 usuários com uma senha e um nome eu vou pegar esse virtual user que é um parâmetro dentro do próprio k6 e vou ler daquela lista de usuário vou e vou passar como um um parâmetro para criar esse usuário na nossa base e aí a gente vai simular esse Create user aqui ó Cadê o Create user tá lá no meu nos meus métodos helpers e passando uma latência latência V vou até colocar aqui em cima latency e vou passar como um parâmetro eh mais latency aqui mesmo e aqui ó latência eu vou
passar como 10 vai ser o equivalente aqueles 10 milos Tá bom então deixa eu abr pegar meu terminal aqui deixa eu dar zoom né para vocês poderem enxergarem bem o que tá acontecendo beleza a Run simulate users então ele vai começar a executar o meu teste de carga aqui deixa eu aumentar o terminal então o que que ele tá fazendo né ele tá até printando ó e ele iniciou 10 threads em paralelo e tá chamando o meu Create user e a cada para cada usuário para cada 10 ele chama Create user daí ele dorme e
aí depois de um segundo ele chama o Create user de novo né ou seja na base de dados se a gente for ver lá na nossa base ele vai ter um monte de dado repetido porque ele acabou repetindo esse cara né Se eu colocar um Break Point aqui por exemplo e chamar o próprio post ó Opa Ah não rodei com modo com modo debug então D para ver depois a gente faz isso tem problema ele só criou vários usuários na nossa base o que que é importante aqui tá vendo o importante é vocês focarem nisso
aqui ó http request duration ok a média foi de 34 msos que tá muito bom fabuloso e o P90 p95 ó 95% das requests foram abaixo de 61 msos que tá muito bom né e quantas requests a gente executou aqui ó no nove requests por segundo tá vendo nove requests por segundo e então foi uma quantidade bem baixinha de de request por segundo né não é tanta coisa A latência tá muito boa e então tá funcionando muito bem o que que acontece se eu colocar por exemplo 40 virtual users aqui e e eu tirar esse
slip aqui colocar para 0.3 ou seja cada um segundo eu vou criar três vezes um usuário por virtual user eh e também tá E também vou aumentar a latência aqui para Eh 100 msos né Agora eu vou parar o meu servidor vou rodar com modo debug para que vocês para que depois a gente possa ver o que vai acontecer aqui esse JS aí faz multitrade ou só em sequência ele faz em paralelo é paralelo não é só concorrente eh então cada virtual user é um cara paralelo bombeando bombeando o servidor de requests Agora sim a
gente vai rodar e ó vamos ver lá quantas trads a gente aou 40 né ou seja tem bastante trad aqui para responder vamos lá vamos rodar Nossa aplicação tá vendo que agora ele começa a printar muito mais rápido né então a gente tá eh bombeando o nosso servidor com muito mais O código vai ser disponibilizado sim lá no meu github tá deployed sexta eh no final da aula eu subo todo o código fonte lá e no no repositório público para vocês eh tá bombeando por 20 segundos ó o que que aconteceu não aconteceu ainda nada
demais né o p95 aumentou um pouco mas ele ainda tá controlado e a quantidade de request só aumentou bastante né foi para 100 por segundo que é vezes 60 por exemplo ó mais de 7.000 RPM aumentou bastante ainda tá tranquilo né o p95 ainda tá bem tranquilo que que eu vou fazer então só para não acabar com os recursos da minha máquina vou diminuir a quantidade de trads que são capazes de responder vou colocar como cinco tred para responder a tudo isso de request que eu tô mandando aqui tá e a gente vai ver o
que acontece beleza vamos lá vou continuar aqui ó estamos destruindo de de request vamos ver como é que tá funcionando o nosso servidor vamos ver como que vai tá a latência do nosso servidor Cadê beleza é ainda tá muito boa na verdade deixa eu só fazer um teste porque eu acho que a latência não tá não esse parâmetro aqui não sei se ele tá funcionando corretamente V aumentar para 1 [Música] segundo vou rodar e vou colocar aqui ó um Break Point só para ver se tá vindo é não ele não tá não tá pegando o
parâmetro corretamente Não por isso que ele não tá funcionando como esperado deixa eu ver aqui só no Script Create user laten colocar o ah Óbvio faltou igual faltou igual é isso valeu por Valeu por me lembrarem galera Agora sim vamos lá deixa eu só ver aqui ó coloquei o bre aqui para ver se tá funcionando agora sim chegou uma latência bruta hein agora na verdade chegou uma latência bruta demais vai vou cancelar isso aqui vou diminuir um pouquinho para para 300 vai normalmente 300 msos é um tempo de resposta ok e deixa eu ver se
eu tô com Break Point não tô com Break Point vou continuar a minha execução e olha como ele tá printando muito mais devagar né olha como como ele já tá não tá respondendo tão bem que que vai TC aqui a latência geral das requests das que não falharem né vai pro caso do Chapéu vamos ver vamos ver aqui ó ó ó tá vendo ó request duration o p95 a própria média aqui ó já foi para 2 segundos tá Muito alto isso aqui né 2 segundos tá muito alto mas por que que tá muito alto porque
o meu servidor de ap ação começou a enfileirar request né vamos voltar pra analogia do supermercado do do restaurante e eu tenho cinco cinco cozinheiros Então se chega cinco pessoas e senta a cinco em cada uma das Mesas todos os meus cozinheiros vão ficar eh vão ficar atolados de trabalho e as pessoas que estiverem na porta e quiserem entrar no meu restaurante vão ter que ficar esperando na fila né Igual balada vão ter que ficar esperando então vai começar a enfileirar E aí conforme for saindo esse cara vai entrar para ser atendido mas o tempo
de resposta geral da request que começa desde que ela chega na fila vai pra casa do chapéu por isso que foi para 2 segundos e qual que é a sacada aqui você pode estar pensando ah então vou vou aumentar vou aumentar a quantidade de tred vou aumentar a quantidade de cozinheiros para 500 mas se eu fizer isso eu não vou ter espaço no meu restaurante mais vou ter só cozinheiro não vou ter espaço para ter mesa que é o que acontece que acontecia na prática no nosso mundo do Java né Por quê Porque a um
cozinheiro era era o equivalente a uma trad Eu ficava a se eu tentasse colocar 500 trads para responder 500 requests em paralelo eh eh em paralelo significava que eu poderia estar correndo risco até um memory um out of Memory porque cada trad do sistema operacional começa normalmente em 2 megas pai se eu fizer vezes 500 é é 1 GB só de trad para começar a brincar e na verdade eu coloquei dois sen não singelo né porque é três quase quatro já então é 1 GB e me só de trad fora o que a a aplicação
ela de de memória fora o que os outros processos estão consumindo de memória então o recurso não é infinito justamente como o Maximiliano comentou ali e não dá para eu colocar quantidade de tred ou quantidade de cozinheiras como eu quanto eu quiser então por isso a gente tem que colocar 10 e aí é por isso que vem essa cara das virtual trads Qual que é a pegada da virtual trad a virtual trad ela é uma trad absurdamente leve eu não tenho esse esse esse trade off né esse esse ônus de pesar 3 4 megas mas
em paralelo a isso eu também não tenho o poder da da do paralelismo que eu tinha antes então qual que é qual a diferença na analogia do do restaurante né Agora eu tenho 10 cozinheiros só mas eu tenho 100 mesas eu tenho 1 milhão de mesas Mas como que eu consigo atender a todos cada cozinheiro vai pegar uma quantidade de pedido sei lá 100 pedidos né nessa hipótese nessa nessa nesse conto nessa conta de de 1 milhão de mesas e ele vai vai trabalhar em concorrentemente em cada um dos pedidos então ele pega o primeiro
pedido eh e aí põe o hambúrguer na chapa vê o segundo pedido põe a maionese no pão vê o terceiro pedido põe o hambúrguer na chapa e vai fazendo concorrentemente cada um dos pedidos de pouquinho em pouquinho eh e aí no fim das contas a gente consegue ter um um baita ganho aí já que eh eu não não tenho qualquer problema com com memória tentando colocar cozinheiro demais não tem nenhum problema de espaço e e o que que fez com que o a jvm pudesse ter isso eh a grande sacada foi justamente eu comentei lá
no começo foi a rescrita de todos os lugares que fazem io dentro da linguagem né dentro da jvm então todos os linguagens que fazem io eh foi sobrescrito para entender que ele é um virtual thread e antes de bloquear a trad principal Na verdade ele solta a trad principal e minra essa continuação para quando de maneira assíncrona e não bloqueante eh esse a eu finalizar ele jogar pro final da fila né A gente passa a trabalhar e com um reactor pattern ou seja cada trad do sistema operacional trabalha com eh uma fila de virtu mesma
hipótese do cozinheiro Ele trabalha com uma fila de pedidos eh e aí conforme vai operando por essa fila ele vai fazendo cada eh cada ação no nosso mundo de servidor web de aplicações web eh seria o equivalente a toda vez que o cozinheiro for fazer um uma coisa diferente tiver que esperar né ou seja ele pegou um pedido eh e ele vai vai ver que ele precisa colocar o hambúrguer na chapa ele vai põe o hambúrguer na chapa só que ele não vai ficar esperando o hambúrguer ficar pronto às vezes vai ficar vai demorar 3
minutos para Hamburger ficar pronto na chapa Então nesse tempo ele começa a trabalhar outro pedido ah Qual que é o pedido próximo pedido pô agora nesse aqui eu preciso passar a maionese no pão então passo a maionese no pão depois disso ele põe o pão na chapa e invés de ficar esperando o pão ficar pronto na chapa Ele tem 10 segundos ou 1 segundo sei lá para trabalhar outro pedido que é colocar outro outro hambúrguer na chapa sabe então ele começa a fazer vários pedidos sem ter que ficar parado esperando o que antes ele pararia
para ficar esperando o pão por um minuto aí depois o hambúrguer por 2 minutos e não conseguiria trabalhar de maneira concorrente nesses pedidos né Eh então vamos ver se se funcionou na prática aqui vou subir de novo a minha aplicação agora eu só tenho eu continuo com os 10 cozinheiros Tá mas eu vou rodar aqui ó eh todas as minhas trads vou rodar todo o meu meu teste de stress com 40 usuários concorrentes ou seja 40 Wild TR infinito fazendo requests e a gente já consegue ver que a parada tá funcionando de maneira bem rápida
rápida né então é fantástico é a forma como ele trabalha e Olha como a latência ficou bem mais controlada tá vendo ó O p95 ficou em 300 msos ó Ou seja é o máximo que demorou o máximo de request que demorou foi 800 MS lá no outro tinha sido 2 segundos o p95 né ou seja 95% das minhas requests foram abaixo de 95 de foram abaixo de 300 msos que é um tempo de resposta muito bom que inclusive é o tempo de resposta que eu coloquei lá como como latência tá vendo ou seja tá muito
perto da da da própria latência que a gente colocou né E ó quantas reques por segundo a gente respondeu a 63 né Então tá muito bom a gente já não tem mais aquele gargalo que a gente tem de ficar enfileirando e dá para melhorar ainda mais esse número se eu colocar aqui ó eh sei lá 40 igual a gente tava testando E reiniciar meu servidor de novo Eh dá pra gente até vir aqui no nos usuários colocar sei lá 100 usuário e dormir por 02 ó agora vai agora vai uma cacetada né agora vai destruir
ó Opa até nem ten usuário suficiente para isso né tenho tenho que diminuir um pouco a quantidade de usuários acho que eu tenho sei lá 60 usuários vai 60 vai 60 vai agora fil a quantidade de request por segundo vai subir absurdamente eh tô dormindo bastante pouco para cada uma da dos usuários a l tem que tá um pouco alta diminuir vai continuar vai conseguir responder a muito mais request ainda e o a latência vai continuar controlada porque eu aumentei a quantidade de cozinheiros que a gente tem ó então a latência tá ainda super controlada
o Max até ficou bem melhor antes tava 800 né agora tá tá no basicamente e descontando os 600 de latência Demorou 36 msos né que é o que é o tempo que de fato enfileirou essas equs né do do cozinheiro mas ele conseguiu atuar de uma maneira muito rápida e Olha quantas requests por segundo a gente tá respondendo ó ó se a gente fizer vez 60 é quase 7.000 RPM numa única máquina né então é isso agora a gente tá concorrendo pau a pau com o go leng do ponto de vista de coroutines eh bacana
o Anderson fez alguma perguntinha ali ó eh os driv jdbc já possuem versões com suporte a virtual trads cara hipoteticamente né Teoricamente na verdade eles não precisam se preocupar com isso porque como eu falei né era um projeto muito ambicioso e a todos os lugares que fazem io nativo na linguagem né da jvm do Java eles reescreveram esses essas Pontas de io para que nesses momentos eh esse I eu saiba lidar com a virtual thread então todo mundo que construiu biblioteca driver qualquer coisa em cima disso não precisa se preocupar já vai estar por padrão
nativo na linguagem né finalmente que era uma das principais dores das cortines do cotlin né porque eles não tinham na linguagem Então tinha que ficar fazendo e tinha que ficar fazendo outras maracutaias para poder suportar isso certo Leon que que você achou muito louco cara muito louco só que aí vem uma pergunta que não quer calar eu acho que todo mundo que já trabalhou com Spring já utilizou o webflux e aonde inclusive ot acabou de mandar al a pergunta aonde que entra então webflux nessa jogada aí quando a gente tá trabalhando com virtual trad é
diferente é igual que que é explica melhor isso aí perfeita pergunta Otávio basicamente isso tudo que veio com virtual threads e concorrência estruturada Vai Pegar webflux e colocar na caixinha e guardar e vai tornar desnecessário webflux n programação né esse paradigma ele só vai ser necessário para casos de uso muito particulares onde você tem um streaming de dados e precisa operar sobre esse stram né que é um uma quantidade de dados infinita que você não tem controle e aí você precisa ficar operando sobre ele manipulando ele e devolvendo para outras fontes eh e obtendo continuar
processando esse stream né então vou te dar um exemplo hipotético aqui sei lá o caso da da Netflix por exemplo aonde você começa a fazer a leitura de um vídeo eh dentro de um repositório sei lá do S3 você lê byte a Byte para cada um dos bytes você constrói uma pipeline de operação ou seja verifica se não tá corrompido depois constrói a tradução depois faz não sei o quê nesses cenários a programação reativa ainda vai funcionar muito bem mas é um cenário muito muito muito border tá tanto é que a própria Netflix tá saindo
fora de programação reativa e a grande maioria lá tá usando servlet normal e e agora com o virtual threads Então não vai fazer totalmente desnecessário o uso disso né então Eh com programação reativa a gente conseguia obter esse mesmo resultado que eu tô mostrando para vocês com o virtual threads a principal diferença é que a gente tinha que sujar todo o nosso código com uma construção que não era da linguagem eh Apesar de que a linguagem passou a ter depois Java 11 se eu não me engano eh e bastante complexa então a curva de aprendizado
pros novatos era era bem complexa fora fora a quantidade de de abertura Memory leak que sug gerava tá eh dada a complexidade se qualquer qualquer trad bloqueada do event loop do Nery por exemplo você tinha um memory leak você tinha que desabilitar muita coisa como por exemplo nelic tinha que desabilitar instrumentação porque atrapalhava na performance então assim era uma parada muito complexa de se lidar em em empresas Ou times que não eram tão eh tão assim tá show de bola show de bola show de bola E aí pessoal curtiram bom falta calma aí falta uma
única parte aqui que eu quero mostrar para vocês cada que a gente tem aqui então a gente vai construir aqui agora um último metodo Zinho dentro do nosso crud de usuários que é o listar todos Tá então vamos lá no todos antes da gente fazer vamos fazer o caso de uso Deixa eu ver se eu já criei ele acho que não não criei vamos fazer o caso de uso aqui então Ó list users esse nosso caso de uso ele vai basicamente chamar o All users ele não tem input e ele vai ter sim um output
aqui acho que ele tá importando Deixa eu só ver beleza ele vai ter esse cara aqui acho que eu copiei quando dei alguma coisa errada deixa eu ver output deixa eu ver onde foi colado esse cara Acho que ele tá dando algum problema aqui dentro vamos dentar o código beleza hum não ah tá eu apaguei o apaguei esse cara aqui show de bola users e aí eu vou ter que fazer um stram aqui né Vamos mapear esse cara para e para o output e ele vai devolver uma lista de output né então it melhor output
2 P 2 p New list aqui aqui beleza então e já estou devolvendo aqui esse output e ele não tem nenhum input show de bola e esse list users a gente vai ter que declarar ele aqui também né Vamos fazer rapidamente aqui ó list users E aí Bin return New list users passando user repository aqui e aí aqui no nosso Controller a gente vai ter um Public list output do próprio list user aqui list users ele vai ser um get mapping né ele vai responder pro verbo HP get E aí eu vou criar aqui ó
o seguinte eu vou criar um request parameter n ou seja vou disponibilizar um parâmetro que ele não é obrigatório ele pode não vir e o default value dele é uma string vazia e o nome dele é ids ele é basicamente uma string ids aqui e aí ó se if id e empt se o ID for empt eu vou retornar dis P list ex trouxe ele PR cá não trouxe ele PR cá vamos trazer el para cá Private final list users colocar ali no nosso Construtor requir l users ou se tiver presente se se eu passar
os ids aí a brincadeira começa Ó vou expit esses ids por vírgula eh var ó AIDS e aí eu vou fazer aqui ó o seguinte ó eu vou iniciar um Na verdade eu nem vou iniciar um scope tá vou mostrar primeiro fazendo maneira gohor eu vou pegar um Executor P virtual trad Task Executor bar Executor eu vou iniciar esse cara nem precisava iniciar né eu poderia deixar lá no contexto lá em cima para ser reutilizado na verdade é até mais eficiente Private final Private static final Executor igual Executor service igual a isso aqui seja toda
vez que a aplicação iniciar ele já vai iniciar esse cara eu vou reutilizar o mesmo para todo mundo então Executor ponto eh invoke All E aí é basicamente que que vou fazer aqui ó vou converter todos os ids dentro para uma chamada eh pon map eh ID aqui eu vou passar pro Executor como um submit de um col que é basicamente chamar o meu get user.id passando New identificador aqui tá vendo Eh claro dá até dá até para encadear isso aqui de uma maneira até mais elegante ó se a gente fizer isso aqui ó ó
eh passando isso aqui A galera falou que não poderia faltar programação funcional né então ó primeiro eu instanci o input depois eu passo como um callable aqui dentro dele esse eh input isso input aqui eh acho que ele não vai deixar fazer isso aqui não tem problema mas agora com o input já criado eu não preciso ter mais esse aqui nessa linha né então já passo direto input aqui beleza e aí ao fazer o submit eu vou ter uma Future né Ou seja eu vou ter uma promessa de que isso aqui vai ser terminado Em
algum momento Então eu preciso colocar isso aqui para eh receber esse cara para depois fazer novamente ó futur p string.map f f pget para eu pegar o resultado final eh pon list e vou dar um return aqui E esse get ele eu posso até passar um um tempo de timeout inclusive mas eh tá tudo bem não vou passar nenhum tempo de timeout o que ele tá reclamando aqui só é porque ele lançou uma Exception né então preciso colocar dentro de um return get catch interrupted Deception deixa eu ver ah não execution Exception é execution Exception
E aí trow New runtime Exception aqui show de bola e aí eu preciso só converter o tipo da resposta porque eu est esperando uma resposta de list e ele tá me Dev vendo uma resposta de e de get Então seria New list list users output passando aqui o it pid it. email e agora sim eu garanto a compatibilidade entre eles que que é isso aqui que que que eu tô fazendo e qual é o problema dessa abordagem né Mas vamos vamos antes disso vamos ver funcionando vamos lá vou subir meu servidor de aplicação eh beleza
tá funcionando se eu tentar Opa Se eu tentar fazer um get nessa rota passando nenhum id não vai retornar nada se eu passar ID também não vai retornar nada eh inclusive obviamente né ele deu um deu uma Exception porque esse usuário não existe e lá no get user ele valida então o que que eu vou fazer eu vou rodar meu teste de stress aqui ó A6 para ele já criar uma base de de usuários para mim depois a gente usa esses ids que ele tá logando aí como eh como parâmetros Tá então vamos deixar ele
debulhando ali de de criar usuários show de bola beleza se a gente for agora no listar sem passar ID ó olha quanto retornou é vamos ver quanto você retornou aqui ó retornou 2000 226 é bastante coisa né que que eu vou fazer o seguinte ó eu vou copiar isso aqui vou jogar aqui para um um novo o novo arquiv besta só para só para eu utilizar para pegar os ids test beleza e aí eu vou usar aqui ó control G para ele selecionar vários e eu vou pegar um uma boa quantidade de ID aqui só
pra gente enviar como parâmetro da request lá beleza já peguei alguma uma quantidade boa vou logar aqui pegamos 100 né E aí eu vou selecionar todos eles para formatar então aí garotos Agora sim já temos os nossos ID aqui então se eu mandar aqui ó ID Igual essa penca de ID vamos lá para um Break Point aqui ó que que vai acontecer ó chegou aqui veio quantos aí di 106 para cada um desses caras eu vou submeter uma tesque nesse meu Executor Ou seja eu vou paralelizar quer dizer como eu estou eh utilizando um virtual
um virtual trad Executor eu chego a paralelizar porque e ele vai gerar para mim um Executor com se eu não me engano a quantidade de trads do Kernel que eu tenho igual a quantidade de cores na minha máquina ou seja minha máquina tem seis cores ele inicia seis threads então tenho seis níveis de eh seis trads de paralelização Mas a quantidade de concorrência vai ser absurdamente alta porque eu vou fazer 106 div por 6 ou seja cada trad vai trabalhar em 17 eh 17 Gets concorrentes aqui então eu vou deixar rodar né vou dar F9
aqui ó vou até executar de novo ó em 15 m segos ele ele foi a ele gerou 106 teses e retornou para mim 106 vezes a chamada pro get user aqui Fantástico né E aí o que que eu posso fazer aqui ó para mostrar para vocês uma outra parada que é a concorrência estruturada isso tudo que eu tô mostrando para vocês não é concorrência estruturada tá ISO tudo que eu t mostrando PR vocês é é concorrência concorrência paralelismo das virtual mas Qual que é a pegada aqui a pegada é o seguinte se se eu fizer
isso aqui ó ele ele retornou uma um erro porque o primeiro cara que eu submeti retornou uma Exception só que as outras tarefas elas ainda estão funcionando lá no meu Executor Ele ainda não foi ainda não teve ele não foi abortado por causa de uma tesque que falhou ou se eu colocar Sei lá ela no final por exemplo vamos lá no final Cadê o final eu não tô conseguindo ver aqui mas Opa tá difícil de descer aqui não estou conseguindo ver Espero que seja no final Beleza eh não fez não fez uma diferença muito na
prática né mas o que acontece é ao ao dar o erro ele não aborta todas as tarefas ele vai continuar executando todas as tarefas até que todas terminem né E isso não é interessante no nosso mundo onde a gente quer operações atômicas Ou seja eu quero que tudo Funcione ou que uma parte funciona e é aí que vem a nossa querida concorrência estruturada dentro do Java 21 como preview ainda tá o que que é concorrência estruturada ao invés de utilizar um Executor dessa maneira como para mim eu quero que udo Funcione ou nada funcione né
ou seja ou retorne tudo ou não retorne nada a gente vai utilizar de uma nova construção chamada scope e new Como que chama scoped [Música] TK structur Task scope E aí eu posso dar um comportamento se eu quero que ele eh Shut Down no sucesso ou shutdown on failure e eu vou colocar aqui no caso shutdown on failure e pelo fato dele ser Auto closeable por isso que eu tô colocando dentro do try Ou seja quando ele sair do try ele vai encerrar isso aqui para mim e aí o que que eu mudo aqui na
prática né na prática eu vou usar esse scope aqui e vou dar um invoke nele ou melhor vou dar um fork nele e agora sim eu não preciso nem mais disso aqui tudo ó porque ele já é uma construção mais moderna então o que que eu vou fazer eu vou fazer um ponto get aqui até posso passar uma lâmbda né E aí eh eu vou depois retornar ou seja até ficou bem mais syntax shugar e qual que é o principal benefício que tá um pouco difícil de mostrar para vocês na prática mas o principal benefício
é se uma dessas teses que eu submeti falhar ele já vai encerrar todas as que não foram executadas ainda ou seja falhou tudo de uma vez Então vamos dar um restart do Servidor e Ou seja eu já finalizo e limpo memória e limpo uso de CPU desnecessário se eu agora a gente vai ter que fazer tudo de novo que eu fiz né então vamos lá ter que deixar os usos sendo criados por 20 segundinhos acho que 20 segundinhos é até demais né Acho que já dá pr gente apagar isso aqui tudo já faço um get
aqui ó já obtenho eu tenho certeza que já vai ser uma quantidade muito boa Cadê aquele que VM o teste que eu tinha criado aqui ó teste já vou pegar todos os ids aqui beleza aí agora eu vou Opa 86 vamos subir lá em cima para colocar uma vírgula e voltar e aí lá no final eu vou colocar 1 2 3 ou melhor no final não vou pôr na metade ó na metade aqui 1 2 3 que é um ID que não vai existir e se eu vier aqui colocar ID igual colocar tudo isso aqui
e enviar né vou até p um Break Point lá pra gente ver ó pum vai cair aqui a mesma coisa que a gente já fez né só que agora a gente tá usando concorrência estruturada ou seja ele é atômico se um falhar ele já falha tudo e principalmente fala falha os que não executaram ainda E aí se eu der eh Execute ele com certeza vai dar o mesmo erro né porque o 1 2 3 não tem mas a grande diferença é que eh ele já falha tudo de uma vez deixa eu ver eu consigo mostrar
de alguma maneira para vocês mas eu acho que não dá eh não vai ter como eh você vão ter que confiar no no pai se eu colocar aqui 1 2 3 cadê 1 2 3 agora hein agora para achar 1 2 TR fazer o seguinte vou colocar colocar aqui de novo 1 2 3 aí eu tiro 1 2 3 e aí eu volto aqui e aí op Será que owner did not ah tá claro eh faltou obviamente uma parada muito importante que é o seguinte é um must have chama o join e o throw if
failed por quê Porque o join eh [Música] ele ele vai fazer com que essa minha trad aqui né Essa essa minha trad virtual fique bloqueada até que tudo termine e uma vez que tudo terminou eu chamo o get aqui né Vamos vou ter que fazer de novo subir o servidor eh para todas as corras control alt shift J Opa obrigado pela dica detonador vou rodar o meu teste de stress aqui de novo para ele gerar os ids vou até limpar isso aqui local hostent bar user vamos ver quantos já tem aqui de boa fazer a
mesma coisa colocar aqui contol G vamos selecionar bastante selecionar mais agora ó tem mais de 1000 hein V selecionar mais acho que tá bom 180 beleza como é que é cont comand o meu é he comand Alt no caso é option n com option shift jol Option shift j e deu certo não hein vamos vamos seguir aqui ó é que eu não quero selecionar tudo né Eu quero selecionar eu quero colocar um coisa só para por linha Beleza agora aqui ó aí dis igual a pá cacetada ó tá vendo continua funcionando né ou seja agora
eu busquei só os ids que eu queria deve ter 189 E olha como ele é absurdo né ele paralelis assim no nível absurdo e concorrentemente trouxe 180 E aí se eu colocar um aqui ó 1 2 3 colocar esse cara ele já falha todos de uma vez por quê Porque no primeiro que falhar ele já vai pausar os restantes nem vai executar já vai descartar aquilo tudo e já vai falhar tudo de uma única vez aqui para mim né então Essa é a parte da concorrência estruturada que eu queria mostrar para vocês e só para
finalizar aqui eh eu não vou chegar a implementar 100% mas eu queria mostrar para vocês uma uma parada bem legal que é é o seguinte ó eh que eu já mostrei aqui para vocês mas agora vou deixar para subir junto do do código fonte Então vamos supor que eu tenho aqui os gats né eu tinha falado aqui a gente I construir m de pagamento Então vamos criar aqui um payment ó um Smart payment Gateway ele é uma classe eh e aqui em cima a gente tem por exemplo payment Gateway que ele é na verdade uma
interface lá no nosso domio a gente vai ter também ó payment methods que ele é uma interface selada E aí aqui dentro eh ah para trabalhar com seed interfaces e seed classes não preciso necessariamente e usar o permits tá o permits é só para quando eu quero permitir uma classe que tá fora aqui mas eu posso declarar aqui dentro também aí eu não preciso do permits então por exemplo credit card implement payment method E aí eu poderia ter também por exemplo sei lá Record implements payment method ou seja ele fica mais SX shugar né então
ó pix Double amount e só o credit card tem string Brand Double amount e in installments né que seria o parcelamento e aí no nosso Smart gatway por exemplo ele aqui no na interface ele vai ter o que a gente já conhece bem né então ó Public output Execute input E aí Record output Public também e o input E aí o input Na verdade ele vai receber um payment method e o output ele vai devolver uma string transaction ID ID aqui como interface não prisa dos P Na verdade lá no smart payment ele vai implementar
esse cara por exemplo e ele vai ter Eh esses valores como a gente tá trabalhando com sei lá a gente pode supor vamos supor que a gente trabalha com múltiplas adquirentes Então dentro de Gates a gente pode ter por exemplo Visa Gateway ele implementa o payment Gateway também né então aqui ó pum eh a gente pode ter por exemplo Mastercard Gateway que implementa o payment Gateway E aí a gente pode ter o pix Gateway né então ó pix Gateway que implementa o payment Gateway também o Smart Gateway ele vai precisar saber lidar com todos esses
caras né E aí como que ele pode lidar com eles junto do que a gente aprendeu com os Switch expressions né E aí payment method aqui e aí cas credit card CC ou seja credit card when CC Brand equ equals Ignore Case Visa deixa eu até fechar isso aqui ó New Visa Gateway E aí não nem retorno né var Gateway cas credit card when Brand e na verdade o certo é inverter isso aqui tá masterc vamos inverter para evitar qualquer tipo de New Pointer Exception aí ele vai instanciar basicamente o Mastercard Gateway pi cas payment
method ppix por exemplo aí seria basicamente New pix Gateway eh deixa eu sber o que ele tá reclamando aqui tá e Beleza deixa eu ver se eu só preciso de um else ao does not cover All possibilities que mais que eu tenho de payment meod credit card e PX Ah claro ó é porque como eu fiz o o eu preciso também ter um caso pô e se não for nenhum um desses né Eh se for um se for um payment meod do tipo credit card mas não for nenhum do Visa ou mastercar por exemplo aí
a gente pode colocar sei lá por padrão vai Visa Gate Eh Ou até poderia ter um outro eh se não for vai ser o sei lá elat e aí a gente iria voltar aqui e El Gate E aí agora sim nos gateways a gente vai chamar o Execute passando o mesmo input e fazer o return desse cara então agora sim eh o gate também é Command o gate também o gate não necessariamente pra ser comod não tá eh eu deixei assim mas eh não precisa ser ser gid de comando não poderia ser sei lá perform
transaction não tem problema eh e agora sim eu posso comitar né Agora Sim chegamos no final eh porque eu queria deixar para vocês um exemplo concreto de como utilizar um Switch com o en né e aqui tá um exemplo concreto né então é credit card E se for Visa vai pro Visa Gateway se for Mastercard vai pro Mastercard Gateway se não for nenhum deles aí pro Elo ou então vai pro pix e a a grande sacada aqui ó que eu consigo subir meu servidor sem quebrar nada mas a grande sacada é que se eu eventualmente
vier amanhã lá nos os meus payment methods por exemplo e adicionar um novo né sei lá amanhã a gente vai vir o eh credits account account credits né que eu tenho de eu tenho no na minha conta por exemplo eí tentar subir o meu servidor eh não vai rodar não vai compilar porque eu preciso colocar ele nesse Switch aqui que é o que a gente conheceu eu vi já viu como exhaustive check Então vou tirar esse cara aqui só mas é isso Leona chegamos né só pra gente finalizar aqui vendo esse cara ó que a
gente já viu aqui ó a gente viu quase Praticamente tudo isso aqui essa parte de named patterns e variables e a Sequence collections e não tem muito segredo Sequence collections é só uma interface Extra que adicionaram eh depois da da list por exemplo Então se a gente entrar aqui ó na [Música] list pon Class agora ela implementa ela estende Sequence collections tá vendo Sequence Collection mas interface que tem facilitadores como first AD last revert Se não me engano reversed para operar coisas que não tinh antes antes era meio ruinzinho de fazer isso mas agora muito
mais fácil e a parte de uned pattern e variables e uned classes e instance methods é basicamente a gente chegar lá no nosso querido M nozão da massa que era super verboso e tirar tudo isso aqui e tirar tudo isso aqui agora a gente vai poder ter esse tipo de men aqui ó só que o intelig ainda não tá dando suporte Pelo que eu entendi Pelo que eu vi e então a gente poder ter um M assim ó e também ter o o m fora inclusive né e sei lá se a gente não quisesse ter
esse cara aqui vai poder ter M fora vai poder ter métodos voando se eu não me engano mas é isso galera E aí o pessoal tanc vi que caiu bastante quantidade de de de pessoas assistindo né uma live bem fores agora bem longa bem complexa mas eu acho que deu para passar bastante das coisas do do j21 e das novas coisas que estão por vir aí né isso aí cara foi animal muito bom mesmo Obrigado aí pela pela aula e vamos para algumas dúvidas aqui será que a galera ainda aguenta ficar mais um pouquinho aqui
com a gente vamos lá deixa eu selecionar aqui tem ver duas duas dúvidas a primeira é do curso full cycle né curso full cych vai ser atualizado para Java 21 espring 3.2 galera a resposta é com certeza a gente tá com algumas ideias aí para 2024 não posso dar muito spoiler mas vai vir bastante coisa interessante tá dentro do curso cycle vai vir também alguns projetos que vão envolver Java também só que também já já está sabendo aí mas por enquanto vamos deixar no ar aí e temos aqui também a pergunta do programação já usando
as virtuais trads no caso a gente não acaba ter terceirizando o gargalo pro pull de conexões do banco de dados Ahã você responde ou respondo posso posso responder eu parei de apresentar aqui só para não ficar para poder ver vocês de frente aqui belza e vamos lá eh sim na verdade sim é algo que tem que ser levado em conta tá não que vai ser um gargalo né não que se torne um gargalo eh mas o p threads naturalmente ele já funciona como se fosse um book book head pattern né Eh ele limita a quantidade
de paralelismo que a gente vai ter né então isso precisa ser assim levado em conta não vai dar para abraçar o mundo aí porque senão o gargalo se torna o nosso banco né Eh mas assim como funciona em goang por exemplo que a gente também tem P de p de conexões lá eh vai funcionar do mesmo jeito aqui né A diferença é que a gente não vai conseguir Pô paralelizar o infinito se tratando de banco de dados se for se tratar de uma chamada para outra apepi aí pode aí é o problema da outra epi
eh tem que tomar um cuidado só com o Deny of service aí mas pro banco de dados eh e o banco de de dados ele o p de conexões não funciona com trads né ele funciona com justamente conexões que como o banco de dados responde absurdamente rápido sei lá não deveria passar de 5 6 milos uma uma query e isso contando já com tempo de latência né e a gente consegue ter um grau de concorrência absurdo que se você pegar ó em um segundo por exemplo e tem 1000 msos se a gente dividir por 10
vai vamos supor que demorou 10 a gente consegue fazer 100 queries por milissegundo Ou seja é um grau de paralelismo muito grande Tá então é difícil o banco virar um gargalo o que mais pode acontecer é a gente derrubar o banco se você não ficar não configurar direito a quantidade P de conexões aí show show de bola Ah sim vou atualizar os vídeos da FS lá do curso para Java 21 com certeza isso tá tá no Road Map Word map isso aí Ah o Bruno perguntou aqui Swap Ahã se existe algum outro material para estudar
ou somente as documentações ali oficial da Oracle J cara eh tudo que eu me baseei Aqui foram eh foram através das documentações oficiais aproveito para compartilhar com vocês esse vídeo aqui do que foi um dos que eu também vi que tem bastante coisa eu não se eu vou te mandar no chat privado aqui Leão você consegue compartilhar aí para eles Claro Manda ai ó mandei no chat privado aqui esse vídeo ele não tem eh exemplos de código né como eu mostrei para vocês mas mostra um pouco do Panorama de da onde que queremos chegar com
a com a jdk eh e é tudo no Com base no YouTube e documentação da própria oraco mesmo né não tem eh não tem muito outro lugar vou vou compartilhar também outro documento ó que vocês podem encontrar vários exemplos focados nas features do Java 21 tá ó vou colocar aí no privado para você também da uhum e pessoal eh se ficou com vergonha de fazer a dúvida aqui no no chat pode me mandar lá no Instagram também eh isso vai me ajudar bastante inclusive Para para que eu consiga ter ideia de conteúdo para gravar Java
aqui pro canal que é uma das coisas que a gente tá querendo trazer também eh hoje a gente tem muito go muito node eh mas muito em breve vocês também verão vídeos meus aqui no canal da full cyle falando de Java né E e aí essas dúvidas que vocês mandaram lá no Instagram @ Deploy underline de sexta vai me ajudar a pensar nesse eh em vídeos mais assertivos do que vocês precisam show de bola bom então gente para nós finalizarmos aqui vou vou colocar o QR Code agora tá na tela e enquanto QR Code tá
ali vocês apontem a câmera vai lá pegar os seus pontos suak quiser dar as últimas palavras falar onde a galera também pode te encontrar aí LinkedIn Instagram redes sociais e tudo mais Opa Claro eh bom l no Linkedin tá como Gabriel suak né o meu nome fica à vontade para me adicionar lá eh ou adicionar ou seguir eh normalmente vem muita gente vem com dúvidas também eu sempre tento responder todo mundo mas às vezes a latência fica um pouco o sla tá um pouco alto né eu também tenho o meu trabalho principal tenho as aulas
da full cycle quando dá eu tento responder eh mas eu normalmente respondo mais rápido no Instagram que é um pouco eu eu vejo com mais frequência Então quem puder quiser seguir lá @ depla como eu comentei e lá sempre também tento Abrir caixinha de perguntas sempre tento interagir mais com vocês eh então e vejo vocês lá tanto no no Instagram quanto no no Linkedin Eu tenho um canal no YouTube aqui também mas eu só tenho um vídeo né mas quem quiser seguir também aí mas acho que o foco vai ser o canal da fus mesmo
show de bola pegaram aí pessoal QR Code ó o Ah o Jackson Lima tá perguntando aqui ó vagas no Mel somente pelo LinkedIn as vagas do M são pelo LinkedIn cara eu também sempre tento postar lá no grupo de e novidades que eu tenho no Instagram eh que é tipo aqueles grupos de Instagram lá no próprio na própria ferramenta eu sempre Poo lá quando tem vagas novas e de bootcamp principalmente né Acho que as que hoje as pessoas mais estão afins são essas de Boot Camp né que você entra meio aqui como Júnior eh e
aí faz passa por uma imersão lá da das tecnologias que a gente US no mel e as pessoas que são muito boa sabidamente sobem de cargo né Eh mas principalmente pelo LinkedIn e pelo site né jobs.mercadolivre.com legal sobre BFF tá Luiz vai est junto com a gente falando so backend for frontend aguardo todo mundo lá conosco de novo amanhã vai começar também o mesmo horário aqui a gente também vai mandar e-mail Fica tranquilo tá resgatem os pontos não esqueçam disso e muito obrigado a Gabriel que ficou ficou aqui com a gente até quase 11 horas
da noite só os fortes estão aqui ainda Obrigadão cara pelo conteúdo pô Eu que agradeço a oportunidade aí Dana obrigado por ter confiado em mim Aí Tamos junto cara bua Tamo junto galera abração para vocês tá aguardo vocês amanhã então vff a partir das 8 horas não é isso isso aí beleza abraço pessoal tchau tchau valeu suak n