Ir para o conteúdo principal

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.

image.png

image.png

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.

image.png

 

 

 

Criar a classe que representa o hub.

image.png

Registrar o serviço SignalR e configurar o endpoint de comunicação na classe statup.cs.

image.png

image.png

Injetar o serviço do hub para envio das mensagens de notificação no serviço desejado.

image.png

Enviar a notificação

image.png

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

image.png

 

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

https://learn.microsoft.com/pt-br/dotnet/csharp/programming-guide/concepts/async/task-asynchronous-programming-model