我试图在集群模式下使用camel-quartz2组件和jdbcjobstore。
quartz.properties文件:
org.quartz.scheduler.instanceId=AUTO
org.quartz.scheduler.instanceName=JobCluster
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.jobStore.dataSource=dsQuartzTest
org.quartz.jobStore.isClustered=true
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=5
org.quartz.dataSource.dsQuartzTest.driver = oracle.jdbc.driver.OracleDriver
org.quartz.dataSource.dsQuartzTest.URL = jdbc:oracle:thin:pmuser@//10.13.13.10:1521/PDB1
org.quartz.dataSource.dsQuartzTest.user = pmuser
org.quartz.dataSource.dsQuartzTest.password = oracle
org.quartz.dataSource.dsQuartzTest.maxConnections = 10
<?xml version="1.0" encoding="UTF-8"?>
<!-- Configures the Camel Context-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
<bean id="quartz2" class="org.apache.camel.component.quartz2.QuartzComponent">
<property name="propertiesFile" value="quartz.properties"/>
</bean>
<bean id="quartzBean" class="com.ubs.rbs.integration.QuartzBean"/>
<camel:camelContext xmlns="http://camel.apache.org/schema/spring">
<camel:route id="quartzRoute">
<camel:from uri="quartz2://tictac?cron=0+0/5+*+1/1+*+?+*"/>
<camel:setBody>
<camel:simple>
${header.triggerName} - ${header.fireTime}
</camel:simple>
</camel:setBody>
<camel:to uri="log:hello"/>
</camel:route>
<!--
<camel:route>
<camel:from uri="timer://updateQuartzRoute?repeatCount=1"/>
<camel:to uri="bean:quartzBean?method=reschedule(*,'quartzRoute')"/>
</camel:route>
-->
</camel:camelContext>
</beans>
public class QuartzBean {
public void reschedule(CamelContext context, String quartzRouteId) throws Exception {
QuartzEndpoint endpoint = (QuartzEndpoint) context.getRoute(quartzRouteId).getEndpoint();
QuartzComponent component = endpoint.getComponent();
Scheduler scheduler = component.getScheduler();
Trigger oldTrigger = scheduler.getTrigger(endpoint.getTriggerKey());
TriggerBuilder tb = oldTrigger.getTriggerBuilder();
Trigger newTrigger = tb.withSchedule(CronScheduleBuilder.cronSchedule(endpoint.getCron())).build();
scheduler.rescheduleJob(oldTrigger.getKey(), newTrigger);
}
}
或者,我可以为camel-quartz2组件打补丁,如下所示(org.apache.camel.component.quartz2.quartzendpoint#AddJobInScheduler):
private void addJobInScheduler() throws Exception {
// Add or use existing trigger to/from scheduler
Scheduler scheduler = getComponent().getScheduler();
JobDetail jobDetail;
boolean triggerExisted = scheduler.getTrigger(triggerKey) != null;
if (triggerExisted) {
ensureNoDupTriggerKey();
}
jobDetail = createJobDetail();
Trigger trigger = createTrigger(jobDetail);
updateJobDataMap(jobDetail);
// Schedule it now. Remember that scheduler might not be started it, but we can schedule now.
Date nextFireDate = triggerExisted ? scheduler.rescheduleJob(triggerKey, trigger) : scheduler.scheduleJob(jobDetail, trigger);
if (LOG.isInfoEnabled()) {
LOG.info("Job {} (triggerType={}, jobClass={}) is scheduled. Next fire date is {}",
new Object[] {trigger.getKey(), trigger.getClass().getSimpleName(),
jobDetail.getJobClass().getSimpleName(), nextFireDate});
}
// Increase camel job count for this endpoint
AtomicInteger number = (AtomicInteger) scheduler.getContext().get(QuartzConstants.QUARTZ_CAMEL_JOBS_COUNT);
if (number != null) {
number.incrementAndGet();
}
jobAdded.set(true);
}
与项目存储库中的当前版本不同,我的版本总是创建新的触发器,如果触发器已经存在,则重新安排作业。
我的问题是:我是否遗漏了一些明显的东西?在这种情况下,该组件应该如何工作?我应该尝试改变组件本身,还是有更好的方法从外部改变它的时间表?
UPD:我尝试了maven的2.13.1版本和Snapshot的2.14版本。
Camel 2.12.2和之前的版本已经知道与石英有关的bug。如果你不是,请尝试2.12.3或更高的版本。
问题内容: 我能够在applicationContext.xml中创建taskScheduler,并且根据该属性定期触发我的工作。 我想在调度程序启动后更改此表达式(触发时间),这意味着JavaEE应用程序正在运行。 使用Spring 3.XX 问题答案: 其实我也遇到过同样的问题 我假设您需要从用户那里获取date(1-31),时间,星期几,调度程序的类型(每日,每月,每周)。 首先,您需要根据
我有一些时间 现在的条件是,当JVM启动时,它将首先检查当前时间和给定时隙的持续时间。下面是检查时长的方法:- 例如,如果JVM在今天17PM开始,那么它将首先检查时隙,它将得到13PM到19PM之间的时隙,并且根据方法findNextSlotDuration将是2小时,因此调度器将在2小时后开始,即在19PM。另一种情况是,如果JVM今天在19小时00分29秒启动,那么它将得不到插槽,那么持续时
我有点卡在最新的石英2.2和spring 4.1上...这里有一个cron触发器,为了清楚起见,我省略了这个工作和其他一些琐碎的事情: 现在,我需要在运行时更改它的cronExpression,而且这并不像我想象的那么简单。我无法引用bean并更改属性,因为它是一个提供CronTrigger接口的工厂,而CronTrigger接口不再具有setCronExpression方法,它已经变得不可变。然
我正在使用石英调度程序来安排我的工作。我有一个错误的cron表达式: 当我这样做的时候: is。但是当我查看表达式时,它显然是错误的。其他人也面临类似的问题吗? 注:包装为:包装组织。石英 石英的版本是:2.2.3 请检查来自的CronExpression类http://www.javadoc.io/doc/org.quartz-scheduler/quartz/2.2.3 我还尝试了类的方法,但
我正在尝试在特定时间调用API。但有时api调用可能会失败,所以我制定了一个逻辑来检查api调用何时失败。 确认api调用失败后,我想将@Schedulercron表达式从当前cron表达式更改为15分钟后。 如何动态更改cron表达式?? 下面是我的API调用代码。
null 上个月的第一天和本月的第一天 上月1日和本月第3个工作日 当前星期的星期一日期和当前星期的staturday日期。