Java Spring 在特定时区的特定时间执行计划任务
Java Spring do scheduled task at a specific time of specific timezone
我正在使用 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
}
这看起来很愚蠢。我怎样才能改进我的代码?
<task:scheduled ref="beanC" method="methodC" cron="0 0 0 * * ?"/>
运行每天午夜。
如果改为 annotate your method,则可以指定时区:
@Scheduled(cron="0 0 0 * * ?", zone="Asia/Ho_Chi_Minh")
public void methodC() {
// code
}
我正在使用 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
}
这看起来很愚蠢。我怎样才能改进我的代码?
<task:scheduled ref="beanC" method="methodC" cron="0 0 0 * * ?"/>
运行每天午夜。
如果改为 annotate your method,则可以指定时区:
@Scheduled(cron="0 0 0 * * ?", zone="Asia/Ho_Chi_Minh")
public void methodC() {
// code
}