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