@Schedule аннотация запускается каждые несколько минут (или секунд)
Я хотел бы попытаться использовать аннотацию @Schedule следующим образом:
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
Основываясь на журнале, CronService живёт и хорошо, но запланированная задача "runningEveryMinute" не работает.
Как это должно работать с помощью запланированной задачи EJB?
Ответы
Ответ 1
В соответствии с Javadoc для аннотации @Schedule
значения по умолчанию:
-
*
для всех полей, кроме часа, минуты и секунды; и
-
0
по часам, минутам и секундам по умолчанию.
Указывая minute="*"
и оставляя час по умолчанию 0
, он запрашивает, чтобы таймер запускался каждую минуту после полуночи в течение одного часа (то есть 00:00, 00:01, 00:02,..., 00:59), а затем снова не на следующий день. Вместо этого используйте:
@Schedule(hour="*", minute="*")
Для запуска каждые несколько секунд (например, 10
секунд) вы можете использовать синтаксис cron:
@Schedule(hour = "*", minute = "*", second = "*/10", persistent = false)
По умолчанию планировщик сохраняет события. Установка persistent = false
не позволит им со временем наращивать, если это необходимо.