ããã¯ããªã«ãããããŠæžãããã®ïŒ
Quartzã®Jobã®èšå®ãããŒã¿ããŒã¹ã«ä¿åããŠã¿ããããªãšããããšã§ã
ããšãMisfireïŒæ¬æ¥èµ·åãã¹ãæéã«å®è¡ã§ããªãã£ãJob
ã®æ±ãïŒã«ã€ããŠå°ã調ã¹ãŠæžããŠã¿ãŸããã
JobãTriggerã®ãªã©å®çŸ©ãããŒã¿ããŒã¹ã«ä¿åãã
ããã¥ã¡ã³ããšããŠã¯ããã¡ãã§ãããJobStore
ã«ã€ããŠã§ãã
Lesson 9: Job Stores
JobStore
ãã®ãã®ã¯ãQuartsã®Scheduler
ã䜿çšããJob
ãTrigger
ãCalender
ãªã©ã«ã¹ãã¬ãŒãžã¡ã«ããºã ãæäŸãããã®ã§ãã
JobStore (Quartz Enterprise Job Scheduler 2.3.0-SNAPSHOT API)
ãªããJobStore
èªäœã¯Quartzã®å©çšè
ãçŽæ¥æ±ããã®ã§ã¯ãããŸããã
Never use a JobStore instance directly in your code.
Quartzã®èšå®ãã¡ã€ã«ã§ã©ã®JobStore
ã䜿çšãããã¯éžæããŸããããã®æäœãã®ãã®ã¯Quartzãè¡ããŸãã
JobStore
ã®éžæè¢ãšããŠã¯ã以äžããããŸãã
- RAMJobStore ⊠ããŒã¿ã®ä¿åå
ãã¡ã¢ãªãšãã
JobStore
- JDBCJobStoreïŒ
JobStoreTX
ãŸãã¯JobStoreCMT
ïŒ âŠ ããŒã¿ã®ä¿åå
ãããŒã¿ããŒã¹ãšããJobStore
- TerracottaJobStore ⊠ããŒã¿ã®ä¿åå
ãTerracottaãµãŒããŒãšãã
JobStore
ä»åã®ãé¡ã¯ãã¿ã€ãã«ã©ããJDBCJobStoreã«ããŸãã
JDBCJobStoreã¯ãOracleãPostgreSQLãMySQLãMicrosoft SQL ServerãHSQLDBãH2DatabaseãDB2ãªã©å€ãã®ããŒã¿ããŒã¹ã«å¯Ÿå¿ããŠ
ããããã§ãã
䜿çšããæã«ã¯Quartzã䜿çšããããŒãã«ãäœæããŠããå¿
èŠãããããã®SQLã¯ãã¡ãã«é
眮ãããŠããŸãã
https://github.com/quartz-scheduler/quartz/tree/v2.3.2/quartz-core/src/main/resources/org/quartz/impl/jdbcjobstore
ãã®ãã£ã¬ã¯ããªå
ãèŠããšãå®éã«Quartzã察å¿ããŠããããŒã¿ããŒã¹è£œåã確èªã§ãããšæã£ãŠè¯ãããã§ãã
ããŒãžã§ã³ãªã©ã§å©çšããSQLã«å·®ããããã®ããããMySQLã®å Žåã¯InnoDBçšã®ãã®ãšããã§ãªããã®ã®2çš®é¡ããããŸãã
https://github.com/quartz-scheduler/quartz/blob/v2.3.2/quartz-core/src/main/resources/org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql
https://github.com/quartz-scheduler/quartz/blob/v2.3.2/quartz-core/src/main/resources/org/quartz/impl/jdbcjobstore/tables_mysql.sql
ããŒãã«ã®ååã¯ãQRTZ_ããšããæ¥é èŸã§å§ãŸããŸãããããã¯quartz.properties
ã§org.quartz.jobStore.tablePrefix
ãèšå®ããããšã§
å€æŽã§ããŸãã
ãŸã玹ä»æã«ãæžããŸããããJDBCJobStoreã«ã¯2çš®é¡ããããã©ã³ã¶ã¯ã·ã§ã³ç®¡çãQuartzã«ä»»ããå Žåã¯
JobStoreTX
ïŒorg.quartz.impl.jdbcjobstore.JobStoreTX
ïŒããJava EEãµãŒããŒã®ãã©ã³ã¶ã¯ã·ã§ã³ç®¡çã«ä»»ããå Žåã¯
JobStoreCMT
ïŒorg.quartz.impl.jdbcjobstore.JobStoreCMT
ïŒã䜿ããŸãã
ãã®æå®ã¯ãorg.quartz.jobStore.class
ããããã£ã§è¡ããŸãã
JDBCJobStoreé¢ä¿ã®èšå®ã¯ããã¡ãã
ãŸããJDBCJobStoreã䜿çšããããã«ã¯ããã®ä»ã«DataSource
ãšDriverDelegate
ãèšå®ããå¿
èŠããããŸãã
DataSource
ã¯quartz.properties
ã§å®çŸ©ããããã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã®DataSource
ã䜿ãããšã«ãªããŸãã
èšå®ã¯ããã¡ãã
Configuration Reference
DriverDelegate
ã¯ãStdJDBCDelegate
ãŸãã¯ããŒã¿ããŒã¹åºæã®DriverDelegate
ã䜿çšããŸãã
PostgreSQLãMicrosoft SQL Serverãªã©ãããã€ãã®è£œåã«ã¯DriverDelegate
ãããã®ã§ãJDBCJobStoreé¢ä¿ã®ã¯ã©ã¹ãšåãããŠä»¥äžã
åç
§ããŠãã ããã
https://github.com/quartz-scheduler/quartz/tree/v2.3.2/quartz-core/src/main/java/org/quartz/impl/jdbcjobstore
ã§ã¯ãJDBCJobStoreã«ã€ããŠããçšåºŠèŠãã®ã§ãå®éã«äœ¿ã£ãŠã¿ãããšæããŸãã
ãé¡
ä»åã¯ãJava SEç°å¢ã§ã¢ããªã±ãŒã·ã§ã³ãäœæãå®è¡ããããšæãã®ã§ãããmain
ã¡ãœãããæã£ãã¯ã©ã¹ã以äžã®2çš®é¡äœæããããš
æããŸãã
Job
ãšTrigger
ãç»é²ããã ãã®ã¯ã©ã¹
Scheduler
ãèµ·åããã ãã®ã¯ã©ã¹
æåã«Job
ãšTrigger
ã ããç»é²ããŠããã®ã¢ããªã±ãŒã·ã§ã³èªäœã¯çµäºããŸãããã®åŸã§èµ·åããã¯ã©ã¹ã¯ãScheduler
ãèµ·åããã®ã¿ã§
æåã«ç»é²ããJob
ãšTrigger
ãåŒãç¶ãããšã確èªããŸãã
ããã©ã«ãã®RAMJobStore
ã®å Žåã¯ãã¢ããªã±ãŒã·ã§ã³ãçµäºãããšããŒã¿ã倱ãããã¯ãã§ããããã
泚æç¹
ä»åã¯ãã¯ã©ã¹ã¿ãªã³ã°ã¯äœ¿ããŸããã
Lesson 11: Advanced (Enterprise) Features
ãã¡ããåç
§ããŠãã¯ã©ã¹ã¿ãªã³ã°ãããŠããªãç¶æ
ã§è€æ°ã®ã¹ã±ãžã¥ãŒã©ãŒã䜿ããŸãã
How-To: Using Multiple (Non-Clustered) Schedulers
å®éã®èª¬æã¯ããœãŒã¹ã³ãŒããšäžç·ã«ããããšã«ããŸãããã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã
$ java --version
openjdk 17.0.4 2022-07-19
OpenJDK Runtime Environment (build 17.0.4+8-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 17.0.4+8-Ubuntu-120.04, mixed mode, sharing)
$ mvn --version
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 17.0.4, vendor: Private Build, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-126-generic", arch: "amd64", family: "unix"
ããŒã¿ããŒã¹ã«ã¯ãMySQLã䜿ãããšã«ããŸãã
$ mysql --version
mysql Ver 8.0.30 for Linux on x86_64 (MySQL Community Server - GPL)
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.30 |
+-----------+
1 row in set (0.00 sec)
MySQLã¯172.17.0.2ã§åäœããŠãããã®ãšããŸããããŒã¿ããŒã¹ã¯practice
ãã¢ã«ãŠã³ãã¯kazuhira
ïŒpassword
ã§äœæããŠãããã®ãšããŸãã
æºå
MavenäŸåé¢ä¿ãªã©ã
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
</dependencies>
MySQLã䜿çšããã®ã§ãConnector/JãäŸåé¢ä¿ã«å ããŠãããŸãã
SLF4Jã䜿ããã®ã³ã°ã©ã€ãã©ãªã¯Logbackãšããèšå®ã¯æäœéã§äœæã
src/main/resources/logback.xml
xml version="1.0" encoding="utf-8"
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
MySQLã«Quartzã®ããŒãã«ãäœæãã
æåã«ãMySQLã«Quartzã§å¿
èŠãªããŒãã«ãäœæããŠãããŸãããã
SQLãã¡ã€ã«ãcurl
ã§ååŸããŠããã®ãŸãŸmysql
ã³ãã³ãã§å®è¡ããããšã«ããŸããã
$ curl -sL https://raw.githubusercontent.com/quartz-scheduler/quartz/v2.3.2/quartz-core/src/main/resources/org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql | mysql -ukazuhira -p practice
åºåãããæ
å ±ã
Note (Code 1051): Unknown table 'practice.QRTZ_FIRED_TRIGGERS'
Note (Code 1051): Unknown table 'practice.QRTZ_PAUSED_TRIGGER_GRPS'
Note (Code 1051): Unknown table 'practice.QRTZ_SCHEDULER_STATE'
Note (Code 1051): Unknown table 'practice.QRTZ_LOCKS'
Note (Code 1051): Unknown table 'practice.QRTZ_SIMPLE_TRIGGERS'
Note (Code 1051): Unknown table 'practice.QRTZ_SIMPROP_TRIGGERS'
Note (Code 1051): Unknown table 'practice.QRTZ_CRON_TRIGGERS'
Note (Code 1051): Unknown table 'practice.QRTZ_BLOB_TRIGGERS'
Note (Code 1051): Unknown table 'practice.QRTZ_TRIGGERS'
Note (Code 1051): Unknown table 'practice.QRTZ_JOB_DETAILS'
Note (Code 1051): Unknown table 'practice.QRTZ_CALENDARS'
Warning (Code 1681): Integer display width is deprecated and will be removed in a future release.
Warning (Code 1681): Integer display width is deprecated and will be removed in a future release.
Warning (Code 1681): Integer display width is deprecated and will be removed in a future release.
Warning (Code 1681): Integer display width is deprecated and will be removed in a future release.
Warning (Code 1681): Integer display width is deprecated and will be removed in a future release.
Warning (Code 1681): Integer display width is deprecated and will be removed in a future release.
Warning (Code 1681): Integer display width is deprecated and will be removed in a future release.
Warning (Code 1681): Integer display width is deprecated and will be removed in a future release.
Warning (Code 1681): Integer display width is deprecated and will be removed in a future release.
Warning (Code 1681): Integer display width is deprecated and will be removed in a future release.
Warning (Code 1681): Integer display width is deprecated and will be removed in a future release.
Warning (Code 1681): Integer display width is deprecated and will be removed in a future release.
SQLãã¡ã€ã«ãããªãå€ãããããããããèŠåãåºãŠããŸããâŠã
ããŒãã«ã¯ããã ãäœæãããŸããã
mysql> show tables;
+
| Tables_in_practice |
+
| QRTZ_BLOB_TRIGGERS |
| QRTZ_CALENDARS |
| QRTZ_CRON_TRIGGERS |
| QRTZ_FIRED_TRIGGERS |
| QRTZ_JOB_DETAILS |
| QRTZ_LOCKS |
| QRTZ_PAUSED_TRIGGER_GRPS |
| QRTZ_SCHEDULER_STATE |
| QRTZ_SIMPLE_TRIGGERS |
| QRTZ_SIMPROP_TRIGGERS |
| QRTZ_TRIGGERS |
+
11 rows in set (0.00 sec)
ããã§ãQuartzã®ããŒã¿ãMySQLã«ä¿åããæºåãã§ããŸããã
ã¢ããªã±ãŒã·ã§ã³ãäœæãã
ã§ã¯ããœãŒã¹ã³ãŒããäœæããŠãããŸãã
ãŸãã¯Job
ã®äœæã
src/main/java/org/littlewings/quartz/PrintMessageJob.java
package org.littlewings.quartz;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PrintMessageJob implements Job {
Logger logger = LoggerFactory.getLogger(PrintMessageJob.class);
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDetail jobDetail = context.getJobDetail();
JobKey jobKey = jobDetail.getKey();
String name = jobKey.getName();
String group = jobKey.getGroup();
JobDataMap jobDataMap = jobDetail.getJobDataMap();
String message = jobDataMap.getString("message");
logger.info("[{} / {}] execute job, messege = [{}]", name, group, message);
}
}
ãã£ãããªã®ã§ãJobDataMap
ã䜿ãããã«ããŸããã
次ã«ãmain
ã¡ãœãããæã£ãã¯ã©ã¹ãäœæããŠãããŸããããä»åã¯ä»¥äžã®2ã€ã®main
ã¯ã©ã¹ãäœæããããšã«ããããã§ããã
Job
ãšTrigger
ãç»é²ããã ãã®ã¯ã©ã¹
Scheduler
ãèµ·åããã ãã®ã¯ã©ã¹
èšå®ãã¡ã€ã«ã¯åããã®ã䜿ãããå¥ã
ã«ãããã¡ãã£ãšèããŸããã
çµæãšããŠã¯Cookbookã®ïŒéã¯ã©ã¹ã¿ãŒç°å¢ã§ïŒè€æ°ã®Scheduler
ãæ±ãæ¹æ³ãæžããŠããã®ã§ããã¡ãã«ç¿ããŸããã
åãååã®ã¹ã±ãžã¥ãŒã©ãŒã䜿ããªããè€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã§Scheduler#start
ãåŒã³åºããªãããšããšããã®ããã€ã³ãã®ããã§ãã
Never start (scheduler.start()) a non-clustered instance against the same set of database tables that any other instance with the same scheduler name is running (start()ed) against. You may get serious data corruption, and will definitely experience erratic behavior.
How-To: Using Multiple (Non-Clustered) Schedulers
ãã¡ãã®èšèŒã«ç¿ããJob
ãTrigger
ãç»é²ããã¢ããªã±ãŒã·ã§ã³ã§ã¯Scheduler#start
ã¯åŒã³åºãããScheduler
ãèµ·åããã¯ã©ã¹ã®ã¿ã§
Scheduler#start
ãåŒã³åºãããšã«ããŸãã
- In âApp Aâ create âScheduler Aâ (with config that points it at database tables prefixed with âAâ), and invoke start() on âScheduler Aâ. Now âScheduler Aâ in âApp Aâ will execute jobs scheduled by âScheduler Aâ in âApp Aâ
- In âApp Aâ create âScheduler Bâ (with config that points it at database tables prefixed with âBâ), and DO NOT invoke start() on âScheduler Bâ. Now âScheduler Bâ in âApp Aâ can schedule jobs to be ran where âScheduler Bâ is started.
- In âApp Bâ create âScheduler Bâ (with config that points it at database tables prefixed with âBâ), and invoke start() on âScheduler Bâ. Now âScheduler Bâ in âApp Bâ will execute jobs scheduled by âScheduler Bâ in âApp Aâ.
Job
ãšTrigger
ãç»é²ããã ãã®ã¯ã©ã¹ã
src/main/java/org/littlewings/quartz/JobDefinitionRegister.java
package org.littlewings.quartz;
import java.util.Set;
import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class JobDefinitionRegister {
public static void main(String... args) {
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobDetail jobDetail =
JobBuilder
.newJob(PrintMessageJob.class)
.withIdentity("job1", "job-group1")
.usingJobData("message", "Hello JDBC Store Job")
.build();
Trigger trigger =
TriggerBuilder
.newTrigger()
.withIdentity("trigger1", "trigger-group1")
.withSchedule(
SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(3)
.repeatForever()
)
.build();
scheduler.scheduleJob(jobDetail, Set.of(trigger), true);
scheduler.shutdown(true);
} catch (SchedulerException e) {
e.printStackTrace();
} finally {
AbandonedConnectionCleanupThread.checkedShutdown();
}
}
}
ãã¡ãã¯ãJobDetail
ãšTrigger
ã®å®çŸ©ãšScheduler
ãžã®ç»é²ã ãè¡ããScheduler#start
ã¯åŒã³åºããªãããšããã€ã³ãã§ãã
Job
èªäœã¯ã3ç§ã«1åå®è¡ããŸãã
ç¶ããŠãScheduler
ãèµ·åããã ãã®ã¯ã©ã¹ã
src/main/java/org/littlewings/quartz/ScheduledRunner.java
package org.littlewings.quartz;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.concurrent.TimeUnit;
import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
public class ScheduledRunner {
public static void main(String... args) {
Scheduler scheduler = null;
try {
scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
waitFor(Duration.ofSeconds(20L));
} catch (SchedulerException e) {
e.printStackTrace();
} finally {
if (scheduler != null) {
try {
scheduler.shutdown(true);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
AbandonedConnectionCleanupThread.checkedShutdown();
}
}
static void waitFor(Duration waitTime) {
LocalDateTime startTime = LocalDateTime.now();
while (ChronoUnit.SECONDS.between(startTime, LocalDateTime.now()) < waitTime.toSeconds()) {
try {
TimeUnit.SECONDS.sleep(3L);
} catch (InterruptedException e) {
}
}
}
}
ãã¡ãã¯ãæ¬åœã«Scheduler
ãäœæããŠScheduler#start
ãåŒã³åºãã ãã§ãã
scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
20ç§éå®è¡ããããçµäºããããšã«ã¯ããŠããŸãã
Quartzã®èšå®ãã¡ã€ã«ã¯ããã¡ãã
src/main/resources/quartz.properties
org.quartz.scheduler.instanceName=JdbcJobStoreExampleScheduler
org.quartz.threadPool.threadCount=5
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.useProperties=true
org.quartz.jobStore.dataSource=mysqlds
org.quartz.dataSource.mysqlds.driver=com.mysql.cj.jdbc.Driver
org.quartz.dataSource.mysqlds.URL=jdbc:mysql://172.17.0.2:3306/practice?characterEncoding=utf-8&connectionCollation=utf8mb4_0900_bin
org.quartz.dataSource.mysqlds.user=kazuhira
org.quartz.dataSource.mysqlds.password=password
org.quartz.dataSource.mysqlds.maxConnections=7
org.quartz.jobStore.ã
ã®é
ç®ãJobStore
ã®èšå®ã§ãJDBCJobStoreïŒJobStoreTX
ïŒã䜿ãããšãå®çŸ©ããŠããŸãã
org.quartz.dataSource.[ããŒã¿ãœãŒã¹å].ã
ã¯ãQuartzã䜿çšããHikariCPã«ããããŒã¿ãœãŒã¹ã®å®çŸ©ã«ãªã£ãŠããŸãã
JDBCJobStoreãšããŒã¿ãœãŒã¹ã®çŽä»ããè¡ãã®ããorg.quartz.jobStore.dataSource
ã§ããã
åæ²ã§ããããã®ãããã®èšå®ã¯ãã¡ãã§ãã
Job
ãå®è¡ããã¹ã¬ããæ°ãšããŒã¿ãœãŒã¹ã®ããŒã«ãµã€ãºã®é¢ä¿ã§ãããåžžã«ã¹ã¬ããããŒã«ã®ãµã€ãºãšåãæ°ã®Job
ãå®è¡ããŠããå Žåã¯ã
ããŒã¿ãœãŒã¹ã®ããŒã«ãµã€ãºã¯ã¹ã¬ããæ°ïŒ2ãããã«ããŠãããšè¯ãããã§ãã
If your Scheduler is busy (i.e. nearly always executing the same number of jobs as the size of the thread pool, then you should probably set the number of connections in the DataSource to be the about the size of the thread pool + 2.
Lesson 9: Job Stores
ä»åããããªã«Job
ãå®è¡ããªãã®ã§ããããšããããåãããŠãããŸããã
ããã§ãã¢ããªã±ãŒã·ã§ã³ã®æºåã¯å®äºã§ãã
å®è¡ããŠã¿ã
çšæã¯ã§ããã®ã§ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŠã¿ãŸãã
ãŸãã¯Job
ãšTrigger
ã®å®çŸ©ãè¡ããŸãããã
$ mvn compile exec:java -Dexec.mainClass=org.littlewings.quartz.JobDefinitionRegister
2022-10-14 01:24:00.130 [org.littlewings.quartz.JobDefinitionRegister.main()] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.3.2 created.
2022-10-14 01:24:00.131 [org.littlewings.quartz.JobDefinitionRegister.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Using thread monitor-based data access locking (synchronization).
2022-10-14 01:24:00.132 [org.littlewings.quartz.JobDefinitionRegister.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - JobStoreTX initialized.
2022-10-14 01:24:00.133 [org.littlewings.quartz.JobDefinitionRegister.main()] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.2) 'JdbcJobStoreExampleScheduler' with instanceId 'NON_CLUSTERED'
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 5 threads.
Using job-store 'org.quartz.impl.jdbcjobstore.JobStoreTX' - which supports persistence. and is not clustered.
2022-10-14 01:24:00.133 [org.littlewings.quartz.JobDefinitionRegister.main()] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'JdbcJobStoreExampleScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
2022-10-14 01:24:00.133 [org.littlewings.quartz.JobDefinitionRegister.main()] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.2
2022-10-14 01:24:00.161 [org.littlewings.quartz.JobDefinitionRegister.main()] INFO c.m.v.c.i.AbstractPoolBackedDataSource - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> z8kfsxar1mb873f1ynw73x|5f075acb, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.cj.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> z8kfsxar1mb873f1ynw73x|5f075acb, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://172.17.0.2:3306/practice?characterEncoding=utf-8&connectionCollation=utf8mb4_0900_bin, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 7, maxStatements -> 0, maxStatementsPerConnection -> 120, minPoolSize -> 1, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {password=******, user=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
2022-10-14 01:24:00.751 [org.littlewings.quartz.JobDefinitionRegister.main()] INFO org.quartz.core.QuartzScheduler - Scheduler JdbcJobStoreExampleScheduler_$_NON_CLUSTERED shutting down.
2022-10-14 01:24:00.751 [org.littlewings.quartz.JobDefinitionRegister.main()] INFO org.quartz.core.QuartzScheduler - Scheduler JdbcJobStoreExampleScheduler_$_NON_CLUSTERED paused.
2022-10-14 01:24:01.124 [org.littlewings.quartz.JobDefinitionRegister.main()] INFO org.quartz.core.QuartzScheduler - Scheduler JdbcJobStoreExampleScheduler_$_NON_CLUSTERED shutdown complete.
ãã®æç¹ã§ã以äžã®ããŒãã«ã«ããŒã¿ãå
¥ã£ãŠããŸããã
mysql> select * from QRTZ_JOB_DETAILS;
+
| SCHED_NAME | JOB_NAME | JOB_GROUP | DESCRIPTION | JOB_CLASS_NAME | IS_DURABLE | IS_NONCONCURRENT | IS_UPDATE_DATA | REQUESTS_RECOVERY | JOB_DATA |
+
| JdbcJobStoreExampleScheduler | job1 | job-group1 | NULL | org.littlewings.quartz.PrintMessageJob | 0 | 0 | 0 | 0 | 0x230A23467269204F63742031342030313A32343A3030204A535420323032320A6D6573736167653D48656C6C6F204A4442432053746F7265204A6F620A |
+
1 row in set (0.00 sec)
mysql> select * from QRTZ_SIMPLE_TRIGGERS;
+
| SCHED_NAME | TRIGGER_NAME | TRIGGER_GROUP | REPEAT_COUNT | REPEAT_INTERVAL | TIMES_TRIGGERED |
+
| JdbcJobStoreExampleScheduler | trigger1 | trigger-group1 | -1 | 3000 | 0 |
+
1 row in set (0.00 sec)
mysql> select * from QRTZ_TRIGGERS;
+
| SCHED_NAME | TRIGGER_NAME | TRIGGER_GROUP | JOB_NAME | JOB_GROUP | DESCRIPTION | NEXT_FIRE_TIME | PREV_FIRE_TIME | PRIORITY | TRIGGER_STATE | TRIGGER_TYPE | START_TIME | END_TIME | CALENDAR_NAME | MISFIRE_INSTR | JOB_DATA |
+
| JdbcJobStoreExampleScheduler | trigger1 | trigger-group1 | job1 | job-group1 | NULL | 1665678240135 | -1 | 5 | WAITING | SIMPLE | 1665678240135 | 0 | NULL | 0 | 0x |
+
1 row in set (0.00 sec)
次ã«ãScheduler
ãèµ·åããåŽã®ããã°ã©ã ãå®è¡ããŸãã
$ mvn compile exec:java -Dexec.mainClass=org.littlewings.quartz.ScheduledRunner
Job
ãèµ·åãã3ç§ããã«å®è¡ãããŸãã
2022-10-14 01:25:00.007 [org.littlewings.quartz.ScheduledRunner.main()] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.2
2022-10-14 01:25:00.031 [org.littlewings.quartz.ScheduledRunner.main()] INFO c.m.v.c.i.AbstractPoolBackedDataSource - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> z8kfsxar1mb9har148z9s0|1c053ab6, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.cj.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> z8kfsxar1mb9har148z9s0|1c053ab6, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://172.17.0.2:3306/practice?characterEncoding=utf-8&connectionCollation=utf8mb4_0900_bin, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 7, maxStatements -> 0, maxStatementsPerConnection -> 120, minPoolSize -> 1, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {password=******, user=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
2022-10-14 01:25:00.499 [org.littlewings.quartz.ScheduledRunner.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Freed 0 triggers from 'acquired' / 'blocked' state.
2022-10-14 01:25:00.513 [org.littlewings.quartz.ScheduledRunner.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Handling 1 trigger(s) that missed their scheduled fire-time.
2022-10-14 01:25:00.546 [org.littlewings.quartz.ScheduledRunner.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Recovering 0 jobs that were in-progress at the time of the last shut-down.
2022-10-14 01:25:00.546 [org.littlewings.quartz.ScheduledRunner.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Recovery complete.
2022-10-14 01:25:00.548 [org.littlewings.quartz.ScheduledRunner.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Removed 0 'complete' triggers.
2022-10-14 01:25:00.549 [org.littlewings.quartz.ScheduledRunner.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Removed 0 stale fired job entries.
2022-10-14 01:25:00.616 [org.littlewings.quartz.ScheduledRunner.main()] INFO org.quartz.core.QuartzScheduler - Scheduler JdbcJobStoreExampleScheduler_$_NON_CLUSTERED started.
2022-10-14 01:25:03.236 [JdbcJobStoreExampleScheduler_Worker-1] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:06.208 [JdbcJobStoreExampleScheduler_Worker-2] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:09.184 [JdbcJobStoreExampleScheduler_Worker-3] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:12.205 [JdbcJobStoreExampleScheduler_Worker-4] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:15.446 [JdbcJobStoreExampleScheduler_Worker-5] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:18.167 [JdbcJobStoreExampleScheduler_Worker-1] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:21.167 [JdbcJobStoreExampleScheduler_Worker-2] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:21.624 [org.littlewings.quartz.ScheduledRunner.main()] INFO org.quartz.core.QuartzScheduler - Scheduler JdbcJobStoreExampleScheduler_$_NON_CLUSTERED shutting down.
2022-10-14 01:25:21.624 [org.littlewings.quartz.ScheduledRunner.main()] INFO org.quartz.core.QuartzScheduler - Scheduler JdbcJobStoreExampleScheduler_$_NON_CLUSTERED paused.
2022-10-14 01:25:22.241 [org.littlewings.quartz.ScheduledRunner.main()] INFO org.quartz.core.QuartzScheduler - Scheduler JdbcJobStoreExampleScheduler_$_NON_CLUSTERED shutdown complete.
JobDataMap
ããå€ãååŸã§ããŠããŸããã
å°ãæéã空ããŠããã1床åãããŠã¿ãŸãã
$ mvn compile exec:java -Dexec.mainClass=org.littlewings.quartz.ScheduledRunner
ãããšãåãã«ã¯åããã®ã§ãããå®è¡åæ°ãåŠã«å€ãã§ãã
2022-10-14 01:25:52.013 [org.littlewings.quartz.ScheduledRunner.main()] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.2
2022-10-14 01:25:52.046 [org.littlewings.quartz.ScheduledRunner.main()] INFO c.m.v.c.i.AbstractPoolBackedDataSource - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> z8kfsxar1mbaleo1u18s6j|1c053ab6, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.cj.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> z8kfsxar1mbaleo1u18s6j|1c053ab6, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://172.17.0.2:3306/practice?characterEncoding=utf-8&connectionCollation=utf8mb4_0900_bin, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 7, maxStatements -> 0, maxStatementsPerConnection -> 120, minPoolSize -> 1, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {password=******, user=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
2022-10-14 01:25:52.566 [org.littlewings.quartz.ScheduledRunner.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Freed 0 triggers from 'acquired' / 'blocked' state.
2022-10-14 01:25:52.583 [org.littlewings.quartz.ScheduledRunner.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Recovering 0 jobs that were in-progress at the time of the last shut-down.
2022-10-14 01:25:52.583 [org.littlewings.quartz.ScheduledRunner.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Recovery complete.
2022-10-14 01:25:52.585 [org.littlewings.quartz.ScheduledRunner.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Removed 0 'complete' triggers.
2022-10-14 01:25:52.587 [org.littlewings.quartz.ScheduledRunner.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Removed 0 stale fired job entries.
2022-10-14 01:25:52.589 [org.littlewings.quartz.ScheduledRunner.main()] INFO org.quartz.core.QuartzScheduler - Scheduler JdbcJobStoreExampleScheduler_$_NON_CLUSTERED started.
2022-10-14 01:25:52.699 [JdbcJobStoreExampleScheduler_Worker-1] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:52.777 [JdbcJobStoreExampleScheduler_Worker-2] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:52.853 [JdbcJobStoreExampleScheduler_Worker-3] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:52.949 [JdbcJobStoreExampleScheduler_Worker-4] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:53.019 [JdbcJobStoreExampleScheduler_Worker-5] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:53.085 [JdbcJobStoreExampleScheduler_Worker-1] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:53.177 [JdbcJobStoreExampleScheduler_Worker-2] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:53.253 [JdbcJobStoreExampleScheduler_Worker-3] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:53.343 [JdbcJobStoreExampleScheduler_Worker-4] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:53.411 [JdbcJobStoreExampleScheduler_Worker-5] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:54.190 [JdbcJobStoreExampleScheduler_Worker-1] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:57.165 [JdbcJobStoreExampleScheduler_Worker-2] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:26:00.170 [JdbcJobStoreExampleScheduler_Worker-3] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:26:03.171 [JdbcJobStoreExampleScheduler_Worker-4] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:26:06.173 [JdbcJobStoreExampleScheduler_Worker-5] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:26:09.224 [JdbcJobStoreExampleScheduler_Worker-1] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:26:12.161 [JdbcJobStoreExampleScheduler_Worker-2] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:26:13.597 [org.littlewings.quartz.ScheduledRunner.main()] INFO org.quartz.core.QuartzScheduler - Scheduler JdbcJobStoreExampleScheduler_$_NON_CLUSTERED shutting down.
2022-10-14 01:26:13.597 [org.littlewings.quartz.ScheduledRunner.main()] INFO org.quartz.core.QuartzScheduler - Scheduler JdbcJobStoreExampleScheduler_$_NON_CLUSTERED paused.
2022-10-14 01:26:13.748 [org.littlewings.quartz.ScheduledRunner.main()] INFO org.quartz.core.QuartzScheduler - Scheduler JdbcJobStoreExampleScheduler_$_NON_CLUSTERED shutdown complete.
æ¢ãŸã£ãŠããæéã§åããŠããã¯ãã ã£ãåããåããŠããæããããŸãã
2022-10-14 01:25:52.699 [JdbcJobStoreExampleScheduler_Worker-1] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:52.777 [JdbcJobStoreExampleScheduler_Worker-2] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:52.853 [JdbcJobStoreExampleScheduler_Worker-3] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:52.949 [JdbcJobStoreExampleScheduler_Worker-4] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:53.019 [JdbcJobStoreExampleScheduler_Worker-5] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:53.085 [JdbcJobStoreExampleScheduler_Worker-1] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:53.177 [JdbcJobStoreExampleScheduler_Worker-2] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:53.253 [JdbcJobStoreExampleScheduler_Worker-3] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:53.343 [JdbcJobStoreExampleScheduler_Worker-4] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:53.411 [JdbcJobStoreExampleScheduler_Worker-5] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
2022-10-14 01:25:54.190 [JdbcJobStoreExampleScheduler_Worker-1] INFO o.littlewings.quartz.PrintMessageJob - [job1 / job-group1] execute job, messege = [Hello JDBC Store Job]
ããã¯ãJob
ãšTrigger
ãç»é²ããŠããScheduler
ãå®è¡ãããŸã§ã®éãæ¬æ¥èµ·åãã¹ãã ã£ãJobâŠMisfireïŒçºç«ããªãã£ãã€ãã³ãïŒã«
察ããŠåå®è¡ããŠããããã®ããã§ããã
MisfireïŒçºç«ããªãã£ãã€ãã³ãïŒã«ã€ããŠ
MisfireïŒçºç«ããªãã£ãã€ãã³ãïŒã«ã€ããŠã¯ããã¡ãã«èšèŒããããŸãã
Another important property of a Trigger is its âmisfire instructionâ. A misfire occurs if a persistent trigger âmissesâ its firing time because of the scheduler being shutdown, or because there are no available threads in Quartzâs thread pool for executing the job. The different trigger types have different misfire instructions available to them. By default they use a âsmart policyâ instruction - which has dynamic behavior based on trigger type and configuration. When the scheduler starts, it searches for any persistent triggers that have misfired, and it then updates each of them based on their individually configured misfire instructions.
Lesson 4: More About Triggers
Misfireã«å¯ŸããŠã©ã®ããã«æ¯ãèããã¯ãTrigger
ã®çš®é¡ããšã«æå®ã§ããå
容ãå€åããããã§ãã
ããã©ã«ãã§ã¯ãTrigger
ã®çš®é¡ãšæ§æã«ãã£ãŠåçã«æ¯ãèããsmart policyããšãããã®ãé©çšãããŠããããã§ãã
Misfireã«å¯Ÿããæ瀺ã¯Trigger
ããšã«å®çŸ©ãããã以äžã®ã¯ã©ã¹ãã€ã³ã¿ãŒãã§ãŒã¹ã«å®çŸ©ããããŸãã
å®éã«ã¯ããã¡ãã®ScheduleBuilder
ã䜿ã£ãŠæå®ããããšã«ãªããŸããã
ãã®ãã¡ãSimpleTrigger
ããã³SimpleScheduleBuilder
ã«é¢ããŠã¯ã以äžã«äŸããããŸãã
Example 5 - Job Misfires
ä»åã¯SimpleTrigger
ã䜿ããæ°žé ã«å®è¡ããããã«ããŠããïŒREPEAT_INDEFINITELY
ïŒã®ã§ã
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
ãéžæãããŠããããã§ãã
if (instr == Trigger.MISFIRE_INSTRUCTION_SMART_POLICY) {
if (getRepeatCount() == 0) {
instr = MISFIRE_INSTRUCTION_FIRE_NOW;
} else if (getRepeatCount() == REPEAT_INDEFINITELY) {
instr = MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT;
} else {
instr = MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT;
}
https://github.com/quartz-scheduler/quartz/blob/v2.3.2/quartz-core/src/main/java/org/quartz/impl/triggers/SimpleTriggerImpl.java#L473-L481
ãã¡ãã¯æ¬¡åã®èµ·åæããã®æ¬¡ã«èµ·åããŠããã¯ãã®åæ°ã ãJob
ãå®è¡ããããã«ããèšå®ã®ããã§ãã
SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
ããã§ãã¢ããªã±ãŒã·ã§ã³èªäœãåæ¢ããŠããŠãJob
ãèµ·åããã¯ãã ã£ãå®è¡åæ°ãç¡èŠãããããªèšå®ãããŠè©ŠããŠã¿ããããªãš
æã£ãã®ã§ãããSimpleTrigger
ã§ã¯ãããã£ããã®ã¯ãªãããã§ããã
ä»ã®Trigger
ãèŠãæã«ããã£ãšè¿œã£ãŠã¿ããšããŸãâŠã
ãŸãšã
ä»åã¯ãQuartzã®Job
ãTrigger
ãªã©ã®å®çŸ©ãããŒã¿ããŒã¹ã«ä¿åããããã«ããŠã¿ãŸããã
JDBCJobStore
ãDataSource
ãªã©ã®èšå®ã®èªã¿æ¹ãã¯ã©ã¹ã¿ãŒãšããªãå Žåã®æ³šæäºé
ãªã©ãã¡ãã£ãšããã¥ã¡ã³ããè¿œãã®ã«èŠåŽãã
ãšããã¯ãããŸããã䜿ã£ãŠã¿ããšããããããã®ã§ã¯ãªãã£ãã§ããã
äžæ¹ã§ãä»éããŠèŠã€ããMisfireã«é¢ããŠã¯ãŸã æåãããããããªãã®ã§ããŸãå¥éèŠãŠãããããªãšãæããŸãã