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

当尝试将触发器存储在Quartz调度程序中时,ClassNotFoundException

邵城
2023-03-14

需要石英调度器方面的帮助。这就是我到目前为止所做的。

Spring定义

<bean id="firstClass" class="com.my.sample.FirstClass">
    // some properties
</bean>

<bean id="secondClass" class="com.my.sample.SecondClass">
    // some properties
</bean>

<bean id="myJob" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="com.my.sample.quartz.job.MyJob" />
    <property name="jobDataAsMap">
        <map>
            <entry key="firstClass" value-ref="firstClass" />
            <entry key="secondClass" value-ref="secondClass" />
        </map>
    </property>
</bean>

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
    <property name="jobDetail" ref="myJob" />
    <property name="repeatInterval" value="10000" />
    <property name="startDelay" value="1000" />
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="quartzProperties" ref="quartzProperties" />
    <property name="jobDetails">
        <list><ref bean="myJob" /></list>
    </property>
    <property name="triggers">
        <list><ref bean="simpleTrigger" /></list>
    </property>
</bean>

类实现

public class MyJob extends QuartzJobBean {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyJob.class);

    private FirstClass firstClass;
    private SecondClass secondClass;

    @Override
    protected void executeInternal(final JobExecutionContext jobExecutionContext) throws JobExecutionException {
        LOGGER.info("Executing job...");

        final AbcClass abcClass = firstClass.getAbc();
        secondClass.testMethod(abcClass);

    }

    public void setFirstClass(final FirstClass firstClass) {
        this.firstClass = firstClass;
    }

    public void setSecondClass(final SecondClass secondClass) {
        this.secondClass = secondClass;
    }
}

public interface MyParent {

    AbcClass getAbc();

}

public class FirstClass implements MyParent, Serializable {

    AbcClass getAbc() {
        // generate abcClass from db

        return abcClass;
    }

}

但我犯了这样的错误

组织。springframework。豆。工厂BeanCreationException:创建名为“org”的bean时出错。springframework。行程安排。石英在URL中定义了SchedulerFactoryBean#0[bundle://343.0:0/META-INF/spring/osgi。xml]:调用init方法失败;嵌套的异常是org。石英JobPersistenceException:无法存储“dataSyncJob”作业的触发器“simpleTrigger”:com。我的样品MyParent[参见org上的嵌套异常:java.lang.ClassNotFoundException:com.my.sample.MyParent]。springframework。豆。工厂支持AbstractAutoWireAbleBeanFactory。initializeBean(AbstractAutowireCapableBeanFactory.java:1455)[428:org.springframework.beans:3.1.4.RELEASE]。。。

项目结构

com.my
    |-sample
        |-MyParent.java
        |-FirstClass.java
        |-SecondClass.java
        |-quartz.job
            |-MyJob.java
    |-other

捆绑配置

<configuration>
    <instructions>
        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
        <Import-Package>
            org.quartz.impl.jdbcjobstore.oracle,
            org.quartz.simpl,
            org.quartz.impl.jdbcjobstore,
            *
        </Import-Package>
        <Export-Package>com.my.*</Export-Package>
        <excludeDependencies>*;scope=provided|runtime</excludeDependencies>
        <DynamicImport-Package>
            org.apache.cxf.*,
            org.springframework.beans.*
        </DynamicImport-Package>
    </instructions>
</configuration>

共有1个答案

夏兴生
2023-03-14

看起来你在做osgi,你需要确保:

  1. 包含com类的包。我的样品MyParent已部署
  2. 使用MyParent类的bundle导入包com。我的清单上的样本。导入包部分下的MF文件

如果您使用的是Maven,那么就可以操纵清单。带有ApacheFelix maven bundle插件的MF文件。

 类似资料:
  • 我想知道是否有一个函数/方法来创建随机时间触发的作业。我的意思是,如果我设置一个cron计划在每周一上午10:00触发,并给出一个时间间隔,比方说30分钟,触发器将总是在9:30到10:30之间关闭。例如,这是cron调度表。

  • 我希望它们按以下顺序运行:job3、job4、job1、job2 在20次运行中,只有大约3次我得到了预期的结果。对于其他任务,要运行的第一个任务几乎是随机的,其余任务的顺序是正确的。一次运行如下:job1,job3,job4,job2或job4,job3,job1,job2 我是不是没有正确理解Quartz中的优先级是如何工作的?我找不到到底发生了什么。

  • 我是第一次使用石英调度器。我没有什么疑问,希望有人能帮我一把。多谢! 多个职务组,一个组内有多个具有唯一名称的职务 一个职务组可以与一个触发器关联,以便该组下的所有职务将同时被激发 我觉得这个组织在调度器软件上是相当正常的。但是,我只找到了使用多个触发器注册相同作业的引用。即使这样,我还是认为用相同的触发器注册多个作业在逻辑上是可以实现的。 > 是否可以根据触发器的名称实现从调度程序获取触发器A?

  • 问题内容: 假设我有一个类似 测试此bean实际上将在其指定日期( 即 最接近每月15日的工作日)触发的最佳方法是什么? 更新 :这应该是一个单元测试,所以我不会启动虚拟机或更改系统时间。 问题答案: 首先,没有必要进行自我测试。它是spring框架的一部分,已经过测试。 更好的测试可能是测试您的cron表达式是否符合您的期望。这里的一种选择是使用Quartz的类。给定一个对象,您可以调用,该表达

  • 我使用Quartz Scheduler(使用JobDetailFactoryBean)和Spring来安排一些作业。现在我通过XmlApplicationContext通过spring配置实现了这一点,我必须将其更改为AnnotationConfigApplicationContext。那么,我如何在AnnotationConfigApplicationContext中实现这个cronjob呢。这