Utilizando Multithreads

1 resposta
M

Pessoal, Bom dia!
Estou implementando uma aplicação que irá processar diversas requisições em background.
Pensei em usar thread para isso, utilizando o ExecutorService. Detalhando melhor para vocês, as requisições serão solicitações que serão feitas e armazenadas no banco. Após isso, uma thread ficará sempre consultando as solicitações que estão aptas para serem processadas. Quando encontrar, essa thread terá um executorService que fará o controle do pool de thread e cada solicitação será processada por uma thread contida no pool.
Isso foi como pensei em fazer, mas ainda não tenho certeza se vai funcionar.
Gostaria de saber se alguém teria alguma outra idéia ou se essa idéia vai funcionar ?

Desde já agradeço

1 Resposta

jacoboliveira

Bom essa idéia funciona, mas acredito que o Quartz seja melhor, em questão de amadurecimento, eu uso pra monitorar alterações no banco, ele funciona como um agendador/disparador de Job(que seria as threads agendadas), mas vc pode usá-lo como pool de thread uma vez que vc pode definir o delay, se a thread deverá ficar rodando, vc pode dar um shutdown ou deixar em standby e etc. Ele é muito usado e esta bastante estável.

Aqui segue um exemplo:

`

SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();

        JobKey jobKey1 = new JobKey("job1", "group1");
       
        // aqui estou criando o job e definindo qual classe chamar queria a "AgendamentoJob"
        JobDetail job1 = newJob(AgendamentoJob.class)
                .withIdentity(jobKey1)
                .build();

        //Aqui estou definindo uma Trigger ao job para rodar e a cada 60 seconds ele irá disparar a thread
        //sendo que a execução vai se repetir para sempre
        Trigger trigger1 = newTrigger()
                .withIdentity("myTrigger", "group1")
                .withPriority(1)
                .startNow()
                .withSchedule(simpleSchedule()
                        .withIntervalInSeconds(60)
                        .repeatForever())
                .build();

//preparando o agendamento
Scheduler scheduler = schedFact.getScheduler();

scheduler.start();

        //aqui estou inicializando de fato o Job , e executando o  agendamento
        scheduler.scheduleJob(job1, trigger1);

`

Esse é job de fato

`

public class AgendamentoJob implements Job {

     private final static String SYNC = "SYNC";

     public AgendamentoJob() {
     }

     @Override
     public void execute(JobExecutionContext context) throws JobExecutionException {

         synchronized (SYNC) {
          //seu codigo
         }
     }
    }

`
Eu acredito que essa bilbioteca já faz tudo o que você precisa sem precisar criar o executorservice que controla o pool por que nessa lib tem a classe Scheduler que controla os jobs e os Triggers, ou seja, ele pausa ele encerra e etc
Acredito que seja isso que vc precisa, se caso não me explica a função desse ExecutorService

Criado 14 de junho de 2016
Ultima resposta 14 de jun. de 2016
Respostas 1
Participantes 2