Processamento assíncrono na Geração e Publicação do DIOF
Data de elaboração | 31/10/2022 |
---|---|
Responsável pelo estudo |
Moisés Ferreira Evangelista (Assessor) |
Equipe do estudo | Caveiras |
Alvo | PPE - Plataforma de Publicação Eletrônica de Diários Oficiais do Estado de Rondônia. |
Origem |
Implementação |
Objetivo | Propor solução para que seja possível gerar DIOFs com infinitas matérias sem ocorrência de erros e/ou interrupções na requisição. |
Glossário
SignalR: ASP.NET SignalR é uma biblioteca para desenvolvedores de ASP.NET que simplifica o processo de adição de funcionalidade da Web em tempo real aos aplicativos. A funcionalidade da Web em tempo real é a capacidade de fazer com que o código do servidor envie conteúdo por push para clientes conectados instantaneamente à medida que ele se torna disponível, em vez de fazer com que o servidor aguarde um cliente solicitar novos dados.
1. Introdução
A geração e publicação do DIOF no sistema PPE hoje ocorre quando o usuário com perfil Administrador, sendo ele diretor ou diretor substituto, clica no botão Gerar. Então uma requisição é iniciada e muitos processamentos são realizados como:
- A Busca das matérias que estão agendadas para a data atual, exceto as que possuem a matéria reprovada ou aguardando reavaliação.
- Tratamento para manter a ordenação das matérias conforme a hierarquia de cada secretaria/cliente, observando a área de publicação de cada um deles.
- Geração do Pdf respeitando as regras de estilos do Diof e estilos das matérias de origem do SEI, do editor do PPE ou do GovDoc
- Atribuição do nome e cargo do assinante do DIOF entres outros processamentos.
Ocorre que, dependendo do número de matérias, o retorno da requisição ao usuário pode demorar bastante, em alguns casos a requisição é interrompida por exceder o limite máximo de espera (timeout). Esse estudo propõe uma solução para que seja possível gerar DIOFs com infinitas matérias sem ocorrência de erros e/ou interrupções na requisição.
2. Desenvolvimento
Atualmente já utilizamos métodos assíncronos que retornam Task ou Task<T>, porém o uso de await na chamada desses métodos faz com que a thread principal fique aguardando todo o processamento desse método concluir para que a próxima linha do fluxo seja executada.
2.1 Retorno imediato
O primeiro ponto é liberar o retorno da requisição ao usuário removendo o uso do await na chamada da história principal, que orquestra todas as outras. Com essa alteração o processamento continuará em segundo plano não sendo necessário aguardar a conclusão, liberando o usuário que rapidamente recebe o retorno da requisição informando que o processamento desejado foi iniciado e está em andamento.
2.2 Notificação do progresso do processamento ao usuário
Uma vez que o processamento continua em background é preciso notificar o usuário do progresso, para isso será necessário implementar notificação em tempo real com signalR. Essas notificações não precisam ser necessariamente de cada passo do progresso, a ideia geral é avisar o usuário do sucesso e termino do processamento ou de um possível erro e talvez possibilitar uma reprocessamento de uma determinada tarefa ou do processo como um todo.
Para implementação do SignalR será necessário realizar os seguintes passos:
Instalar o pacote da lib de acordo com a versão no framework conforme imagem abaixo.
Criar a classe que representa o hub.
Registrar o serviço SignalR e configurar o endpoint de comunicação na classe statup.cs.
Injetar o serviço do hub para envio das mensagens de notificação no serviço desejado.
Enviar a notificação
2.2 Receber notificação do progresso
Na view que mostrará o progresso do processamento ao usuário é necessário referenciar a biblioteca do signalr.js, preparar a conexão e conectar no mesmo método do envio, que nesse exemplo é o ProgressoDoDiof
3. Conclusão
Seguindo essa estratégia pode-se observar várias pontos que melhoram o fluxo de grandes processamentos e que devem ser iniciados pelo usuário:
- Será possível realizar grandes processamentos como gerar e publicar o Diário oficial do dia, sem a necessidade de aguardar a conclusão da tarefa.
- Possibilita o reprocessamento de uma determinada tarefa que falhou no meio do processo, já que é possível atribui ações em casos de falhas.
- Libera o usuário para realizar outras atividades no sistema não sendo necessário esperar já que as notificações além de serem envidas em tempo real também podem ser armazenadas na base para que posteriormente possa ser analisada pelo usuário
- Possibilita a geração do diário com inúmeras matérias, já que o tempo de processamento não é mais um impedimento
4. Referências (opcional)
https://learn.microsoft.com/pt-br/aspnet/signalr/overview/getting-started/introduction-to-signalr