标签: quartz-scheduler

Quartz.net Scheduler 使用集群

我正在使用集群选项,但我遇到了一些问题:

  1. 当我使用两台机器时,我创建的作业在开始时运行,与他们的定义无关。例如:如果我将作业定义为每 10 秒运行一次,它可以在开始时每两秒运行一次,并且只有从第 2 次运行它才正确 - 每 10 秒。

  2. 两台机器在同一分钟内(但不是在同一毫秒内)执行相同的工作并一起运行两次工作,我尝试使用锁处理程序属性,但也许我没有很好地定义它..

这是我的代码:

NameValueCollection properties = new NameValueCollection();

properties["quartz.scheduler.instanceName"] = "TestSchedulerNECH";
properties["quartz.scheduler.instanceId"] = "instance_one";
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "200";
properties["quartz.threadPool.threadPriority"] = "Normal";
properties["quartz.jobStore.misfireThreshold"] = "60000";
properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
properties["quartz.jobStore.useProperties"] = "false";
properties["quartz.jobStore.dataSource"] = "default";
properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
properties["quartz.jobStore.clustered"] = "true";
properties["quartz.jobStore.lockHandler.type"] = "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz";
properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz";
properties["quartz.dataSource.default.connectionString"] = "Server=localhost;Database=mydb;Trusted_Connection=False;User=admin;Password=123456";
properties["quartz.dataSource.default.provider"] = "SqlServer-20";


ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler sched = sf.GetScheduler();

string schedId = sched.SchedulerInstanceId;

for …
Run Code Online (Sandbox Code Playgroud)

.net c# quartz-scheduler quartz.net

5
推荐指数
1
解决办法
3589
查看次数

如何配置石英调度程序以占用数据库中存储的作业并在服务器重启时执行?

我一直在使用石英调度程序每小时发送大量电子邮件,这工作得非常好。这个调度器被显式调用一次。当服务器在调度程序执行过程中重新启动时,就会出现问题。虽然quartz调度器在JOB_DETAILS表中创建了一条记录,但不占用服务器启动时自动执行的任务。

任何解决此问题的帮助表示赞赏。

以下是示例代码和当前配置。

SchedulerFactory factory = new StdSchedulerFactory();
    Scheduler scheduler;
    try {
        scheduler = factory.getScheduler();

        // Creating Job and link to our Job class
        JobDetailImpl jobDetail = new JobDetailImpl();
        jobDetail.setName(jobName);
        jobDetail.setJobClass(HelloJob.class);


        int repeat = totalBal/Constants.HOURLY_LIMIT;
        System.out.println("totalBal : "+totalBal+ " | "+ "repeat : "+repeat);
        // Creating schedule time with trigger
        SimpleTriggerImpl simpleTrigger = new SimpleTriggerImpl();
        simpleTrigger.setStartTime(new Date(
                System.currentTimeMillis() + 1000));
        simpleTrigger.setRepeatCount(repeat); // SimpleTrigger.REPEAT_INDEFINITELY
        //simpleTrigger.setRepeatInterval(3600000);
        simpleTrigger.setRepeatInterval(5000);
        simpleTrigger.setName(jobName);

        // Start scheduler
        System.out.println("Scheduler Started");
        scheduler.start();
        scheduler.getContext().put("externalInstance", cmpgId);
        scheduler.scheduleJob(jobDetail, simpleTrigger);

    } catch (SchedulerException e) …
Run Code Online (Sandbox Code Playgroud)

java mysql jdbc quartz-scheduler

5
推荐指数
1
解决办法
6815
查看次数

石英集群调度程序死锁

在 6 个实例上运行石英集群调度程序时,我们随机得到以下异常:

无法获取下一个触发器:尝试获取锁时发现死锁;尝试重新启动事务

这是我们的quartzConfig.properties

    scheduler.skipUpdateCheck = true
    scheduler.instanceName = 'quartzScheduler'
    scheduler.instanceId = 'AUTO'
    threadPool.threadCount = 13
    threadPool.threadPriority = 5
    jobStore.misfireThreshold = 300000
    jobStore.'class' = 'org.quartz.impl.jdbcjobstore.JobStoreTX'
    jobStore.driverDelegateClass = 'org.quartz.impl.jdbcjobstore.StdJDBCDelegate'
    jobStore.useProperties = true
    jobStore.dataSource = 'myDS'
    jobStore.tablePrefix = 'QRTZ_'
    jobStore.isClustered = true
    jobStore.clusterCheckinInterval = 10000
    dataSource.myDS.driver='com.mysql.jdbc.Driver'
    dataSource.myDS.maxConnections = 15
Run Code Online (Sandbox Code Playgroud)

我们在mysql db的应用程序中使用quartz grails插件(带有quartz 2.2.1)。

mysql quartz-scheduler

5
推荐指数
0
解决办法
807
查看次数

*/5 和 0/5 之间的 Cron 表达式差异

我有一个 cron 属性文件,其中一些属性包含如下表达式:

"* 0/5 * * * ?"
Run Code Online (Sandbox Code Playgroud)

其中一些包含:

"* */5 * * * ?"
Run Code Online (Sandbox Code Playgroud)

两者有什么区别?

如果我想每 5 分钟运行一次,那么应该使用哪一个?

谢谢

PS:我的项目正在使用 spring 调度程序。

quartz-scheduler

5
推荐指数
1
解决办法
9525
查看次数

为石英线程池设置线程数

我已经创建了文件quartz.properties并将其放在类路径中。属性是

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 1
Run Code Online (Sandbox Code Playgroud)

但是当我启动应用程序时,我收到此消息

Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
Run Code Online (Sandbox Code Playgroud)

它是否加载属性?无论如何,我只为调度程序运行一个线程......

spring quartz-scheduler

5
推荐指数
1
解决办法
8453
查看次数

QUARTZ :不支持星期几和月份参数

我正在使用cron-utils库进行调度。当我同时提供 DoM 和 DoW 时,我得到以下异常

不支持星期几和月份参数。

我发现这个异常符合 QUARTZ 规范。
我想知道为什么不支持?因为它似乎是在“ 9 月 5 日仅在星期日”运行类似的有效要求
我是否需要编写两个单独的表达式并取其交集?
这个问题的推荐解决方案是什么?

cron quartz-scheduler

5
推荐指数
0
解决办法
1436
查看次数

Java Spring 调度程序锁

我一直在尝试向我的客户发送通知。我正在使用 kubernetes 并且我创建了多个 Spring Boot 应用程序,因为我有 2 个副本。这一切都很好,但是当调度程序运行时,他们每个人都可以发送通知。我看过一点点石英,但配置似乎有点复杂。有没有简单的方法来做到这一点?

@Scheduled(fixedDelayString = "300000")
public void sendFlowerNotification() {
  //Code
}
Run Code Online (Sandbox Code Playgroud)

java spring scheduler quartz-scheduler

5
推荐指数
1
解决办法
7401
查看次数

Quartz 集群 - @DisallowConcurrentExecution 避免跨实例并行运行

我有 springBoot 应用程序在多个实例中运行 Quarts (2.3.0),集群模式为 true 。

我已经配置了作业并在每次运行之间提供了 2 秒的延迟。

@Configuration
public class SchedulerConfig {


  @Bean
  public JobDetail jobDetail() {
    return JobBuilder.newJob()
            .ofType(BatchTriggerJob.class)
            .storeDurably()
            .withIdentity("SCHEDULER")
            .withDescription("event")
            .build();
  }

  @Bean
  public Trigger trigger() {
    return TriggerBuilder
            .newTrigger()
            .forJob(jobDetail())
            .withIdentity("BATCH")
            .withDescription("SCHEDULER")
            .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(2)
                    .withMisfireHandlingInstructionIgnoreMisfires())
            .build();
  }

}
Run Code Online (Sandbox Code Playgroud)

我已启用 DisallowConcurrentExecution

@DisallowConcurrentExecution
public class BatchTriggerJob extends QuartzJobBean {

  @Autowired
  private SchedulerService schedulerService;

  @Override
  protected void executeInternal(JobExecutionContext context) {
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    schedulerService.processBatch(); //business logic and may take more than 2 sec
  }

}
Run Code Online (Sandbox Code Playgroud)

应用程序.yml

quartz:
    job-store-type: …
Run Code Online (Sandbox Code Playgroud)

java quartz-scheduler spring-scheduled spring-boot

5
推荐指数
1
解决办法
2682
查看次数

为什么我的 Quartz 触发器在重新启动 Spring boot 应用程序时没有更新更改的 Cron 表达式?

我在 Spring Boot 应用程序中创建了一个 Cron 计划触发器,如下所示,它被完美地触发。问题是,当我更改下面代码中的 Cron 计划表达式并重新启动 Spring Boot 应用程序时,Cron 计划触发器没有更新,并且仍然触发旧的 Cron 计划表达式值。

在检查数据库表时,我发现表 qrtz_cron_triggers 中的记录没有更新。

qrtz_cron_triggers表中的记录是

“quartzScheduler”“Qrtz_NEReportProcessor_Job_Trigger”“默认”“0 30 22?* *”“亚洲/加尔各答”

如何确保在重新启动我的 Spring Boot 应用程序时, cron 计划表达式值得到更新?我的代码如下。

    @Bean(name = "nRJobDetail")
    public JobDetail nRJobDetail() {
        return newJob().ofType(NEReportJob.class).storeDurably().withIdentity(JobKey.jobKey("Qrtz_NEReportProcessor_Job_Detail")).withDescription("Invoke NEReportProcessor Job service...").build();
    }

    @Bean
    public Trigger nRTrigger(@Qualifier("nRJobDetail") JobDetail job) {
        return newTrigger().forJob(job).withIdentity(TriggerKey.triggerKey("Qrtz_NEReportProcessor_Job_Trigger")).withDescription("NEReportProcessor trigger")
                .withSchedule(CronScheduleBuilder.cronSchedule("0 00 23 ? * *")
                )
                .build();
    }
Run Code Online (Sandbox Code Playgroud)

java cron quartz-scheduler spring-boot

5
推荐指数
1
解决办法
4392
查看次数

Spring Boot Quartz - 显示 SQL 语句

我将 Quartz 与 Spring Boot 和 postgres 数据库一起使用作为 Quartz 内容的持久存储。我想在控制台中查看 sql 日志,quartz 正在后台执行。我尝试了许多配置属性来启用它,但没有一个起作用。有人可以告诉我如何启用它吗?到目前为止我使用了以下道具:

spring:
  quartz:
    job-store-type: jdbc
    jdbc:
      initialize-schema: NEVER
    properties:
      org:
        quartz:
          jobStore:
            driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
  jpa:
    show-sql: true
    properties:
      hibernate:
        show_sql: true
        use_sql_comments: true
        format_sql: true

logging:
  level:
    org:
      quartz: DEBUG
      hibernate:
        SQL: DEBUG
      postgres: DEBUG
      springframework:
        jdbc:
          core:
            JdbcTemplate: DEBUG
            StatementCreatorUtils: TRACE
Run Code Online (Sandbox Code Playgroud)

java spring quartz-scheduler spring-boot quartz

5
推荐指数
0
解决办法
602
查看次数