1

运行 Spring 应用程序时出现以下异常:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of 
type [org.quartz.JobDetail] is defined: expected single matching bean but found 2: 
[quartzSchedulerRuntime, jobDetail]

这是我在root-context.xml.

根上下文.xml

<bean name="quartzSchedulerRuntime" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="com.task.QuartzScheduler" />
    <property name="jobDataAsMap">
        <map>
            <entry key="runtimeReportServiceImpl" value-ref="RuntimeReportService"  />
        </map>
    </property>
</bean> 


    <bean id="cronTriggerRuntime"
        class="org.springframework.scheduling.quartz.CronTriggerBean">

        <property name="jobDetail" ref="quartzSchedulerRuntime" />
        <property name="cronExpression" value="0 30 12 ? * MON *" />

</bean>


    <bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
    <property name="schedulerContextAsMap">
        <map>
        <entry key="reportSchedulerServiceImpl" value-ref="reportSchedulerServiceImpl"></entry>
        </map>
        </property>
    <property name="jobDetails">
       <list>
          <ref bean="quartzSchedulerRuntime" />
          <ref bean="jobDetail"/>
       </list>
    </property>

    <property name="triggers">
        <list>
        <ref bean="cronTriggerRuntime" />
        <ref bean="jobTrigger"/>
        </list>
    </property>

    </bean>

    <bean id="jobDetailFactory"
    class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
    <property name="targetBeanName">
        <idref local="jobDetail" />
    </property>

    </bean>

    <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"
    scope="prototype">
    <property name="jobClass" value="com.scheduler.SMTPMailJob " />

     <property name="jobDataAsMap">
        <map>
          <entry key="reportSchedulerServiceImpl" value-ref="reportSchedulerServiceImpl" />
          <entry key="filterUtil" value-ref="filterUtil" />
          <entry key="reportService" value-ref="reportService" />
          <entry key="fusionChartHtmlToImage" value-ref="fusionChartHtmlToImage"/>
          <entry key="fcproperties" value-ref="fcproperties"/>
         </map>
      </property>
    </bean>

    <bean id="jobTriggerFactory"
    class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
    <property name="targetBeanName">
        <idref local="jobTrigger" />
    </property>
    </bean>

    <bean id="jobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean" scope="prototype">
    <property name="jobDetail" ref="jobDetail" />
    <property name="cronExpression" value="0 0 9 1/1 * ? *" /> 
    </bean>

编辑:我已将问题缩小到这个范围。我创建了一个名为 RScheduler 的类,它应该安排作业。在该课程中,我宣布:

Scheduler scheduler;
ObjectFactory<JobDetail> jobDetailFactory;
ObjectFactory<CronTrigger> jobTriggerFactory;

    @Autowired
    public ReportScheduler(Scheduler scheduler,ObjectFactory<JobDetail> jobDetailFactory,ObjectFactory<CronTrigger> jobTriggerFactory)
            throws SchedulerException 
            {
        Assert.notNull(scheduler, "scheduler cannot be null");
        Assert.notNull(jobDetailFactory, "jobDetailFactory cannot be null");
        Assert.notNull(jobTriggerFactory, "jobTriggerFactory cannot be null");
        this.scheduler = scheduler;
        this.jobDetailFactory=jobDetailFactory;
        this.jobTriggerFactory=jobTriggerFactory;
        this.scheduler.getContext().put("reportSchedulerServ", reportSchedulerServ);
        }

我用另一种方法调用这项工作,例如:

JobDetail jobDetail = jobDetailFactory.getObject();

这是给我错误的行。

编辑2:我猜问题是我需要触发许多工作。所以我创建了

ObjectFactory<JobDetail> jobDetailFactory

通过jobDetailFactorybean 捕获对象。我想,线

JobDetail jobDetail = jobDetailFactory.getObject()

无法确定要获取哪个 JobDetail bean,因为它有两个作业详细信息。我不明白@Qualifier符号将如何帮助确定这一点。我可以解决此错误的任何特定方式..?

4

2 回答 2

0

检查您是否在两个作业详细信息 bean 上提供了相同的 bean 名称(重复)@type(“bean name here”)

编辑-你能在这里分享jobdetail(SMTPMailJob和QuartzScheduler)bean类吗?我没有看到 xml 配置有任何问题

@Qualifier在自动连接jobdetail bean的地方添加注释

例如

如果你是自动连接 Quartzscheduler 那么

@Autowired
@Qualifier(Quartzscheduler)
public JobDetail quartzSchedulerbean

因为你有两个 job-detail bean ,所以在运行时 spring 不知道要连接哪个 bean,因为我们引用了它的类型的 beans。所以添加 @Qualifier 注释将告诉 spring 自动连接特定的 bean 实例。

更新:-由于您共享的代码没有给我更多的输入,因此正如我在上面的声明中所说,您所得到的异常的基本问题。

  1. 你有两个类型的 jobdetailsquartz.jobdetail
  2. 你在jobdetail工厂有一个jobdetail。

好的,您说您在执行 objectFactory.getObject() 时遇到异常,这意味着第 2 点,在这种情况下,您不应该遇到问题中提到的异常,因为您在 jobdetail 工厂中只有一个 bean。根据我的理解,当自动装配在 schedulerbeanfactory 中定义的 jobdetails 而不是在 objectfactory 对象中时,您应该得到异常。

编辑-检查此链接自动装配问题和没有唯一的bean

于 2013-10-03T10:06:57.230 回答
0

如您所见,您定义了两个具有相同类型的 bean:

jobDetail 和 quartzSchedulerRuntime 的类型为 org.springframework.scheduling.quartz.JobDetailBean

您可以通过它们的名称(quartzSchedulerRuntime / jobDetail)来区分它们,但如果您按类型(...JobDetailBean)自动装配它们,那就很模糊了。

于 2013-10-03T11:18:47.327 回答