playframework-intro
Upcoming SlideShare
Loading in...5
×
 

playframework-intro

on

  • 503 views

Short talk dada na Qcon SP 2014. Mostra as funcionalidades básicas do Play, assim como algumas características que fazem ele ser o framework mais escalável do mundo Java atualmente.

Short talk dada na Qcon SP 2014. Mostra as funcionalidades básicas do Play, assim como algumas características que fazem ele ser o framework mais escalável do mundo Java atualmente.

Statistics

Views

Total Views
503
Views on SlideShare
449
Embed Views
54

Actions

Likes
2
Downloads
3
Comments
0

1 Embed 54

https://twitter.com 54

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

playframework-intro playframework-intro Presentation Transcript

  • O MÍNIMO SOBRE MIM ALBERTO SOUZA Instrutor e desenvolvedor pela .Caelum Escritor do , usuário forte do Play:) e commiter do VRaptor4. Livro PlayFramework naprática
  • SAINDO DO ZERO COM O PLAYFRAMEWORK NÃO VOU GARANTIR QUE É FÁCIL COMO DIZEM POR AÍ /alots.wordpress.com @alberto_souza
  • MÍNIMO PARA RODAR O PRIMEIRO EXEMPLO
  • DOWNLOAD DO SDK
  • CRIANDO UM NOVO PROJETO play new agendatech
  • ENTRANDO NO CONSOLE DO PLAY play
  • IMPORTAR PARA O ECLIPSE eclipse
  • SUBIR O SERVIDOR ~run
  • EXEMPLO DE ACESSO http://localhost:9000/eventos
  • QUEM TRATA?
  • ARQUIVO DE ROTAS!
  • GET /eventos controllers.EventosController.lista() #Mapstaticresourcesfromthe/publicfoldertothe/assetsURLpath GET /assets/*file controllers.Assets.at(path="/public",file)
  • packagecontrollers; importplay.mvc.*; publicclassEventosControllerextendsController{ publicstaticResultlista(){ List<Evento>instrutores=Eventos.paraAcontecer(); return//temqueirparaaview } }
  • publicclassEventosControllerextendsController{ publicstaticResultlista(){ List<Evento>instrutores=Eventos.paraAcontecer(); returnok(views.html.eventos.lista.render(aprovados)); } }
  • ISSO MESMO, INVOCAMOS UM MÉTODO QUE NOS RETORNA A VIEW!
  • @(lista:List[Evento]) @for(evento<-lista){ @evento.getNome() }
  • ROTAS E VIEWS VIRAM CLASSES!
  • E QUANDO TIVER UMA ALTERAÇÃO?
  • MEXA LIVREMENTE QUE O PLAY FICA ATUALIZANDO :)
  • DECISÃO SOBRE TECNOLOGIAS Jádecidiram algumas, vamos só olhar rapidamente
  • PERSISTÊNCIA Ebean JPA
  • publicclassEventosControllerextendsController{ publicstaticResultindex(){ List<Evento>eventos=Ebean.find(Evento.class).findList(); List<Evento>eventos=JPA.em().ah...UmaFormaFacil() returnok(view.instrutores.html.index.render(eventos)); } }
  • REFLEXÃO SOBRE MÉTODOS ESTÁTICOS
  • MANTER ESTADO NO CONTROLLER? QUAL O MOTIVO?
  • VOLTANDO PARA AS TECNOLOGIAS
  • PRECISAVAM DE UMA VIEW QUE FOSSE EM SCALA
  • PARA A VIEW, TWIRL
  • @(eventos:List[Evento]) @if(flash().get("sucesso")!=null){ <span class="msg_sucesso">@flash().get("sucesso")</span> } <ul> @for(evento<-eventos){ @detalhe_lista(evento) } </ul>
  • O AGENDATECH PRECISA TUITAR SOBRE OS EVENTOS
  • AKKA PARA TAREFAS ASSÍNCRONAS ActorRefactor=SystemActor.apply(SendTwitterActor.class); actor.tell(evento,null);
  • NECESSÁRIO PEGAR FOTOS LEGAIS SOBRE O EVENTO
  • API PRONTA PARA REQUESTS EXTERNOS WSRequestHolderrequester= WS.url("https://api.instagram.com/v1/tags/qcon2014/..."); requester.get();
  • E QUAL SERVIDOR VAMOS USAR PARA DEPLOYAR?
  • NETTY COMO SERVIDOR HTTP E A ESPECIFICAÇÃO DE SERVLETS?
  • RAZÕES PARA NÃO SEGUIR A SPEC Não precisar ficar criando adapter paraas implementações Como lidar com as respostas assíncronas?
  • MEGA VANTAGENS(REATIVO) PELO MENOS NA MINHA OPINIÃO
  • TUDO ASSÍNCRONO
  • VOLTANDO AO ASSUNTO SOBRE REQUISIÇÕES PARA SERVIÇOS EXTERNOS publicstaticResultultimasFotos(Stringhashtag){ WSRequestHolderrequester= WS.url("https://api.instagram.com/v1/tags/"+hashtag+"/..."); returnok(requester.get().get().getBody()); }
  • E SE O INSTAGRAM ESTIVER LERDO?
  • NÃO QUEREMOS SEGURAR A THREAD! publicstaticPromise<Result>ultimasFotos(Stringhashtag){ WSRequestHolderrequester= WS.url("https://api.instagram.com/v1/tags/"+hashtag+"/..."); Promise<Response>esperandoAResposta=requester.get(); esperandoAResposta.map(response->ok(response.getBody())); }
  • ESSA É UMA DAS CHAVES DO SUCESSO PARA SUA FELICIDADE, PODE NÃO SER SUFICIENTE
  • COLOCANDO MAIS SERVIDORES ESCALONAMENTO HORIZONTAL
  • E O USUÁRIO LOGADO FICA ONDE?
  • NO CLIENTE STATELESS PARA A VITÓRIA
  • SEM OBJETOS COMPLEXOS NA SESSION //nãocompila! session().put("infoDoUsuario",objetoUsuario); //agorasim session().put("infoDoUsuario",algumaChaveDoUsuario);
  • COLOCAR VÁRIOS SERVIDORES FICOU FÁCIL EXEMPLO HAPROXY backendservers balanceroundrobin optionhttpclose optionredispatch serverplay1127.0.0.1:8081 maxconn32 serverplay2127.0.0.1:8082 maxconn32
  • SEMPRE QUE UM EVENTO É APROVADO, ATUALIZA A HOME COMO FAZER?
  • MODO ANTIGO PINGS DE TEMPOS EM TEMPOS NO SERVIDOR
  • JEITO MAIS MODERNO
  • SERVER-SENT EVENTS REATIVO MAIS UMA VEZ!
  • AGORA BASTA FAZER O REGISTRO varfeed=newEventSource('@routes.AtualizaHomeController.registra())'); feed.addEventListener('message',handlerDoEvento,false);
  • PUSH NOTIFICATIONS objectAtualizaHomeControllerextendsController{ val(chatOut,chatChannel)=Concurrent.broadcast[JsonNode] defregistra()=Action{ Ok.feed(chatOut&>EventSource()) .as("text/event-stream") } }
  • E COMO PUSHAR INFORMAÇÕES? AtualizaHomeController.chatChannel() .push(Json.toJson(eventoAprovado));
  • FECHANDO!
  • GERANDO UMA DISTRIBUIÇÃO play dist
  • DEPLOY unzip agendatech.zip deploy/bin/agendatech
  • ALGUMAS EMPRESAS QUE JÁ USAM Coursera Linkedin Klout
  • LIVRO: BLOG: bit.ly/1hV0NMm alots.wordpress.com
  • OBRIGADO!/AlbertoSouza @alberto_souza