:: Agendar tarefas

Pessoal,

Eu desenvolvi um sistema e para que seu funcionamento seja efetivo, foi desenvolvido tambem um robô multi-thread que faz algumas importações de informações e dispara alguns e-mails.

Eu uso atualmente a hospedagem da locaweb e lá eles dispõe do CronTab com a limitação de poder agendar processos somente entre as 2 e 3 da manhã.

Este meu processo deveria rodar a cada 10 min …

Alguém tem alguma idéia de como conseguir isso no meu ambiente atual?!? Isso sem usar o crontab que é limitado ao horario.

Para poder utilizar o crontab fulltime, eu preciso contratar uma hospedagem dedicada o que para mim é inviável neste momento.

Eu consigo de alguma forma agendar um processo java e rodá-lo estando fora deste ambiente de task schedule?

Já ouvi alguns comentários sobre utilizar o Quartz mas ainda não tive como estudá-lo para ver se ele atende.

Abraço,

Opa!

Vc pode usar o Quartz sim, que eu acredito ser a melhor opção, ou então usar a própria API do java para Schedular seus jobs, no caso do quartz existe inclusive um aplicativo web no próprio site (ou pelo menos havia) que serve para gerenciar os seus jobs ( adicionar novos, pausar, reiniciar, remover etc.)

Quartz +1

spring + quartz

Já estou montando aqui um lab prá testar esta combinação …

obrigado pelas dicas.

Eu gosto de usar Threads segue exemplo de uma que possuo

  public static void main(String[] args) {
      
        
        AgendaHoraI agenda = new AgendaHoraI();
        Thread thre = new Thread(agenda);
        thre.start();
        
    }

[code]
@Override
public void run() {
long t1 = System.currentTimeMillis();
while (true) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hora);
calendar.set(Calendar.MINUTE, minutos);
calendar.set(Calendar.SECOND, segundos);
Date data = new Date(System.currentTimeMillis());
calendar.set(Calendar.DATE, data.getDate());
time = calendar.getTime();

        if ((time.getTime() == t1)  {
            if (teste) {
                try {
                    teste = false;
                    //sua ação.
                    
            }
            try {
                Thread.sleep(1000);
                teste = false;
            } catch (InterruptedException ex) {
                Logger.getLogger(AgendaHoraI.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            try {
                Thread.sleep(1000);
                teste = true;
            } catch (InterruptedException ex) {
                Logger.getLogger(AgendaHoraI.class.getName()).log(Level.SEVERE, null, ex);
            }
            t1 = System.currentTimeMillis();
        }

    }
}

}[/code]

[quote=fabricioempresa]Eu gosto de usar Threads segue exemplo de uma que possuo …
[/quote]

Olá!

Sinceramente não vejo vantagem nenhuma em usar uma thread da forma que vc implementou, ela simplesmente verifica de tempos em tempos se ela “pode rodar”, acho que tanto quartz, o scheduler do ejb e o default do java são melhores abordagens que essa.

Recomendo fazer um upgrade do teu conhecimento para Java 1.3.

Bom para minha aplicação a Thread funcionou então não vejo motivo para trocar de opção.

Valeu pela preocupação.

Vc é meio folgado com suas respostas ne Bruno, cara todo topico que vc posta, tem alguma critica, ataque…

Desculpa ai, nao te conheco, mas pelo jeito deve ser uma autoridade maxima ao que se refere a Java.

Ate

Não Não deixa o Steve Jobs falando sozinho ai.

Estava apenas dando uma ajuda ao nosso amigo o cara vem me atacando Valeu aew

Ele recomendou o cara a ir pra 1.3

vai ver é a versao que ele usa

[quote=deniswsrosa][quote=fabricioempresa]Eu gosto de usar Threads segue exemplo de uma que possuo …
[/quote]

Olá!

Sinceramente não vejo vantagem nenhuma em usar uma thread da forma que vc implementou, ela simplesmente verifica de tempos em tempos se ela “pode rodar”, acho que tanto quartz, o scheduler do ejb e o default do java são melhores abordagens que essa.[/quote]

Sei não mas acho que por trás dos panos, tanto a thread q o amigo implementou qt estas ferramentas fazem as mesmas coisas. Ou não?

[quote=rodrigo.lopes]Vc é meio folgado com suas respostas ne Bruno, cara todo topico que vc posta, tem alguma critica, ataque…

Desculpa ai, nao te conheco, mas pelo jeito deve ser uma autoridade maxima ao que se refere a Java.

Ate [/quote]

Desculpe se lhe dei esta impressão, e ao fabricio, foi mal mesmo pela resposta incisiva, deveria ter feito algo mais construtivo.

Se preferirem usar uma classe da API padrão do Java, tem o Timer, que faz a mesma coisa e mais um pouco mais. A implementação dela é parecida com a tua, a maior diferença que ao invés de sleep(1000), eles calculam o tempo até a ativação, e passam para o sleep.

O que deveria ter dito, é para evitar codificar essas coisas por si mesmo, e prefirir uma solução de terceiros pronta e comprovada, o famoso “evitar reinventar a roda”. E o motivo não é nem poupar o teu tempo de desenvolvedor, e sim por que o teu código pode ser bem mais lento, afetando não só a tua aplicação, quanto outros que rodem na mesma máquina, e nos piores casos, introduzir bugs de segurança onde podem aproveitar para te roubarem senhas, dados, e dar prejuízo para ti ou para a empresa.

E ae bruno!

gostei da tua resposta, com essa atitude mudo meu previo pensamento sobre vc para algo positivo.

ate mais

abraz

Galera, deixando os flames de lado, tenho mais uma questão sobre esta implementação.

Meu robo atual roda utilizando Thread e algumas classes do pacote java.util.concurrent.*

Esta funcionando perfeitamente …

Mas, em resumo, o funcionamento esta assim:

while( true ) {
	if( isRead ) {
		thread.start()
	}
}

Isso significa que o meu processo fica rodando o tempo todo.

O uso que eu questionei do CronTab seria para melhorar a questão de processamento, pois ao invés de um loop infinito verificando qdo devo rodar, eu teria um agendamento que a cada tempo determinado, iniciaria o processo, criaria todas as threads, e assim que as threads morressem, o processo também seria morto, iniciando novamente somente quando a proxima execução do crontab fosse iniciada.

Mostrando em uma time-line:

Espero que entendam o que eu estou tentando explicar.

Para um processo onde eu quero que determinado codigo de negócio seja executado a cada 1 hora, na abordagem atual, meu programa fica em loop infinito e através de uma condicional, verifico o intervalo de 60 minutos para iniciar o código de negócio.

O ideal para este processo seria que a cada 60 min, o código de negócio fosse executado.

Sei que não existe mágica e que para que algo seja executado em determinado tempo, algum processo precisa ficar verificando esse time de execução … prá isso existe os agendadores como o CronTab, mas como disse no primeiro post, vou ter que contratar uma hospedagem dedicada prá fazer isso e isso esta no momento fora de cogitação.

Existe uma forma de fazer isso sem o uso do crontab!?! Vi alguns artigos sobre alguns sites que fazem o armazenamento de jobs como o terracota, mas não entendi ao certo como funciona.

Abraço,

Não entendi sua pergunta, isso já não havia sido respondido nos posts anteriores?

Na verdade eu não quero um processo 100% do tempo rodando … quero que ele rode somente em um horario determinado …

Não quero uma thread rodando e a cada tempo determinado disparando algum processo …

Ví que no fundo o Quartz faz a mesma coisa …

Sei que o ideal para mim seria um agendador de tarefas que no horario que eu especificar ele chamaria meu jar e executaria meu processo, mas o ponto seria justamente descobrir se existe algo que possa substituir o uso deste agendador de tarefas sem honerar a VM, ou seja, o processo só rodaria na hora que ele precisa rodar mesmo.

Espero que tenham entendido minha questão.

abraço

vc ta precisando estudar threads

threads sao por definicao lightweight

nao faz sentido nenhum o que vc esta tentando atingir

o quartz faz a mesma coisa por que eh o unico jeito de fazer, nao porque eles querem usar um monte de CPU, o quartz eh um framework estabelecido no mercado a anos, todo mundo usa, e simplesmente nao entendo porque nego fica procurando cabelo em ovo tentando reinventar a roda

vc ta precisando estudar threads

threads sao por definicao lightweight

nao faz sentido nenhum o que vc esta tentando atingir

o quartz faz a mesma coisa por que eh o unico jeito de fazer, nao porque eles querem usar um monte de CPU, o quartz eh um framework estabelecido no mercado a anos, todo mundo usa, e simplesmente nao entendo porque nego fica procurando cabelo em ovo tentando reinventar a roda[/quote]

Amigo,

Acho que você poderia ter tentando entender melhor a questão ao invés de ficar supondo que eu precise aprender mais isso ou aquilo.

Colegas, o fórum não é o lugar prá extravasar o stress … se estiver nestas condições, por favor, não responda nenhum post.

Quando eu citei que preciso de um processo offline é porque minha hospedagem restringe processos processos rodando que não estão no crontab. Só posso usar processos online na hospedagem dedicada e através do crontab.

Eu simplesmente questionei esta possibilidade com o Quartz por o conhecer a pouco tempo … bastava apenas dizer:

  • Não… não é possivel.

ou

  • Sim … é possivel.

Se cada um vir aqui no fórum e começar a responder posts com sua opinião pessoal sobre o conhecimento de quem esta postando, eu serei o primeiro a vir aqui e mandar você para aquele lugar cheio de pregas …