5

我用-Duser.timezone=UTC. 然而,Quartz 调度程序 2.2.1 似乎在我的操作系统时区欧洲/布拉格运行。

有没有办法在自定义时区运行 Quartz 或确定 Quartz 正在使用哪个时区?如果没有,有没有办法以编程方式确定操作系统时区?

4

3 回答 3

7

Quartz 默认将使用默认的系统区域设置和时区,并且它没有被编程为获取您为应用程序提供的属性user.timezone 。还要记住,这仅适用于 CronTrigger 而不是 SimpleTrigger。

例如,如果您使用 Spring:

 <bean id="timeZone" class="java.util.TimeZone" factory-method="getTimeZone">
    <constructor-arg value="GMT" />
</bean>
<bean id="yourTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="yourJob" />
    <property name="cronExpression" value="0 0 0/1 * * ?" />
    <property name="timeZone" ref="timeZone" />
  </bean>

如果您使用的是纯 java:

Trigger yourTrigger = TriggerBuilder
                .newTrigger()
                .withIdentity("TRIGGER-ID", "TRIGGER-GROUP")
                .withSchedule(CronScheduleBuilder
                         .cronSchedule("0 0 0/1 * * ?")
                         .inTimeZone(TimeZone.getTimeZone("GMT")))
                ).build();
于 2014-12-09T18:24:37.373 回答
7

如果您使用的是 XML 配置文件,例如quartz-config.xml来自mkyong 的Quartz 中运行多个作业time-zone的示例,您可以在元素中配置时区:

<schedule>
    <job>
        <name>JobA</name>
        <group>GroupDummy</group>
        <description>This is Job A</description>
        <job-class>com.mkyong.quartz.JobA</job-class>
    </job>
    <trigger>
        <cron>
            <name>dummyTriggerNameA</name>
            <job-name>JobA</job-name>
            <job-group>GroupDummy</job-group>
            <!-- It will run every 5 seconds -->
            <cron-expression>0/5 * * * * ?</cron-expression>
            <time-zone>UTC</time-zone>
        </cron>
    </trigger>
</schedule>

另请参阅Java 的 java.util.TimeZone以查看多个时区的 ID。

于 2013-10-23T17:17:03.077 回答
2

您可以调用setTimeZone()为 Quartz 中继承BaseCalendar的任何内容设置您选择的时区。

Java 的TimeZone类有一个getDefault(),它应该有助于以编程方式确定操作系统时区。

于 2013-10-23T14:59:50.120 回答