运行 Quartz Cron Scheduler 取决于从数据库中获取的值

Run Quartz Cron Scheduler depending on value fetched from DB

我的 Spring 项目中有一个 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 运行s 机器一次。我想 运行 根据机器名称的 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();
    }

}

如有任何帮助,我们将不胜感激。

当我遇到这个问题时,我创建了一个 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>

恐怕我没有实现了。

我找到了使用 Spring AOP 拦截 cron 调用的方法的解决方案。

我创建了一个名为 BaseCron 的 class,它实现了 Spring AOP 包的 MethodBeforeAdvice 接口。我覆盖了之前的方法并在那里编写了我的逻辑,该逻辑将在 MyCrons class.

中的每个方法调用之前执行

然后我在 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 class 中存在的 before 方法拦截,我在其中检查了 cron 运行 所在的 属性 机器名称.

干杯!