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

引用的工作

范甫
2023-03-14

我在没有得到标题中提到的错误的情况下成功调度作业时遇到了一些麻烦,具体来说:触发器引用的作业(CRAWLS。my_repos)不存在。[请参见嵌套异常:org.quartz.JobPeristextExcture:触发器引用的作业(CRAWLS.my_repos)不存在。]

下面是代码的一部分。。。其中,一切似乎都应该是好的。

运行作业方法。。。需要注意的主要问题是,它在以下行中失败:m\u调度器。调度作业(触发器) 方法的其余部分在那里,以防它的其余部分有用。

public void runJob(JobInfo jobInfo, 
        com.lawson.search.spi.common.Properties jobProperties)
{
    try {
        JobDataMap jobDataMap = QuartzUtils.createJobDataMapFromLesProperties(jobProperties);
        if (jobExists(jobInfo)) {
            m_scheduler.triggerJob(jobKey(jobInfo.getName(), jobInfo.getGroup()), jobDataMap);
        } else {
            JobDetail job = QuartzUtils.createJobDetailFromJobInfo(jobInfo);
            Trigger trigger = newTrigger()
                .forJob(job)
                .withIdentity(getImmediateTriggerName(jobInfo))
                .build();
            m_scheduler.scheduleJob(trigger);
        }
    } catch (SchedulerException e) {
        String msg = "runJob: " + jobInfo;
        if (s_log.isDebugEnabled()) {
            s_log.debug(msg, e);
        }
        throw new JobSchedulerException(msg, e);
    }
}

createJobDetailFromJobInfo()方法很简单,但很重要:

static JobDetail createJobDetailFromJobInfo(JobInfo theJobInfo)
{
  JobDetail detail = newJob(QuartzJobAdapter.class)
    .withIdentity(theJobInfo.getName(), theJobInfo.getGroup())
    .storeDurably()
    .build();
  return detail;
}

我能想到的唯一其他重要方法是getImmedia ateTriggerName()方法,我认为它可能会引起问题...但是我不知道为什么。

private String getImmediateTriggerName(JobInfo jobInfo)
{
    return jobInfo.getName() + "#" + jobInfo.getGroup() + ":" + System.currentTimeMillis();
}

任何帮助都将不胜感激。

共有2个答案

姜经武
2023-03-14

当我遇到这个错误时,是因为我向myJobClass注册了作业。getClass(),但我让guice在类周围包装了一个拦截器,因此类名不匹配(即运行时类是…$$EnhancerByGuice$$13db15)。类似的事情可能会发生在Spring。

姬浩渺
2023-03-14

尝试使用调度作业

// Schedule the job with the trigger 
m_scheduler.scheduleJob(job, trigger);

而不是

m_scheduler.scheduleJob(trigger);

来自石英调度器。组织:

如何:在2.1中安排作业。x和如何:在2.2中安排作业。十、

两个版本的代码相同

// Define job instance
JobDetail job1 = newJob(ColorJob.class)
    .withIdentity("job1", "group1")
    .build();

// Define a Trigger that will fire "now", and not repeat
Trigger trigger = newTrigger()
    .withIdentity("trigger1", "group1")
    .startNow()
    .build();

// Schedule the job with the trigger 
sched.scheduleJob(job, trigger);

无论如何,只有当quartz在触发器存储于storeTrigger方法期间无法检索触发器的jobkey的JobDetail时,才会引发异常

if (retrieveJob(newTrigger.getJobKey()) == null) {
    throw new JobPersistenceException("The job ("
            + newTrigger.getJobKey()
            + ") referenced by the trigger does not exist.");
}

// add to triggers array
triggers.add(tw);

......

public JobDetail retrieveJob(JobKey jobKey) {
    synchronized(lock) {
        JobWrapper jw = jobsByKey.get(jobKey);
        return (jw != null) ? (JobDetail)jw.jobDetail.clone() : null;
    }
}

因此,您的错误非常奇怪,因为jobkey以前是在TriggerBuilder类的forJob方法中分配的

public TriggerBuilder<T> forJob(JobDetail jobDetail) {
    JobKey k = jobDetail.getKey();
    if(k.getName() == null)
        throw new IllegalArgumentException("The given job has not yet had a name assigned to it.");
    this.jobKey = k;
    return this;
}

试着安排工作

m_scheduler.scheduleJob(job, trigger);

首先,如前所述,如果不起作用,则应调试代码并检查作业密钥,如果密钥正确,则问题可能不在代码中,而是石英配置不匹配。

 类似资料:
  • 问题内容: 我想知道您(SO读者)使用Workflow Engines解决的特定问题,以及如果您不自己动手使用的库/框架。我还想知道何时工作流引擎不是最佳选择,以及您是否/如何选择更简单的东西,例如使用状态机的TaskList / WorkList / Task-Management类型应用程序。 问题: 您使用工作流引擎解决了哪些问题? 您使用了哪些库/框架? 什么时候像系统这样简单的状态机/任

  • 工程引用是TypeScript 3.0的新特性,它支持将TypeScript程序的结构分割成更小的组成部分。 这样可以改善构建时间,强制在逻辑上对组件进行分离,更好地组织你的代码。 TypeScript 3.0还引入了tsc的一种新模式,即--build标记,它与工程引用协同工作可以加速TypeScript的构建。 让我们来看一个非常普通的工程,并瞧瞧工程引用特性是如何帮助我们更好地组织代码的。

  • 介绍 引用工具类,主要针对Reference 工具化封装 主要封装包括: SoftReference 软引用,在GC报告内存不足时会被GC回收 WeakReference 弱引用,在GC时发现弱引用会回收其对象 PhantomReference 虚引用,在GC时发现虚引用对象,会将PhantomReference插入ReferenceQueue。此时对象未被真正回收,要等到ReferenceQue

  • 问题内容: 我对Python引用感到困惑。考虑以下示例: 我的任务: 编辑列表中的每个元素 类似地: 在python中,所有内容都按引用进行操作,那么何时创建新对象?我们总是需要和从模块,使对象副本? 请说清楚。 问题答案: 在Python中,变量不是容纳事物​​的盒子,它是指向对象的名称。在您的代码中: ->将名称绑定到字典 ->将名称绑定到列表 ->将名称绑定到另一个列表 您的第三行不是在改变

  • 我有一个谷歌电子表格,有两张表格,人 如果人员B栏中的单元格与公司A栏中的单元格中的文本匹配,那么我需要将公司B栏的内容添加到人员C栏中 之前的人物表: 公司表: 人员名单如下: 我一直试图使用Stackoverflow上其他地方找到的匹配脚本,但没有成功: 我真的被困住了,知道吗?提前感谢您的任何帮助。

  • 我目前正在努力删除一个实体,它涉及到各种关系(只有< code > @ ManyToOne )——然而,Hibernate不删除任何东西——在调用< code>em.remove之后,一切都保持不变。 我有5个实体(< code>E1 - E5),引用问题中的实体(< code>E6)如下: 本身有相反的关系: (省略了id、附加列等...) 每当我调用< code > em . remove(i