Java Spring在特定时区的特定时间执行调度任务

2022-09-03 06:21:54

我正在开发一个带有Spring和Hibernate的网站(该网站是关于股票交易的)。

每天凌晨12点左右,我需要取消所有订单。目前,我的解决方案正在使用每小时运行一次的计划任务:

 <task:scheduled ref="ordersController" method="timeoutCancelAllOrders" fixed-delay="60*60*1000" />

然后在方法timeoutCancelAllOrders中,我获取当前时间并检查,如果它是在晚上11点到凌晨12点之间,那么做任务

在我看来,任务计划从我启动服务器时开始(我在Eclipse中使用Tomcat),但是当我将其部署在在线主机上(我使用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
}

答案 2

推荐