根据从DB获取的值运行Quartz Cron Scheduler

时间:2016-10-20 07:26:13

标签: java spring-mvc cron quartz-scheduler

我的Spring Project中有一个Quartz Cron Scheduler,它执行MyCron.java文件中声明的方法。 在quartz.xml文件中,我以这种格式配置了bean:

<beans>
<bean id="wakeUsers" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
        <property name="targetObject" ref="mycron" /> 
        <property name="targetMethod" value="wakeUsers" /> 
</bean>

<bean id="wakeUsersCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="wakeUsers" />
        <property name="timeZone" ref="timeZone" />
        <property name="cronExpression" value="0 0/5 * * * ?" /> 
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <ref bean="wakeUsers" />
            </list>
        </property>

        <property name="triggers">
            <list>
                <ref bean="wakeUsersCronTrigger" />
            </list>
        </property>
</bean>
</beans>

运行正常。问题是,目前我在生产中使用3台机器,而cron在所有这三台机器上运行 机器一下子。我想根据机器名运行cron。当特定计算机名称与。中的名称匹配时 属性,否则cron应该运行。

最好通过Java代码,我想将我存储在数据库中的属性与我的机器名称相匹配,然后再执行我的方法。

我目前实施了以下内容:

public boolean testRun(){

    try {
        InetAddress ip = InetAddress.getLocalHost();
        String hostName = ip.getHostName();

        if(nodeName.equalsIgnoreCase(hostName)){
            return true;
        }
    } catch (UnknownHostException e) {
        logger.error("Error: Unknown Host");
    }
    return false;
} 

public void wakeUsers() throws Exception{
    if (testRun()) {
        myService.wakeUsers();
    }

}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

当我遇到这个时,我创建了一个MethodInvokingJobOnSpecifiedMachine,它是一个可以在所有机器上运行但在机器名称不匹配时什么也不做的bean。

然后工作细节将是:

  <property name="jobDetail">
      <bean class="foo.bar.MethodInvokingJobOnSpecifiedMachine">
          <property name="machineName" value="DatabaseServer"/>
          <property name="targetObject" ref="mycron" /> 
          <property name="targetMethod" value="wakeUsers" /> 
      </bean>
  </property>

我恐怕不再执行了。

答案 1 :(得分:0)

我能够找到一个解决方案,我使用Spring AOP来拦截cron调用的方法。

我创建了一个名为BaseCron的类,它实现了Spring AOP包的MethodBeforeAdvice接口。我之前重写了该方法并在那里编写了我的逻辑,该逻辑将在MyCrons类中的每个方法调用之前执行。

然后我在spring配置文件中创建了一个代理bean:

<bean id="cronsProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target" ref="mycrons" />
        <property name="interceptorNames">
            <list>
                <value>baseCronBean</value>
            </list>
        </property>
</bean>

因此,在我的mycrons中的任何方法被调用之前,它被我的BaseCron类中的before方法截获,在那里我检查了cron将运行的属性机器名。

干杯!