Tarefa do cronômetro em segundo plano no aplicativo da Web JSP / Servlet

Eu quero recuperar de subscrição e armazenar feeds para o database da assinatura a cada 6 horas. Eu quero ter um thread de timer em segundo plano para realizar essa tarefa.

Qual é o melhor caminho? Um encadeamento de timer normal ou uma API de quartzo?

Para começar, eu não usaria o JSP para isso. Lá não é para.

Quando você está no Java EE 5, use as APIs de jobscheduling fornecidas pelo contêiner para isso. Mais detalhes dependem do contêiner que você está usando. O JBoss AS 5, por exemplo, vem com o Quartz fora da checkbox. Ou quando você está usando um framework em cima de JSP / Servlet que oferece APIs de jobscheduling, como o Spring , então você deve usá-lo.

Se não houver nenhum (por exemplo, você está usando apenas o Tomcat 6) ou deseja ser independente do contêiner e / ou da estrutura, crie um ServletContextListener com um ScheduledExecutorService . Mais detalhes podem ser encontrados nesta resposta .

Ou quando você já está em um contêiner Java EE 6 que suporta EJB 3.1 (JBoss AS 6, GlassFish 3, mas não Tomcat 7), o mais fácil é criar um @Singleton EJB com o método @Schedule .

 @Singleton public class UpdateSubscriptions { @Schedule(hour="*/6", minute="0", second="0", persistent=false) public void run() { // Do your job here. } } 

É isso aí. Nenhuma configuração adicional é necessária.


Atualização : de acordo com os comentários, você está usando o Tomcat (6 ou 7?). Para iniciar um encadeamento durante a boot do webapp que executa a tarefa a cada 6 horas, use o exemplo fornecido na resposta do beforelink e faça a seguinte alteração no método scheduleAtFixedRate()

 scheduler.scheduleAtFixedRate(new UpdateSubscriptions(), 0, 6, TimeUnit.HOURS); 

A class UpdateSubscriptions deve implementar Runnable e a tarefa real precisa ser executada no método run() que você @Override , como no exemplo da resposta vinculada.