Я никогда не находил таймеры полностью удовлетворительными из-за этой конкретной проблемы: вы не можете реально контролировать их состояние или изменять их.
Что я рекомендую, так это класс менеджера заданий второго уровня.Когда вы вызываете этот класс, он планирует таймер Java EE на время «X», а также записывает тот факт, что вы хотите выполнить «задание» в момент «X».Когда наступает это время, таймер Java EE вызывает этот класс диспетчера заданий, который находит задание и вызывает задание.
То, что это позволяет вам сделать, - это написать «внеплановую» функцию.Вызов без расписания может привести к удалению задания.Когда таймер Java EE вызывает время «X», этот класс не находит никакой работы и поэтому игнорирует ее.
Вы также можете реализовать функцию «изменить расписание», которая удаляет старую запись и создает новуюзапись во время 'Y', планируя таймер Java EE на время 'Y'.Таймер Java EE прибудет как во время «X», так и в другое время во время «Y», но будет иметь значение только время «Y».
Таким образом, ручной запуск заключается в наличии сервлета, который вызывает «изменение»планировать »прямо сейчас.
Еще одна деталь, о которой следует помнить: поскольку события таймера не совсем надежны, мы реализуем этот класс, чтобы найти все задания, которые были запланированы до текущего времени, и запустимвсе они в тот момент.Затем мы планируем дополнительные события таймера Java EE на каждые 5 минут или около того.Эти таймеры подберут любую работу, которая по тем или иным причинам была оставлена позади.Это важно, если ваша очередь заданий постоянна, то, возможно, при перезапуске сервера он отключается как раз в тот момент, когда должен был отключиться таймер.Нет проблем: события Java EE Timer сами по себе не имеют значения, они просто служат для пробуждения обработчика заданий, поэтому он может запускать все устаревшие задания.