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

Spring模块化石英配置

应和光
2023-03-14

我正在开发Spring MVC Web应用程序,它使用JDBC Quartz Scheduler来执行作业。这个Web应用程序有多个服务,每个服务都打包为jar并具有关联的作业。我在Web项目中有一个石英配置,在该配置下我为作业、触发器和调度程序创建了bean。在调度程序配置下,我指定了触发器列表。当我们开始我们的项目时,这很好。随着我们开始添加功能,作业数量增加,现在大约有100个。维护这个文件变得很困难。是否有任何方法可以使其模块化,以便在单个文件中不定义调度程序的作业/触发器/关联触发器。

 <bean name="incidentAutoClosure" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <property name="jobClass" value="itsm.scheduler.task.IncidentAutoClosureTask"/>
 </bean>
 <bean id="incidentAutoClosureTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="incidentAutoClosure" />
    <property name="cronExpression" value="0 0 12 1/1 * ? *" />
 </bean>
 <bean id="quartzJdbcScheduler"
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
    p:waitForJobsToCompleteOnShutdown="true">
    <property name="autoStartup" value="true" />
    <property name="startupDelay" value="0" />
    <property name="overwriteExistingJobs" value="false" />
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.scheduler.instanceName">mvcJdbcScheduler</prop>
            <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
            <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.PostgreSQLDelegate</prop>
            <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
            <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
            <prop key="org.quartz.threadPool.threadCount">${quartz.async.threadCount}</prop>
            <prop key="org.quartz.threadPool.threadPriority">${quartz.async.threadPriority}</prop>
            <prop key="org.quartz.jobStore.misfireThreshold">${quartz.async.misfireThreshold}</prop>
            <prop key="org.quartz.jobStore.isClustered">true</prop>
            <prop key="org.quartz.scheduler.threadsInheritContextClassLoaderOfInitializer">true</prop>
                <prop key="org.quartz.plugin.jobHistory.class">org.quartz.plugins.history.LoggingJobHistoryPlugin</prop>
                <prop key="org.quartz.plugin.jobHistory.jobToBeFiredMessage">${quartz.async.initTriggerFormat}</prop>
                <prop key="org.quartz.plugin.jobHistory.jobSuccessMessage">${quartz.async.endTriggerFormat}</prop>
        </props>
    </property>
     <property name="triggers">
        <list>
                <ref bean="incidentAutoClosureTrigger" />
                <!-- List of 100 Jobs -->
        </list>
    </property>
</bean>

共有2个答案

张智
2023-03-14

您可以通过一个配置类以编程方式实现,该类将自动配置bean,而不是使用xml文件;

这是我用过的。注意:将applicationContext添加到jobFactory中可以让Quartz schedule作业在执行作业时意识到spring autowired类,否则将获得空autowired

@Configuration
public class PortalQuartzSchedulerConfiguration {

  @Autowired
  private ApplicationContext applicationContext;

  @Bean
  public JobFactory jobFactory() {
    ApplicationContextHolder jobFactory = new ApplicationContextHolder();
    jobFactory.setApplicationContext(applicationContext);
    return jobFactory;
  }

  @Bean
  public SchedulerFactoryBean schedulerFactory() {
    SchedulerFactoryBean factory = new SchedulerFactoryBean();
    factory.setAutoStartup(true);
    factory.setSchedulerName("Portal scheduler");
    factory.setOverwriteExistingJobs(true);
    factory.setJobFactory(jobFactory());
    return factory;
  }

}
宰父淳
2023-03-14

你用的是Spring靴吗?解决这个问题的一个好方法是创建自动配置类,在这个类中可以有一个组合列表。以下是一个示例:

@Configuration
@ConditionalOnBean(SomeClassDependency.class)
public class JobConfig {

    @Bean
    @ConditionalOnProperty(....)
    public SchedulerFactoryBean config1() {
        ....
    }

    @Bean
    @ConditionalOnProperty(....)
    public SchedulerFactoryBean config2() {
        ....
    }

    @Bean
    @ConditionalOnProperty(....)
    public SchedulerFactoryBean config3() {
        ....
    }
}

public class MyDependency {

    private final SchedulerFactoryBean schedulerFactoryBean;

    public MyDependency(@Qualifier("config2") SchedulerFactoryBean schedulerFactoryBean) {
        this.schedulerFactoryBean = schedulerFactoryBean
    }
}
 类似资料:
  • 所以我有一个技术挑战我需要帮助。 一个大型项目正在使用Quartz调度程序调度一个作业,使其在每晚9点运行。 然而,调度的作业需要从属性文件中读取值,使用自动布线获取一些bean等。 当我使用@autowired和@value注释时,我发现这些值为空。 问题是Quartz在spring容器外部使用创建JobDetail对象。可以在下面的代码中看到。 因此,包装的对象无法使用Spring访问属性文件

  • 我们正在寻找不同模块分别指定@ComponentScan、@EnableJpaRepositories和EntityManagerFactory的方法。setPackagesToScan。 我们将多个代码模块组合到Web应用程序中。此外,我们允许对基本代码进行客户特定的扩展,可以添加额外的包。在我的测试中,我发现我可以添加一个额外的java配置类,并且在@ComponentScan和@Enable

  • 另外,如果我使用下面的语句而不是自动调用Spring Quartz调度器,那么作业将成功激发 请让我知道我做错了什么...

  • 乡亲们, 我正在尝试用Quartz调度器实现Spring boot,以便在java中调度作业。我的经理建议根据作业id为所有作业使用具有不同实施服务的单个作业。但我不能说服所有服务实施都使用单个作业。 请指导我使用多个服务类的单个作业或为每个服务编写每个作业。 提前感谢。。

  • 问题内容: 似乎Quartz Scheduler每秒可以运行的作业数量受到限制。在我们的方案中,我们每秒大约有20个作业,可以进行24x7的启动,而石英可以很好地完成每秒10个作业(对于JDBC支持的JobStore,它具有100个石英线程和100个数据库连接池大小),但是,当我们将其增加到20个时每秒的作业数量,石英变得非常非常慢,与实际的计划时间相比,石英的触发作业非常晚,从而导致许多失火,并

  • 我正在使用带有TerracottaJobStore Class的石英调度程序来每5分钟调度一次作业。我的工作配置是: 组织。石英jobStore。class=org。陶土。石英EnterpriseTerracottaJobStore组织。石英jobStore。tcconfig=localhost:9510 org。石英线程池。线程数=25 我有一个附加了5000个触发器的单个作业,然后该作业被安排