Jump to content
Fórum Script Brasil
  • 0
Sign in to follow this  
gabrielanjos

(AJUDA) Ler novos arquivos texto ou incremento e fila

Question

Boa tarde, preciso de uma ajuda com o Perl. Primeiramente vou explicar o cenário já existente, onde está minha preocupação e o que eu precisava.

Eu estou realizando a integração entre dois sistemas, o primeiro sistema me permite executar um comando no shell do linux passando algunas variáveis, sendo assim, eu estou fazendo esse sistema em determinadas condições executar o script em perl que estou criando passando alguns parametros. Ex. "perl /caminho/do/script/meuScript.pl arg1 arg2 arg3 arg4"

Dentro desse arquivo eu faço algumas validações e por fim eu crio um um JSON e envio via WebService HTTP:REST para o segundo sistema, este por fim processa o solicitado.

Porém, pode ocorre do sistema 2 por exemplo ficar indisponível, e se ele ficar, eu perco o que estava tentando ser inserido nele. Dessa forma eu preciso criar algum tipo de fila, porém, não posso fazer isso em memória, pois sobrecarregaria o servidor. Dessa forma, algumas pessoas me indicaram que eu fizesse o meu script alimentar ou criar arquivos de texto para cada mensagem a ser enviada, e que eu fizesse um segundo script que ficasse rodando como Daemon (não sei como fazer isso) e ficasse vendo se foi criado novos arquivos ou incrementado algum, e então ele processaria esses arquivos, se houve sucesso na inserção do segundo sistema, ele aparia o arquivo ou a linha do arquivo, caso desse erro, ele ficaria tentando até conseguir.

Alguém experiente em desenvolvimento e em perl poderia me ajudar com essa? Obrigado desde já. Desculpa pelo imenso texto, tentei ser o mais claro possível para o meu problema.

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Hi.

Gabriel, o Perl possui n soluções para resolver o teu problema, mas você está buscando uma solução com um certo nível de complexidade, logo precisará de algum pouco conhecimento da linguagem.

Eu te recomendaria utilizar o módulo Daemon::Generic, um framework para criação de daemons que já implementa comandos start/stop/version/restart/reload e etc, controle de PID, mensagem de help e etc. Basta criar um módulo com métodos "gd_preconfig()", "gd_run()", e etc. A documentação no CPAN será sua amiga!

Na execução do daemon, você precisará ficar listando o diretório sem parar, certo? Para estas tarefas eu gosto muito de utilizar o timer() do AnyEvent, um framework de event loop que você ainda vai ouvir falar muito ao mexer com Perl.

Para o log, você pode utilizar o Log::Log4perl no modo easy para implementar as principais funções de debug(), error(), etc.

Olha, são duas e meia da manhã e estou suave, tomando um café. Então vou criar um esqueleto para que você possa entender melhor como eu o faria:

#!/usr/bin/env perl
package MeuDaemon;
use strict;
use warnings q(all);
use FindBin qw($RealBin $Script);

use AnyEvent;
use Daemon::Generic;
use Log::Log4perl qw(:easy);

newdaemon(
    progname => $Script,
    pidfile => "$RealBin/$Script.pid"
);

sub gd_preconfig {
    Log::Log4perl->easy_init({
        level   => $DEBUG,
        file    => "STDOUT",
        #file   => "$RealBin/$Script.log",
    });

    return ();
}

sub gd_run {
    my $self = shift;

    my $cv = AnyEvent->condvar;
    my $w  = AnyEvent->timer(
        after    => 0.0,
        interval => 1.0,
        cb       => sub {
            INFO "Buscando arquivos no diretorio...";

            my @files = glob("/home/fvox/filesToProc/*");
            for my $file (@files) {
                DEBUG "Processando ${file}...";
            }

            INFO "Fim do processo!";
        },
    );

    $cv->wait;
}

1;

Execução:

Screenshot-16.md.png


O script já funciona em loop, buscando arquivos no diretório a cada 1 segundo. O AnyEvent cai como uma luva para se trabalhar com I/O non blocking: isto implica que o processo, enquanto ficar em espera, não consumirá 100% dos clocks da CPU. =p

Agora cabe a você personalizar e otimizar o teu daemon, como por exemplo, dividindo a lista de arquivos encontrados numa queue de forks.

Claro que o CPAN te oferece zilhões de opções de módulos para fazer essas tarefas que você precisa e nos exemplos que criei foram utilizados módulos do meu gosto particular. =p

Espero que eu tenha ajudado. E boa sorte no desenvolvimento! ;-)

[]'s

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Cloud Computing


  • Forum Statistics

    • Total Topics
      148575
    • Total Posts
      644272
×
×
  • Create New...