当前位置: 首页 > 知识库问答 >
问题:

Apache Camel quartz2不应用更改的cron表达式

童化
2023-03-14

我试图在集群模式下使用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版本。

共有1个答案

陆昕
2023-03-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日期。