Расписание EJB3 работает некорректно

Я следовал 16" rel="nofollow noreferrer">примеру Адама Бина, чтобы сделать таймер , но это не работает должным образом. Я создал @Singleton EJB с помощью метода, помеченного знаком @Schedule. Приложение развернуто на wildfly 11. У меня тут две проблемы. Во-первых, мой таймер регистрирует каждую секунду, а не каждую минуту. Вторая проблема заключается в том, что каждый раз, когда запускается таймер, я получаю сообщение об ошибке.

Может кто подскажет, что я делаю не так? Может, я просто слепой и не вижу этого.

Мои занятия:

import javax.ejb.Schedule;
import javax.ejb.Singleton;
import java.util.logging.Logger;

@Singleton
public class DeviceTrackerCronJob {

    private static final Logger LOG = Logger.getLogger(DeviceTrackerCronJob.class.getName());

    private long counter;

@Schedule(second = "*", minute = "*/1", hour = "*", info = "Every Minute!")
public void execute() {
    LOG.info("### --- FAKING SOME CONTENT " + counter++);
    }
}

Я получаю следующее сообщение:

12: 42: 03,025 ИНФОРМАЦИЯ [de.klemensmorbe.tracking.DeviceTrackerCronJob] (EJB по умолчанию - 1) ### --- ПОДДЕЛЬНОЕ СОДЕРЖАНИЕ 575 12: 42: 04,040 ОШИБКА [org.jboss.as.ejb3.timer] (EJB по умолчанию - 1) WFLYEJB0020: Ошибка при вызове тайм-аута для таймера: [id = a797d1ca-e550-41e4-bfe7-46066f7b24b3 timedObjectId = web.web.DeviceTrackerCronJob auto-timer?: false persistent?: true timerService = org.jb3 .timerservice.TimerServiceImpl @ c39b6bb initialExpiration = null intervalDuration (в миллисекундах) = 0 nextExpiration = среда, 3 января, 12:42:05 UTC 2018 timerState = IN_TIMEOUT info = null]: java.lang.RuntimeException: WFLYEJB0343: Невозможно вызвать метод тайм-аута, потому что метод null не является методом тайм-аута в org.jboss.as.ejb3 // org.jboss.as.ejb3.timerservice.TimedObjectInvokerImpl.callTimeout (TimedObjectInvokerImpl.java:83) в org.jboss.as.ejb3 // org.jboss .as.ejb3.timerservice.TimedObjectInvokerImpl.callTimeout (TimedObjectInvokerImpl.java:109) в org.jboss.as.ejb3 // org.jboss.as.ejb3.timerservice.CalendarTim erTask.invokeBeanMethod (CalendarTimerTask.java:66) на org.jboss.as.ejb3 // org.jboss.as.ejb3.timerservice.CalendarTimerTask.callTimeout (CalendarTimerTask.java:53) на org.jboss.as.ejb org.jboss.as.ejb3.timerservice.TimerTask.run (TimerTask.java:160) at org.jboss.as.ejb3 // org.jboss.as.ejb3.timerservice.TimerServiceImpl $ Task $ 1.run (TimerServiceImpl.java : 1220) на org.wildfly.extension.request-controller // org.wildfly.extension.requestcontroller.RequestController $ QueuedTask $ 1.run (RequestController.java:497) на java.base / java.util.concurrent.ThreadPoolExecuter.r (ThreadPoolExecutor.java:1167) в java.base / java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:641) в java.base / java.lang.Thread.run (Thread.java:844) в org.jboss.threads // org.jboss.threads.JBossThread.run (JBossThread.java:320)

мой таймер регистрирует каждую секунду, а не каждую минуту.


person Klemens Morbe    schedule 03.01.2018    source источник
comment
12: 42: 04,041 ИНФОРМАЦИЯ [org.jboss.as.ejb3.timer] (EJB по умолчанию - 1) WFLYEJB0021: Таймер: [id = a797d1ca-e550-41e4-bfe7-46066f7b24b3 timedObjectId = web.web.Device-timerCronJob : false persistent?: true timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@c39b6bb initialExpiration = null intervalDuration (в миллисекундах) = 0 nextExpiration = Wed Jan 03 12:42:05 UTC 2018 timerState = IN_TIMEOUT info = null ] будет повторена 12: 42: 04,041 ИНФОРМАЦИЯ [org.jboss.as.ejb3.timer] (EJB по умолчанию - 1) WFLYEJB0023: Тайм-аут повторной попытки для таймера: [id = a797d1ca-e550-41e4-bfe7-46066f7b24b3 timedObjectId = web. web.DeviceTrackerCronJob auto-timer?: false persistent?: true timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@c39b6bb initialExpiration = null intervalDuration (в миллисекундах) = 0 nextExpiration = среда, 03 января, 12:42:05 UTC 2018 timerState = IN_TIMEOUT info = null] 12: 42: 04,042 ОШИБКА [org.jboss.as.ejb3.timer] (EJB по умолчанию - 1) WFLYEJB0022: ошибка во время тайм-аута повторной попытки для таймера: [id = a797d1ca-e550-41e4-bfe7 -46066f 7b24b3 timedObjectId = web.web.DeviceTrackerCronJob auto-timer?: False persistent?: True timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@c39b6bb initialExpiration = null intervalDuration (в миллисекундах) = 0 nextExpiration = Wed 03, 12 января : 42: 05 UTC 2018 timerState = RETRY_TIMEOUT info = null]: java.lang.RuntimeException: WFLYEJB0343: Невозможно вызвать метод тайм-аута, потому что метод null не является методом тайм-аута в org.jboss.as.ejb3 // org.jboss.as. ejb3.timerservice.TimedObjectInvokerImpl.callTimeout (TimedObjectInvokerImpl.java:83) в org.jboss.as.ejb3 // org.jboss.as.ejb3.timerservice.TimedObjectInvokerImpl.callTimeject.jok: .ejb3 // org.jboss.as.ejb3.timerservice.CalendarTimerTask.invokeBeanMethod (CalendarTimerTask.java:66) в org.jboss.as.ejb3 // org.jboss.as.ejb3.timerservice.CalendarTimerTask.callTimerTask.callTimerTask.callTimerTask. java: 53) в org.jboss.as.ejb3 // org.jboss.as.ejb3.timerservice.TimerTask.retryTimeout (Тим erTask.java:234) на org.jboss.as.ejb3 // org.jboss.as.ejb3.timerservice.TimerTask.run (TimerTask.java:168) на org.jboss.as.ejb3 // org.jboss. as.ejb3.timerservice.TimerServiceImpl $ Task $ 1.run (TimerServiceImpl.java:1220) в org.wildfly.extension.request-controller // org.wildfly.extension.requestcontroller.RequestController $ QueuedTask $ 1.run (RequestController. 497) в java.base / java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167) в java.base / java.util.concurrent. ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:641) в java.base / java.lang.Thread.run (Thread.java:844) в org.jboss.threads // org.jboss.threads.JBossThread.run (JBossThread .java: 320)   -  person Turo    schedule 03.01.2018


Ответы (2)


Затем установите секунды на секунды минуты, когда он должен работать. Если вы хотите, чтобы он запускался в 12:00:00, а затем в 12:01:00 (т.е. на 0 секунде каждой минуты), используйте second = "0".

Вероятно, вам также понадобится постоянное значение false, если вы не хотите, чтобы сервер догонял пропущенные расписания, если он в какой-то момент выйдет из строя.

Я не уверен, почему вы получаете ошибку тайм-аута.

Спасибо за совет. Я установил таймер и использовал EJB с блокировками. Проблема заключалась (как я думаю) в том, что таймеры не дожидаются завершения других таймеров. Мой код теперь выглядит так, как в этот пример (3. Запланировать задачу с фиксированной задержкой).

person assylias    schedule 03.01.2018

посмотрите stackoverflow.com/questions/2691835/ и выберите исправление, которое будет запускаться раз в минуту

person Klemens Morbe    schedule 05.01.2018