2012-07-14 17 views
16

vorrei provare ad usare l'annotazione @Schedule nel seguente modo:annotazione @Schedule passano ogni pochi minuti (o secondi)

public class MyTestServlet extends HttpServlet { 
    private static JcanLogger LOG = JcanLoggerFactory.getLogger(ServiceTestServlet.class); 

    @EJB CronService cronService; 

    public void service(HttpServletRequest req, HttpServletResponse resp) throws .... { 
    .... 
    cronService.iLive(); 
} 
--- 
    @Local // because the ejb is in a servlet (there is no other jvm) 
public interface CronService { 

    public void iLive(); 
    public void runsEveryMinute(); 
} 
--- 
@Singleton 
public class CronServiceBean implements CronService { 
    private static final JcanLogger LOG = JcanLoggerFactory.getLogger(CronServiceBean.class); 

    @Schedule(minute="*") 
    public void runsEveryMinute() { 
     LOG.info(" runs EveryMinute "); 
    } 

    public void iLive() { 
     LOG.info("iLive"); 

    } 
--- 
LOG 
... 
CronServiceBean:34 ] iLive 

Sulla base del registro, il CronService dal vivo e bene, ma la l'operazione pianificata "runsEveryMinute" non funziona.

Come dovrebbe funzionare utilizzando un'attività pianificata EJB?

risposta

51

Come per la Javadoc per il @Schedule annotazione, i valori di default sono:

  • * per tutti i campi ad eccezione di ora, minuti e secondi; e
  • 0 per ora, minuto e secondo, per impostazione predefinita.

Specificando minute="*" e lasciando ora al suo predefinito di 0, si chiede che la corsa del timer ogni minuto dopo la mezzanotte per un'ora (cioè, 0:00, 0:01, 0:02, ..., 00:59) e poi non di nuovo fino al giorno successivo. Invece, utilizzare:

@Schedule(hour="*", minute="*") 

Per eseguire ogni pochi secondi (ad esempio, 10 secondi), è possibile utilizzare un cron -come sintassi:

@Schedule(hour = "*", minute = "*", second = "*/10", persistent = false) 

Per impostazione predefinita, lo scheduler persiste eventi. L'impostazione di persistent = false impedirà che si accumulino nel tempo, se lo si desidera.