Apuntes
Aplicações Web Assíncronas
Contenido del apunte (16)
Página 1
Agenda
Nessa apresentação iremos discutir:
AJAX
A API ServletRequest com respeito a processamento assíncrono (asynchronous processing)
A interface AsyncContext
Página 2
Um breve histórico
No protocolo HTTP 1.0, cada nova requisição era alocada a uma nova thread.
Isso criava uma sobrecarga significativa e era muito ineficiente.
HTTP 1.1 criou "conexões persistentes" e Java 1.4 introduziu non-blocking I/O.
Página 3
Synchronous processing
As operações de I/O são geralmente demoradas.
No processamento sincronizado ( Synchronous processing ), o processamento dos dados espera a finalização dessas operações de I/O.
Isso faz com que os recursos do sistema sejam desperdiçados até que se finalizem as operações de I/O, o que é muito ineficiente.
Página 4
Asynchronous processing
Portanto, precisávamos de uma abordagem diferente, que foi chamada processamento assíncrono ou Asynchronous processing.
No processamento assíncrono, processos que necessitam realizar operações de I/O devem esperar enquanto outros processos que não necessitam realizar operações de I/O, completem seus processamentos.
Isso produz uma melhoria de velocidade e eficiência.
Página 5
AJAX
AJAX é o acrônimo para "Asynchronous Javascript API for XML".
As páginas web atuais possuem mais conteúdo e características e, portanto, levam mais tempo para carregar.
AJAX é uma maneira de se fazer "requisições em background" para o servidor.
Página 6
AJAX
No AJAX, o usuário não tem que deixar a página web quando uma requisição em background for realizada.
Pelo AJAX, somente certos elementos de uma página web serão atualizados em tempo real.
As outras partes de uma página web não serão alteradas.
Página 7
AJAX
Alguns exemplos da utilização do AJAX podem ser checagem de emails, Twitters na timeline, etc.
O cliente realiza regularmente um "poll" no servidor para saber se existem atualizações.
Estas checagens constantes oneram o servidor e portanto fazemos uso de um processamento assíncrono para usar as threads de modo eficiente.
Outros métodos envolvem o servidor realizando "pushing" dos dados em direção ao cliente quando houverem novas atualizações no servidor.
Página 8
Asynchronous Request API
Para habilitarmos o processamento assíncrono, nós primeiro devemos declará-lo no descritor de implantação ou como uma annotation.
Isso será especificado no DD como segue:
Página 9
Asynchronous Request API
Pode ser declarado como segue:
O fato de habilitarmos a capacidade assíncrona não irá iniciar instantaneamente a comunicação assíncrona.
Como padrão, o ciclo síncrono de requisição / resposta estará habilitado se todos os recursos estiverem disponíveis e não houver tempo de espera para aquisição dos mesmos.
Página 10
Asynchronous Request / Response Cycle
O ciclo assíncrono de requisição / resposta pode ser descrito como segue:
Uma vez que o método service for chamado, o método service do servlet apropriado será chamado.
O método service poderá então chamar o método doGet ou outros métodos ou então dispachar a chamada.
No decorrer do processamento, o método startAsync() será chamado a partir do objeto ServletRequest de modo a iniciar o ciclo assíncrono.
O método startAsync() retorna um objeto AsyncContext.
O objeto AsyncContext é um ambiente no qual os objetos ServletRequest e ServletResponse podem ser recuperados.
Página 11
Asynchronous Request / Response Cycle
Em um ciclo assíncrono, uma vez que o método service() original finaliza, o container ainda NÃO irá comitar e encerrar a thread.
Agora, a thread que realiza processamento executa em paralelo, utilizando o 'AsyncContext' obtido anteriormente.
Essa tarefa paralela poderá fechar os objetos request e response originais pela chamada ao método complete() do objeto AsyncContext uma vez que seja finalizado o processamento.
Poderá também chamar o método dispatch() a partir do objeto AsyncContext de modo a delegar processamento.
É importante lembrar que podemos utilizar dispatch() em requisições para componentes que não suportam o processamento assíncrono.
Página 12
ServletRequest API
A seguir veremos alguns métodos que foram adicionados à API ServletRequest de modo a suportar o processamento assíncrono:
boolean isAsyncSupported() - Verifica se a requisição suporta operações assíncronas.
boolean isAsyncStarted() - Verifica se essa requisição foi posta em modo assíncrono.
AsyncContext startAsync(ServletRequest, ServletResponse) - Coloca a requisição em modo assíncrono, inicializando o objeto AsyncContext com os objetos ServletRequest e ServletResponse passados ao método.
Página 13
ServletRequest API / AsyncContext
AsyncContext startAsync() - coloca essa requisição em modo assíncrono, inicializando seu objeto AsyncContext com os objetos ServletRequest e ServletResponse originais não empacotados.
AsyncContext getAsyncContext() - obtém o objeto AsyncContext que foi criado ou reinicializado pela mais recente chamada a startAsync() ou a startAsync(ServletRequest,ServletResponse) nessa requisição.
Agora veremos a interface AsyncContext
Como pudemos ver, a interface AsyncContext será utilizada para realização de processamento assíncrono.
Página 14
Interface AsyncContext
Será utilizada para se obter dados de requisição ( request data ) e enviar a resposta, chamando o método complete() para comitar a resposta.
Os métodos da interface AsyncContext são:
ServletRequest getRequest() - obtém o request que foi utilizado para inicializar esse objeto AsyncContext pela chamada ao método ServletRequest#startAsync() ou então ServletRequest#startAsync(ServletRequest, ServletResponse).
ServletResponse getResponse() - obtém o objeto response que foi utilizado para inicializar esse objeto AsyncContext pela chamada ao método ServletRequest#startAsync() ou então ServletRequest#startAsync(ServletRequest, ServletResponse).
boolean hasOriginalRequestAndResponse() - retornará true caso o objeto AsyncContext tenha sido criado com os objetos request e response originais da requisição ( através da chamada ao método startAsync() ) ou false caso contrário.
void setTimeout(long miliseconds) - Configura o valor de timeout ( em milissegundos ) para esse objeto AsyncContext.
long getTimeout() - Obtém o timeout ( em milissegundos ) desse objeto AsyncContext.
void start(Runnable task) - faz com que o container dispare uma thread, possivelmente para uma fila de gerenciamento de threads, de modo a rodar task especificada.
void dispatch(String path) - Despacha os objetos request e response desse AsyncContext para o recurso mapeado pelo caminho path.
void complete() - Completa a operação assíncrona iniciada na requisição (objeto ServletRequest) utilizada para inicializar esse objeto AsyncContext, fechando o objeto ServletResponse que foi utilizado para inicializar esse objeto AsyncContext.
É importante se lembrar das assinaturas desses métodos assim como das suas funções.
Página 15
AsyncListener
O objeto AsyncListener é registrado no objeto AsyncContext, utilizando-se o método addListener()
O objeto AsyncListener possui quatro métodos:
Esses métodos seguem o ciclo de vida de uma requisição assíncrona.
Página 16
Concluindo
Discutimos sobre:
Processamento síncrono e assíncrono
AJAX
ServletRequest API para processamento assíncrono.
Información
- Descripción
- Concursos Públicos (OCEJWCD 6 ONLINE COURSE) Desenvolvimento de Software Apunte sobre Aplicações Web Assíncronas, creado por Luis Felipe Guariento el 26/03/2018.
- Creado por
- Luis Felipe Guariento · mar 2018
- Actualizado
- 27 mar 2018
- Visitas
- 1
- Valoración