| 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.
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:
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.
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.
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.


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

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

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
https://learn.microsoft.com/pt-br/aspnet/signalr/overview/getting-started/introduction-to-signalr