运行 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 运行 所在的 属性 机器名称.
干杯!
我的 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 运行 所在的 属性 机器名称.
干杯!