Pergunta : Scheduling de trabalho em Java

Olá!, o

We tem uma aplicação com suporte na internet funcionar no Tomcat v6.0.10 de Apache. Naturalmente, os relatórios estão igualmente disponíveis como parte de nossa aplicação.  Agora, nós planeamos introduzir uma caraterística nova no programa do relatório chamado da aplicação.  Using o relatório que programa, os relatórios da programação da lata do usuário da aplicação de sua escolha e começ o entregado em sua caixa postal. Nós queremos dar flexibilidade do usuário tanta como podem em programar o reports.

I igualmente ouvido & lido sobre o programa de trabalho em Java em: os planificadores de trabalho da fonte do

Open no rel= " nofollow " do " _blank " " do target= de " http://java-source.net/open-source/job-schedulers do href= de Java
o n-source/job-schedulers

What de http://java-source.net/ope são rel= " nofollow " do " _blank " " do target= de " http://onjava.com/lpt/a/6207 do href= de Quartz
rel= " nofollow " do " _blank " " do target= de " http://www.javalobby.org/java/forums/t68751.html do href= de Scheduler
07

JobServer 1.4 Open Source Java de http://onjava.com/lpt/a/62 > caso do uso do ava/forums/t68751.html

Considering de http://www.javalobby.org/j meu explicaram acima, minhas perguntas são:
1) É possível usar próprio java.util.TimerTask de Sun para meu programa complexo do relatório?
2) Que são as razões/limitações válidas/fortes de java.util.TimerTask comparado a outras estruturas do planificador de trabalho?  De modo que eu eu mesmo tenha uma opinião forte/razão antes de escolher um planificador de trabalho da terceira framework.
3) há um máximo de 100-200 usuários em minha aplicação.  Caso que, os usuários programaram relatórios em tal maneira ao mesmo tempo há 100 pedidos do relatório na fila.  Como a estrutura do planificador de trabalho OU o java.util.TimerTask seguram tais encenações?  Nós temos o controle sobre este?
4) A qualquer hora, são permitidos aos usuários mudar suas programações do relatório. A estrutura do planificador de trabalho suporta esta?
5) Obviamente, para funcionar um relatório lá ser entradas do relatório, de que tem que ser passado a cada programação do relatório.  Nós temos a flexibilidade/opção em passar parâmetros à estrutura do planificador de trabalho?
5) Qual é a melhor maneira? Estrutura de integração do planificador de trabalho com aplicação web ou corredor ele como um autônomo? o

NOTE
por causa do escape de memória em nossa aplicação, nós temos um reinício da diariamente-base do serviço do Tomcat no tempo do baixo-uso.  A razão que eu estou explicando este é que o relatório programado por Usuário deve ser persistido através do usuário/reinícios do Tomcat.  Tomar isto na opinião de consideration.

Experts no sentido direito são appreciated.
class= do

Resposta : Scheduling de trabalho em Java

Bem eu apenas tive um olhar em um de minhas aplicações que usa o quartzo (envolvido em Mola) e no unschedule da atualização i um trabalho e programo então mudado.

Aqui meu código para sheduling/unscheduling… eu igualmente tenho que passar completamente alguma informação ao trabalho, assim que é relativamente similar a o que você precisa (mas manter na mente, que a classe do mabe um ou outro está somente disponível ao usar o envoltório de quartzo da mola) (os “dados” são os dados reais do trabalho, o mola-contexto e o trabalho-executer-serviço são providos ao contexto da mola e a um serviço, que eu preciso dentro de meu trabalho)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
	protegido
	scheduleJob vago (aJob final de SchedulerJob)
	{
        // cria um contexto do trabalho (Quartzo-Objeto).
        jobDataMap final de JobDataMap = JobDataMap novo ();
        jobDataMap.put (“dados”, aJob);
        jobDataMap.put (“mola-contexto”, ctx);
        jobDataMap.put (“trabalho-executer-serviço”, jobEcecuterService);

        // cria um detalhe da execução de trabalho (Quartzo-Objeto).
        jobDetail final de JobDetail = JobDetail novo (aJob.getId (),
                zero, DefaultSchedulerExecuter.class);
        jobDetail.setJobDataMap (jobDataMap);

        // adiciona a JOD-definição ao planificador.
        tentativa {
            schedulerFactory.addJob (o jobDetail, retifica);

            // cria um disparador de quartzo para começar o trabalho.
            disparador final de CronTrigger = CronTrigger novo ();
            // ajustou o nome à identificação
            trigger.setName (aJob.getId ());
            trigger.setJobName (aJob.getId ());
            Começo de // agora.
            trigger.setStartTime (Calendar.getInstance () .getTime ());
            Programação de // como especific na expressão do cron.
            trigger.setCronExpression (aJob.getCronExpression ());

            se (log.isInfoEnabled ()) {
                log.info (“[PLANIFICADOR] - trabalho do Scheduling: ” +
                        aJob.getId () + “com executer” +
                        jobDetail.getJobClass () .getCanonicalName ());
            }

            Programação de // o trabalho novo.
            schedulerFactory.scheduleJob (disparador);
        } prendedor (exceção final e) {
            se (log.isDebugEnabled ()) {
                log.info (do “trabalho do Scheduling erro” + aJob.getName () + “. Trabalho desativado. ”, e);
            }

            // desativa o trabalho, assim que não é começado automaticamente outra vez.
            aJob.setEnabled (falso);

            // conserva o trabalho modificado.
            tentativa {
                updateJob (aJob);
            } prendedor (exceção final ex) {
                lance RuntimeException novo (ex);
            }
        }
	}

	protegido
	unscheduleJob vago (aJobId final da corda)
	{
    	tentativa {
    		se (schedulerFactory.getJobDetail (
                    aJobId, “DEFEITO”)! = zero) {
				se (log.isInfoEnabled ()) {
					log.info (“[PLANIFICADOR] - trabalho de Unscheduling: ” +
							aJobId);
				}

				schedulerFactory.deleteJob (aJobId, “DEFEITO”);
    		}
		} prendedor (SchedulerException final e) {
			lance RuntimeException novo (
					Do “trabalho unscheduling erro com identificação” + aJobId, e);
		}
	}
Outras soluções  
 
programming4us programming4us