Veja neste artigo como criar uma Console App em .NET Core que roda no Docker com agendamento para cada 15 segundos com o CRON.

Serviços background

Aplicativos Mobile e Web Apps estão na moda atualmente. No entanto, dentro de ambientes corporativos há muito trabalho feito por serviços em segundo plano e tarefas agendadas.

Este artigo demonstra como aproveitar a portabilidade do .NET Core e ainda assim criar serviços que rodam em Background com o Docker.

architectural photography of Central station

Portabilidade

Sem dúvida o maior diferencial do .NET Core é a portabilidade do seu código para vários tipos de aplicativos e sistemas operacionais. Para atingir este objetivo, conta com uma framework portável para todos os SO's.

Então como aproveitar a portabilidade do código e criar um serviço Long Running ou que rode a cada intervalo de tempo? Há algumas respostas:

  • Background Services com ASP.NET Core
  • Plugin Hangfire para ASP.NET Core
  • Azure Functions
  • Console Application & Docker

Por que utilizar Console App & Docker

O Azure Functions possui um timeout padrão de 5 minutos. Pode aumentar para 10. Logo se você possui um serviço assíncrono, que monitora um evento, não será uma solução viável.

O plugin Hangfire requer um banco de dados. Onde cria uma estrutura de tabelas para controlar as tasks.

Todos os anteriores e o Background Services do ASP.NET será hosteado pelo IIS, embora viável, não foi projetado para ser uma alternativa ao Windows Service.

Isso não significa que eles não são bons e devem ser descartados. O desenvolvedor deve ter o discernimento para escolher qual a solução que melhor resolve o problema

Ao utilizar containers Dockers há ganhos significativos no gerenciamento e publicação. Independência do ambiente e de tecnologias específicas de Cloud, como o Azure Functions e App Services.

grayscale photo of man using laptop coding

SHOW ME THE CODE

Crie em novo projeto no Visual Studio do tipo Console App. (File > New > Project > .NET Core > Console App (.Net Core))

Substitua o código do Program.cs:

O programa é apenas um exemplo para gerar um arquivo de log e uma saida para o HEALTCHECK do docker.

O Visual Studio cria um arquivo Dockerfile de forma muito competente. Então click com o botão direito em cima do projeto e vá em Add > Container Orchestrator Support. (Versões anteriores podem ter apenas a opção Add Docker Support.

Em seguida selecione: Docker Compose > Linux.

O Visual Studio cria um arquivo Dockerfile pronto para buildar e rodar a aplicação num container. Porém é necessário efetuar algumas modificações para instalar e configurar o CRON.

O código acima atualiza o apt-get e instala o cron. O CRON é configurado com um Sleep de 15, 30 e 45 respectivamente. Isso é um trick para que o serviço rode a cada 15 segundos.

O HEALTCHECK irá validar se o Serviço está rodando conforme o esperado e não houve nenhum problema com o container.

Testando

Abra um console de dentro da pasta do projeto e use os comandos

docker-compose build
docker run <image>

O primeiro comando gera uma saida assim:

Successfully built f253c86ccbf7
Successfully tagged consoleappdockercron:latest

Este é o nome da imagem para ser substituido no comando acima.

Para saber se o sistema está rodando, pode utilizar o comando

docker ps

Se as execuções da Console App estão com sucesso, então o (healthy) irá aparecer na frente do STATUS.

Download

O código do projeto está disponível no meu GitHub

Feedback!

Me diga o que achou? Deixe teu comentário, suas impressões e vamos convesar!

update

O artigo foi publicado como não sendo possivel a criação de um Windows Service pelo .NET Core. Inicialmente não era, mas atualmente é possivel através do System.ServiceProccess.ServiceController. Devidamente corrigido o artigo pelo atento leitor Thomaz Moura.