我的服务器在欧洲/罗马时区上运行-这是服务器上的默认tz-
我需要根据用户所在的时区安排工作,因此,如果居住在太平洋/檀香山时区的用户安排了一个CronTrigger每天下午22:00到达他所在的地球区域,我发现了以下解决方案:
CronTrigger trigger = newTrigger()
.withIdentity("name", "group")
.withSchedule(
cronSchedule("0 0 22 ? * *").inTimeZone(TimeZone.getTimeZone("Pacific/Honolulu"))
)
.startNow()
.build();
在我的服务器上, 此工作 从“我的”第二天的09:00 am开始 。
除了保持时区更新(即时区更新工具)外,还有一些特殊的问题需要考虑?
如果我想为上一份工作定义.startAt()和.endAt(),这种日期还可以吗?使用此过程可能会节省夏时制吗?
Calendar calTZStarts = new GregorianCalendar(TimeZone.getTimeZone("Pacific/Honolulu"));
calTZStarts.set(2013, Calendar.JANUARY, 10);
Calendar calTZEnds = new GregorianCalendar(TimeZone.getTimeZone("Pacific/Honolulu"));
calTZEnds.set(2013, Calendar.JANUARY, 30);
Calendar calStarts = Calendar.getInstance();
calStarts.set(Calendar.YEAR, calTZStarts.get(Calendar.YEAR));
calStarts.set(Calendar.MONTH, calTZStarts.get(Calendar.MONTH));
calStarts.set(Calendar.DAY_OF_MONTH, calTZStarts.get(Calendar.DAY_OF_MONTH));
calStarts.set(Calendar.HOUR_OF_DAY, calTZStarts.get(Calendar.HOUR_OF_DAY));
calStarts.set(Calendar.MINUTE, calTZStarts.get(Calendar.MINUTE));
calStarts.set(Calendar.SECOND, calTZStarts.get(Calendar.SECOND));
calStarts.set(Calendar.MILLISECOND, calTZStarts.get(Calendar.MILLISECOND));
Calendar calEnds = Calendar.getInstance();
calEnds.set(Calendar.YEAR, calTZEnds.get(Calendar.YEAR));
calEnds.set(Calendar.MONTH, calTZEnds.get(Calendar.MONTH));
calEnds.set(Calendar.DAY_OF_MONTH, calTZEnds.get(Calendar.DAY_OF_MONTH));
calEnds.set(Calendar.HOUR_OF_DAY, calTZEnds.get(Calendar.HOUR_OF_DAY));
calEnds.set(Calendar.MINUTE, calTZEnds.get(Calendar.MINUTE));
calEnds.set(Calendar.SECOND, calTZEnds.get(Calendar.SECOND));
calEnds.set(Calendar.MILLISECOND, calTZEnds.get(Calendar.MILLISECOND));
CronTrigger trigger = newTrigger()
.withIdentity("name", "group")
.withSchedule(
cronSchedule("0 0 22 ? * *").inTimeZone(TimeZone.getTimeZone("Pacific/Honolulu"))
)
.startAt(calStarts.getTime())
.endAt(calEnds.getTime())
.build();
或者我必须简单地设置开始和结束使用:
Calendar calTZStarts = new GregorianCalendar();
calTZStarts.set(2013, Calendar.JANUARY, 10, 0, 0, 0);
Calendar calTZEnds = new GregorianCalendar();
calTZEnds.set(2013, Calendar.JANUARY, 30, 0, 0, 0);
CronTrigger trigger = newTrigger()
.withIdentity("name", "group")
.withSchedule(
cronSchedule("0 0 22 ? * *").inTimeZone(TimeZone.getTimeZone("Pacific/Honolulu"))
)
.startAt(calTZStarts.getTime())
.endAt(calTZEnds.getTime())
.build();
然后,作业在“太平洋/檀香山”定义的日期正确开始/结束?
预先感谢您的每个建议
我想我找到了经过测试的解决方案,并且在证明没有问题之前一直有效;)
重新启动我的服务器在特定时区(即欧洲/罗马)上运行
如果Pacific / Honolulu
TZ上的用户要计划从Sun(2013年1月27日,下午3:00)开始的作业,结束于2013年1月31日(星期四),晚上9:00结束,则每天每五分钟从2:00
PM到10:55 PM(0 0/5 14-22 * *?)正确的方法如下:
样例代码:
// Begin User Input
String userDefinedTZ = "Pacific/Honolulu"; // +11
int userStartYear = 2013;
int userStartMonth = Calendar.JANUARY;
int UserStartDayOfMonth = 27;
int userStartHour = 15;
int userStartMinute = 0;
int userStartSecond = 0;
int userEndYear = 2013;
int userEndMonth = Calendar.JANUARY;
int UserEndDayOfMonth = 31;
int userEndHour = 21;
int userEndMinute = 0;
int userEndSecond = 0;
// End User Input
Calendar userStartDefinedTime = Calendar.getInstance();
// set start schedule by user input
userStartDefinedTime.set(userStartYear, userStartMonth, UserStartDayOfMonth, userStartHour, userStartMinute, userStartSecond);
Calendar userEndDefinedTime = Calendar.getInstance();
// set end schedule by user input
userEndDefinedTime.set(userEndYear, userEndMonth, UserEndDayOfMonth, userEndHour, userEndMinute, userEndSecond);
CronTrigger trigger = newTrigger()
.withIdentity("name", "group")
.withSchedule(
// define timezone for the CronScheduleBuilder
cronSchedule("0 0/5 14-22 * * ?").inTimeZone(TimeZone.getTimeZone("Pacific/Honolulu"))
)
// adapt user start date to server timezone
.startAt( convertDateToServerTimeZone(userStartDefinedTime.getTime(), userDefinedTZ) )
// adapt user end date to server timezone
.endAt( convertDateToServerTimeZone(userEndDefinedTime.getTime(), userDefinedTZ) )
.build();
用于根据tz转换日期的实用程序:
public Calendar convertDateToServerTimeZone(Date dateTime, String timeZone) {
Calendar userDefinedTime = Calendar.getInstance();
userDefinedTime.setTime(dateTime);
if(!TimeZone.getDefault().getID().equalsIgnoreCase(timeZone)) {
System.out.println ("original defined time: " + userDefinedTime.getTime().toString() + " on tz:" + timeZone);
Calendar quartzStartDate = new GregorianCalendar(TimeZone.getTimeZone(timeZone));
quartzStartDate.set(Calendar.YEAR, userDefinedTime.get(Calendar.YEAR));
quartzStartDate.set(Calendar.MONTH, userDefinedTime.get(Calendar.MONTH));
quartzStartDate.set(Calendar.DAY_OF_MONTH, userDefinedTime.get(Calendar.DAY_OF_MONTH));
quartzStartDate.set(Calendar.HOUR_OF_DAY, userDefinedTime.get(Calendar.HOUR_OF_DAY));
quartzStartDate.set(Calendar.MINUTE, userDefinedTime.get(Calendar.MINUTE));
quartzStartDate.set(Calendar.SECOND, userDefinedTime.get(Calendar.SECOND));
quartzStartDate.set(Calendar.MILLISECOND, userDefinedTime.get(Calendar.MILLISECOND));
System.out.println("adapted time for " + TimeZone.getDefault().getID() + ": " + quartzStartDate.getTime().toString());
return quartzStartDate;
} else {
return userDefinedTime;
}
}
基于Quartz的实用程序,使用DateBuilder基于tz转换日期:
public Calendar convertDateToServerTimeZone(Date dateTime, String timeZone) {
Calendar userDefinedTime = Calendar.getInstance();
userDefinedTime.setTime(dateTime);
if(!TimeZone.getDefault().getID().equalsIgnoreCase(timeZone)) {
System.out.println("original defined time: " + userDefinedTime.getTime().toString() + " on tz:" + timeZone);
Date translatedTime = DateBuilder.translateTime(userDefinedTime.getTime(), TimeZone.getDefault(), TimeZone.getTimeZone(timeZone));
Calendar quartzStartDate = new GregorianCalendar();
quartzStartDate.setTime(translatedTime);
System.out.println("adapted time for " + TimeZone.getDefault().getID() + ": " + quartzStartDate.getTime().toString());
return quartzStartDate;
} else {
return userDefinedTime;
}
}
因此, 在我的Europe / Rome Quartz服务器上,此作业计划从2013年1月28日星期一02:00:00
CET开始,到2013年2月1日星期五CET 2013开始,并且每天从01:00 AM到08每隔五分钟触发一次: 55PM
在为开始时间和结束时间构建日期时,还应在实例化日期之前指定时区(在java.util.Calendar上,或在日期格式字符串上,或在org.quartz.DateBuilder上)。然后,石英在该特定时区中以UTC格式存储了自1970年1月1日起的毫秒数,因此,当服务器的时区更改时,触发器不会受到影响。
问题内容: 我对Java Quartz不太熟悉,我们只是使用了每天安排的测试工作。对于我们的Struts2 Web应用程序,我们希望运行一些计划在一天中不同时间的日常工作。作业应处于持久状态,以便即使由于服务器关闭/应用程序失败而导致作业失败,也应在服务器启动后稍后重新执行。我还可以将作业的状态/结果存储在DB中,以便监视作业。任何的意见都将会有帮助。 - 谢谢 问题答案: 无论您提到什么,都可以
我找不到任何可以添加到Kafka的与配置相关的更改
我正在尝试在不同区域的2个S3存储桶之间复制文件: 我使用的是'aws-java-sdk'版本:'1.11.7' 如何克服这个错误?
我们有一个在美国和欧盟托管的应用程序。为了获得更好的性能,我们将在这两个位置上托管一个datastore实例。 现在我们的问题是如何将数据从美国数据库复制到欧盟数据库? 还是不管我们从技术角度将数据存储在哪里?
我有一个带有4个分区的Kafka主题,因为我有一个带有4个消费者的消费者组。 我的目的是确保消息在分区之间均匀分布。 有没有办法验证kafka主题的跨分区消息分布?
问题内容: 在我的客户中,我有以下代码: 这两条线接连地运行。我从不设置时区或手动设置,仅依靠从OS和本地系统读取的默认设置。 执行后,它们产生: 系统时区确实是Phoenix,而不是UTC。Joda如何正确而JDK如何错误? 编辑 :这是Windows 7 x64主机,JRE是1.6.22 x64。 编辑2 :不要尝试复制它。它只会在某些系统上失败,而不是在所有系统上失败(例如3k用户群中的几十