Ir para conteúdo
Fórum Script Brasil
  • 0

(AJUDA) Ler novos arquivos texto ou incremento e fila


gabrielanjos

Pergunta

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.

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 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

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...