Java Spring выполняет запланированную задачу в определенное время конкретного часового пояса
Я разрабатываю веб-сайт с Spring и Hibernate (сайт посвящен торговле акциями).
Ежедневно в 12 часов мне нужно отменить все заказы. В настоящее время мое решение использует запланированную задачу, которая запускается каждый час:
<task:scheduled ref="ordersController" method="timeoutCancelAllOrders" fixed-delay="60*60*1000" />
Затем в методе timeoutCancelAllOrders я получаю текущее время и проверяю, если он между 11:00 и 12:00 выполняет задачу
Как я его вижу, расписание задач начинается, когда я запускаю сервер (я использую Tomcat в Eclipse), но когда я его развертываю на онлайн-хостинге (я использую Openshift), я понятия не имею, когда время начала расписания задач.
Мой вопрос:
1: Как сделать это более автоматическим? Есть что-нибудь вроде myTask.startAt(12AM)?
2: Я живу во Вьетнаме, но сервер (Openshift) находится в США, поэтому здесь, как я делаю чек:
Date currentTime = new Date();
DateFormat vnTime = new SimpleDateFormat("hh:mm:ss MM/dd/yyyy ");
vnTime.setTimeZone(TimeZone.getTimeZone("Asia/Ho_Chi_Minh"));
String vietnamCurrentTime = vnTime.format(currentTime);
String currentHourInVietnam = vietnamCurrentTime.substring(0, 2);
System.out.println(currentHourInVietnam);
if(currentHourInVietnam.equals("00")){
// DO MY TASK HERE
}
Это выглядит глупо. Как я могу улучшить свой код?
Ответы
Ответ 1
Используйте спецификацию CRON:
<task:scheduled ref="beanC" method="methodC" cron="0 0 0 * * ?"/>
Выполнить в полночь каждый день.
Если вы вместо аннотируете свой метод, вы можете указать часовой пояс:
@Scheduled(cron="0 0 0 * * ?", zone="Asia/Ho_Chi_Minh")
public void methodC() {
// code
}