Criar Serviço com Grails
26/05/2016 10:27
0
Galera, bom dia!

Estou com um problema... eu preciso fazer um serviço no grails onde o mesmo fica monitorando um diretório da rede.

Nesse diretório eu vou receber arquivos via FTP de clientes e quando o arquivo cair nesse diretório eu preciso processar o mesmo e gravar no banco os dados, mas isso pode acontecer a qualquer momento do dia e o arquivo tem que ser processado assim que for jogado no diretório, então esse serviço de monitoramento e processamento tem que ser feito automaticamente pelo sistema sem precisar de um usuário para dar um start.

Tem como fazer isso em grails?
Tags: Grails


0
Bom dia Danillo, tem como vc fazer isso em groovy sim , mas na minha opinião vc deveria usar um ferramenta que faz bem esse tipo de integração como o framework apache camel o site dele é http://camel.apache.org/, com e este framework vc vai consegui fazer essas integrações alem de conseguir fazer isso usando boas praticas  
26/05/2016 12:29


0
E com esse apache camel ele cria um serviço dentro do meu sistema ou tenho que desenvolver algo a parte para isso?
26/05/2016 13:10


0
o apache camel so usei em java e não sei como ele vai se comporta no grails, mas ele deve ter um plugin para grails
26/05/2016 13:33


0
Se o que você quer e monitorar um diretório da uma pesquisada sobre Spring Task Execution and Scheduling, com ele você pode criar uma task e agendar para executar de X em X tempo e verificar seu diretório de tiver um arquivo você o processa. Outra alternativa e usar o plugin do Quartz.
27/05/2016 07:54



1
Tudo e feito dentro da sua aplicação.. o Spring Task e um recurso do spring que já vem incluso no grails basta você configurar e usa
27/05/2016 08:51


0
Para configurar basta você fazer o seguinte:
Dentro de grails-app/conf/spring/resources.groovy você adiciona o seguinte:
?beans = {
    xmlns task: "http://www.springframework.org/schema/task"
    task.'annotation-driven'('proxy-target-class': true)
}

Cria uma classe para implementar seu serviço, Ex:
?package service
import import org.springframework.scheduling.annotation.Scheduled
class LeitorDiretorioService {

  @Scheduled(initialDelay = 30000L, fixedDelay = 10000L)
   public void monitor() {
        // seu codigo para monitorar o diretorio
   }
}

O método monitor vai aguardar 30 segundos após o start do servidor e o spring vai executar o método a cada 10 segundos?
27/05/2016 08:58


0
Weibe,

Bacana, vou fazer alguns testes aqui. Muito obrigado pela ajuda!
27/05/2016 09:18


0
Muito bacana a solução pelo Spring Tasks Weibe!

Outra alternativa é usar o plug-in Quartz, mas tem a desvantagem de que você precisaria instalá-lo em sua aplicação, razão pela qual a solução do Spring Tasks é melhor


0
Mas qual vocês acham que seria a mais fácil de implementar?

Spring Tasks ou a Quartz??
30/05/2016 11:02


0
Sem sombra de dúvidas Spring Tasks, pois você não precisará se preocupar com dependências adicionais no seu projeto.


0
Danilo, concordo com o Kico sobre a escolha do Spring Tasks se tratando de simplicidade e facilidade na implementação, agora alguns detalhes você tem que tomar cuidado por exemplo se você tiver um exception em tempo de execução não tratada sua task vai simplesmente parar de funcionar.. o spring não se recupera, diferente de um job usando quartz. Outro ponto e a possibilidade de você fazer essa integração fora da sua aplicação grails, você pode criar um jar e fazer sua implementação usando Executors ou Thread mesmo, a vantagem e que se precisar de para e fazer uma atualização na sua task você vai parar somente seu jar nao a sua aplicação grails.
30/05/2016 12:49


0
Weibe,

Eu já fiz um projeto onde precisei fazer uma tarefa parecida e fiz um .jar separado para essa função. E realmente eu já tive que modificar o mesmo varias e varias vezes.. Mas eu fiz um while infinito para ficar olhando para o diretório, mas eu coloquei um Time apenas para percorrer a cada 5 segundos. Ele está rodando de boa, já faz alguns meses que não da problema, talvez não seja a melhor forma de fazer isso, mas o importante é que esta funcionando hahaha...

Obrigado pela ajuda!
30/05/2016 13:03


0
A ideia do Weibe de ter um processo indepentente para o processamento em lote é muito boa: costumo fazer isto em meus projetos.


0
Essa abordagem de ter o processamento em jar independente e que em uma atualização você não derruba toda aplicação web. Danilo um solução mais elegante para monitorar um diretório e usar por exemplo um File Observer, para ficar monitorando o diretório e quando tiver um evento neste diretório ele notifica sua app eu constumo usar o FileAlterationObserver da apache commons-io.

Exemplo http://andreinc.net/2012/06/30/writing-a-simple-file-monitor-in-java-using-commons-io/
30/05/2016 13:44


0
Recentemente precisei fazer algo com monitoramento de diretorios, mas em pascal (Lazarus), neste caso usei as apis do Windows, com a vantagem de que a aplicação era notificada instantaneamente, com overhead mínimo.
Em Java/Grails daria para acessar isso, mas usando JNI. E, claro, criaria uma dependencia com um sistema operacional, o que pode ou não ser um problema.

Se o sistema operacional for windows, para rodar a aplicação (seja um jar standalone, ou um webapp) como serviço pode usar o projeto WinSW. Tenho um projeto em graisl que roda como serviço no Windows através desse carinha



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto