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
}