domingo, 7 de maio de 2023

Por que usar Windows Service? E como criar usando o Delphi?

 Por que usar Windows Service? E como criar usando o Delphi?

Esse artigo é um compilado de um post realizado no blog oficial da Embarcadero.

Você desenvolvedor já passou pela seguinte situação? Preciso rodar algum processamento em paralelo ao meu sistema.

Pois bem, existem algumas técnicas, como: criar uma aplicação console (que ficará startada pelo usuário), criar uma aplicação GUI minimalista, ou seja, com poucas (ou nenhuma) iteração do usuário ou criar um paralelismo no próprio sistema por meio de threads.

Qualquer uma das opções acima funciona, porém existem alguns riscos e dependendo do cenário onde seu sistema rodará não será tão eficiente essas abordagens. É por isso que venho trazer uma outra alternativa que seria criar uma aplicação para rodar como serviço do Windows.

O que são Serviços do Windows?








Serviços do Windows são programas que são executados em segundo plano, não necessitam de iteração dos usuários e normalmente são iniciados junto com o sistema operacional (isso é configurável, mas vamos pular essa parte por enquanto).

Só para título de curiosidade, aperta as teclas windows+r digite services.msc e pressione o enter. Você verá uma pancada de serviços em execução na sua máquina.

Quando usar uma Aplicação como Serviço?

Antes de você iniciar o desenvolvimento de uma aplicação do tipo serviço você deverá se perguntar:

  • Exigirá iteração do usuário final?
  • Terá um processamento massivo?
Tá Armandinho, mas como funciona uma aplicação serviço, poderia exemplificar?

Vamos lá, vou ilustrar o cenário que foi citado no artigo oficial: Imagina você ter que mandar um e-mail, as ações seriam:
  • Redigir a mensagem no programa
  • Clicar para enviar
  • Aguardar o status de enviado com sucesso
Essa ação de enviar, provavelmente terá uma aplicação rodando como serviço que irá aceitar e processar seu e-mail, fazendo todas as validações necessárias para no final enviar aos destinatários e te avisar que ocorreu tudo bem.

Mas nesse cenário comentado ainda teve a ação do usuário, que foi de redigir a mensagem e clicar em enviar. Porém existem casos em que não há nenhuma iteração do usuário. É nesse momento que entra em ação a nossa aplicação para o windows service.

Devo me preocupar com o usuário da Aplicação como Serviço?

Então como não terá iteração posso usar qualquer usuário para rodar a minha aplicação? A resposta para quase tudo na informática é: depende (kkkk). Se a sua aplicação precisar acessar algum recurso protegido pelo sistema operacional, tais como: pastas, arquivos e etc...Você precisará usar um usuário com tal permissão, caso contrário sua aplicação não terá êxito.


Armando posso ser mais chato? Me passa outro exemplo mais prático?

Claro. No artigo oficial o autor comenta sobre um utilitário que precisou desenvolver para verificar o espaço em disco do computador. Vou um pouquinho mais além: imagina um sistema ERP (Gestão Empresarial) ou um sistema de BackOffice, onde o usuário final solicite que ao finalizar uma operação o sistema mande uma mensagem por e-mail ou para o celular do cliente (push notification).

Temos várias formas de desenvolver essa feature. Usar processamento paralelo ou usar o envio de forma síncrona no próprio sistema (esse é menos eficaz - imagina o usuário ter que esperar a mensagem ser enviada).

O primeiro cenário até seria uma boa saída, mas já pensou se o usuário fechar o sistema no momento em que a rotina de envio estiver em execução? Você teria que realizar diversos controles na sua thread e traria uma complexidade desnecessária para o seu negócio.

É aí que vamos para o exemplo, criar uma aplicação para o windows service.

Vamos para o exemplo

Para criar uma aplicação do tipo Windows Service devemos seguir os seguintes passos:

  1. Menu File -> New -> Other
  2. Subpasta Delphi -> Pasta Windows -> Escolher o item Windows Service
  3. E por fim clicar em Ok











Logo em seguida o Delphi perguntará se você deseja habilitar os componentes visuais da sua biblioteca, podemos marcar que sim.










O Delphi criará o seu projeto com uma unit, onde sua classe estará herdando de TService.
Com essa classe podemos realizar diversas operações, conforme a imagem abaixo:


No nosso exemplo focaremos apenas em algumas principais: AfterInstall e OnStart.
No evento AfterInstall vamos apenas registrar no log que o serviço foi instalado com sucesso e no evento OnStart seria a lógica de envio de e-mail e/ou push notification.

Antes de começarmos com o código adicione no formulário principal o componente Timer, conforme a imagem abaixo:


Esse timer será o responsável de executar nossa rotina de tempos em tempos. 
Você poderia usar uma thread, aí ficaria a seu critério.

Para os eventos citados vamos codificar os seguintes trechos de código:


E por fim o código para gravar o log para testarmos o nosso serviço:



Como testar?

Após compilar o projeto, precisamos instalar o nosso serviço no windows. Para isso devemos executar o seguinte comando como administrador no terminal do sistema operacional: [nome_executavel.exe] /install




Lembra que programamos um código no evento AfterInstall? Nesse momento já podemos verificar se foi criado um arquivo texto no caminho "C:\"


Agora vamos startar o nosso serviço e verificar se o timer vai funcionar. Lembra como faz para abrir os serviços do Windows? Vou reforçar para você: apertar as teclas windows+r digitar services.msc e pressionar o enter.



Após iniciar o nosso serviço já podemos consultar o nosso log as operações que o time realizou. Note que na imagem acima os logs estão de 2 em 2 segundos, isso mesmo, foi o tempo que definimos no componente timer. Agora o seu é o limite.

Como Desinstalar um Serviço?

Muito simples basta executar o seguinte comando como administrador no terminal do sistema operacional: sc delete [nome_servico]

Postagem em Destaque

Configurando o Projeto Delphi para o SonarQube

  No post anterior expliquei como instalar e configurar o SonarQube com o plugin do Delphi . Neste post vamos configurar nosso projeto Del...

As mais visitadas