我正在使用集群选项,但我遇到了一些问题:
当我使用两台机器时,我创建的作业在开始时运行,与他们的定义无关。例如:如果我将作业定义为每 10 秒运行一次,它可以在开始时每两秒运行一次,并且只有从第 2 次运行它才正确 - 每 10 秒。
两台机器在同一分钟内(但不是在同一毫秒内)执行相同的工作并一起运行两次工作,我尝试使用锁处理程序属性,但也许我没有很好地定义它..
这是我的代码:
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) 我一直在使用石英调度程序每小时发送大量电子邮件,这工作得非常好。这个调度器被显式调用一次。当服务器在调度程序执行过程中重新启动时,就会出现问题。虽然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) 在 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)。
我有一个 cron 属性文件,其中一些属性包含如下表达式:
"* 0/5 * * * ?"
Run Code Online (Sandbox Code Playgroud)
其中一些包含:
"* */5 * * * ?"
Run Code Online (Sandbox Code Playgroud)
两者有什么区别?
如果我想每 5 分钟运行一次,那么应该使用哪一个?
谢谢
PS:我的项目正在使用 spring 调度程序。
我已经创建了文件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)
它是否加载属性?无论如何,我只为调度程序运行一个线程......
我正在使用cron-utils库进行调度。当我同时提供 DoM 和 DoW 时,我得到以下异常
不支持星期几和月份参数。
我发现这个异常符合 QUARTZ 规范。
我想知道为什么不支持?因为它似乎是在“ 9 月 5 日仅在星期日”运行类似的有效要求
我是否需要编写两个单独的表达式并取其交集?
这个问题的推荐解决方案是什么?
我一直在尝试向我的客户发送通知。我正在使用 kubernetes 并且我创建了多个 Spring Boot 应用程序,因为我有 2 个副本。这一切都很好,但是当调度程序运行时,他们每个人都可以发送通知。我看过一点点石英,但配置似乎有点复杂。有没有简单的方法来做到这一点?
@Scheduled(fixedDelayString = "300000")
public void sendFlowerNotification() {
//Code
}
Run Code Online (Sandbox Code Playgroud) 我有 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) 我在 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) 我将 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) quartz-scheduler ×10
java ×5
spring ×3
spring-boot ×3
cron ×2
mysql ×2
.net ×1
c# ×1
jdbc ×1
quartz ×1
quartz.net ×1
scheduler ×1