ããã¯ããªã«ãããããŠæžãããã®ïŒ
Quartzã§ã¯ã©ã¹ã¿ãªã³ã°ãæ±ã£ãŠã¿ãããšæããŸãã
Quartzã®ã¯ã©ã¹ã¿ãªã³ã°
Quartzã®ã¯ã©ã¹ã¿ãªã³ã°ã«ã€ããŠã¯ãããŸãããã¥ã¡ã³ãããããŸããã
ãŸãã¯ãã¡ãã«å°ãã
ããããããã¥ãŒããªã¢ã«ã«å°ãæžãããŠããŸãã
Lesson 11: Advanced (Enterprise) Features
Quartzã§ã¯ã©ã¹ã¿ãŒãæ§æããã«ã¯ãJobStoreãJDBCJobStoreïŒJobStoreTX
ãŸãã¯JobStoreCMT
ïŒãTerracottaJobStoreã®ã©ã¡ããã«ãã
å¿
èŠããããŸãã
æ©èœãšããŠã¯ãããŒããã©ã³ã·ã³ã°ãšJobã®ãã§ã€ã«ãªãŒããŒãå«ãŸããããã§ãã
èšå®ãšããŠã¯ã以äžããã€ã³ãã®ããã§ãã
- JDBCJobStoreïŒ
JobStoreTX
ãŸãã¯JobStoreCMT
ïŒã«ããã¯ã©ã¹ã¿ãªã³ã°org.quartz.jobStore.isClustered
ããããã£ãtrue
ã«ãã- äžéšã®äŸå€ãšãªãããããã£ãé€ããŠãåãå 容ã®Quartzã®ããããã£ãã¡ã€ã«ã䜿çšãã
- äŸå€ã¯ãã¹ã¬ããããŒã«ãµã€ãºãš
org.quartz.scheduler.instanceId
TerracottaJobStore
ã«ããã¯ã©ã¹ã¿ãªã³ã°TerracottaJobStore
ã䜿çšããŠè€æ°ã€ã³ã¹ã¿ã³ã¹ã§æ§æããã ãã§ãã- Lesson 9: Job Storesãåç §
ä»åã¯ãJDBCJobStoreïŒJobStoreTX
ãŸãã¯JobStoreCMT
ïŒã«ããã¯ã©ã¹ã¿ãªã³ã°ã䜿çšããããšæããŸãã
泚æç¹ã¯ãããããã§ããåQuartzããŒãã®éã§æå»åæãè¡ãããŠããå¿
èŠããããŸãã
ããŒããã©ã³ã·ã³ã°ã¯ã©ã³ãã ã®ããã§ãããå®è¡ããŠããJobãå°ãªãå Žåã¯ã¢ã¯ãã£ãã ã£ãåãããŒããåªå
ããããšæžãããŠããŸãã
ã§ãã¯ã©ã¹ã¿ãªã³ã°ã«ã€ããŠã®ããã¥ã¡ã³ãã¯ãããããã ã£ããããŸãã
ãµã³ãã«ã¯ïŒãšæãã®ã§ãããExampleã®ããŒãžãèŠãŠããªã³ã¯ããããŸããã
Example 13 - Clustered Quartz
å°ã£ããªãšæããŸãããããã£ã¹ããªãã¥ãŒã·ã§ã³ã«ã¯ãµã³ãã«ãå«ãŸããŠãããšããã®ã§ãGitHubã«ãããœãŒã¹ã³ãŒãã確èªããŠã¿ãŸããã
ãã®ãããã«ãããŸããã
èšå®ãã¡ã€ã«ããã³èµ·åã¹ã¯ãªããã¯ãã¡ãã
èšå®ãã¡ã€ã«ã®èª¬æãäœ¿ãæ¹ã«ã€ããŠã¯ããã¡ãã«æžãããŠããŸãã
ãµã³ãã«ããã°ã©ã ã®èª¬æã¯ããã¡ãã
ãã®ããããåèã«ãQuartzã§ã¯ã©ã¹ã¿ãŒãæ§æããŠã¿ãããšæããŸãã
ãé¡
ããŒã¿ããŒã¹ãMySQLãšããJDBCJobStoreïŒJobStoreTX
ïŒã䜿ã£ãŠãQuartzã§ã¯ã©ã¹ã¿ãŒãæ§æããŸãã
宿çã«èµ·åããç°¡åãªãžã§ãã3ã€ã®ã€ã³ã¹ã¿ã³ã¹ã§ç¢ºèªããããšã«ããŸãããã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã
$ 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-131-generic", arch: "amd64", family: "unix"
MySQLã¯172.17.0.2ã§åäœããŠãããã®ãšããããŒã¿ããŒã¹ã¯practice
ããŠãŒã¶ãŒïŒãã¹ã¯ãŒãã¯kazuhira
ïŒpassword
ã§äœææžã¿ãšããŸãã
$ mysql --version mysql Ver 8.0.31 for Linux on x86_64 (MySQL Community Server - GPL) mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.31 | +-----------+ 1 row in set (0.06 sec)
æºå
ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãäœæããæºåãããŠãããŸãã
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.31</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ã®JDBCJobStoreã§å¿ èŠãªããŒãã«ãäœæããŠãããŸãã
$ 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
ããã§ãæºåã¯å®äºã§ãã
ã¢ããªã±ãŒã·ã§ã³ãäœæãã
ããã§ã¯ããœãŒã¹ã³ãŒããäœæããŸãã
Example 13ã®æ§æãåèã«ãã€ã€ãèªåã§äœã£ãŠãããŸãã
- https://github.com/quartz-scheduler/quartz/tree/v2.3.2/distribution/examples/src/main/java/org/quartz/examples/example13
- https://github.com/quartz-scheduler/quartz/tree/v2.3.2/distribution/src/main/assembly/root/examples/example13
ãŸãã¯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.SchedulerException; 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 { String instanceId = getSchedulerInstanceId(context); JobDetail jobDetail = context.getJobDetail(); JobDataMap jobDataMap = jobDetail.getJobDataMap(); logger.info("[{}] execute job, message = [{}]", instanceId, jobDataMap.getString("message")); } private String getSchedulerInstanceId(JobExecutionContext context) { try { return context.getScheduler().getSchedulerInstanceId(); } catch (SchedulerException e) { throw new RuntimeException(e); } } }
Scheduler
ã®ã€ã³ã¹ã¿ã³ã¹IDãJobDataMap
ã§èšå®ããããŒã¿ããã°åºåããç°¡åãªJob
ã§ãã
main
ã¯ã©ã¹ã
src/main/java/org/littlewings/quartz/App.java
package org.littlewings.quartz; import java.io.Console; import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread; import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class App { public static void main(String... args) { Logger logger = LoggerFactory.getLogger(App.class); Scheduler scheduler = null; try { scheduler = StdSchedulerFactory.getDefaultScheduler(); if (args.length > 0) { if ("register-job".equals(args[0])) { JobDetail jobDetail = JobBuilder .newJob(PrintMessageJob.class) .usingJobData("message", "Hello, Clustering Job!!") .withIdentity("job1", "job-group1") .build(); Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("trigger1", "trigger-group1") .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")) .build(); scheduler.scheduleJob(jobDetail, trigger); logger.info("registered, job"); } else if ("clear-job".equals(args[0])) { scheduler.clear(); logger.info("cleared, job"); } } scheduler.start(); logger.info("Quartz scheduler started."); Console console = System.console(); console.readLine(); } catch (SchedulerException e) { e.printStackTrace(); } finally { if (scheduler != null) { try { scheduler.shutdown(true); } catch (SchedulerException e) { e.printStackTrace(); } } AbandonedConnectionCleanupThread.checkedShutdown(); } } }
åºæ¬ã¯Scheduler
ãååŸããŠéå§ããã ããªã®ã§ããã
scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
logger.info("Quartz scheduler started.");
èµ·ååŒæ°ã«register-job
ãæå®ãããšScheduler
ã«Job
ãç»é²ããclear-job
ãæå®ãããšScheduler
ããç»é²ããJob
ãã¯ãªã¢ããããã«ããŠ
ããŸãã
if ("register-job".equals(args[0])) { JobDetail jobDetail = JobBuilder .newJob(PrintMessageJob.class) .usingJobData("message", "Hello, Clustering Job!!") .withIdentity("job1", "job-group1") .build(); Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("trigger1", "trigger-group1") .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")) .build(); scheduler.scheduleJob(jobDetail, trigger); logger.info("registered, job"); } else if ("clear-job".equals(args[0])) { scheduler.clear(); logger.info("cleared, job"); }
Job
ãç»é²ããã®ã¯ã¯ã©ã¹ã¿ãŒå
ã®ã€ã³ã¹ã¿ã³ã¹ã§ã²ãšã€ããšããã1åã ãã§ããã
Job
ã¯CronScheduleBuilder
ã§10ç§ããã«å®è¡ããããšã«ããŸããã
Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("trigger1", "trigger-group1") .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")) .build();
ããšã¯ãEnterã§ã¢ããªã±ãŒã·ã§ã³ãçµäºããããã«ããŸããã
Console console = System.console(); console.readLine();
ããã§ããœãŒã¹ã³ãŒãã®äœæã¯å®äºã§ãã
ããåäœç¢ºèªã«ç§»ãåã«Quartzã®èšå®ãã¡ã€ã«ã®äœæãå¿ èŠã§ãã
èšå®ãã¡ã€ã«ã¯ã€ã³ã¹ã¿ã³ã¹ããšã«äœæããŸããä»åã¯ã3ã€ã®ã€ã³ã¹ã¿ã³ã¹ãå®è¡ããæ³å®ã§äœæããŸãããã
ã²ãšã€ç®ã®ã€ã³ã¹ã¿ã³ã¹çšã
src/main/resources/instance1.properties
org.quartz.scheduler.instanceName=ClusteredExampleScheduler org.quartz.scheduler.instanceId=instance1 org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount=5 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.isClustered=true 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
2ã€ç®ã®ã€ã³ã¹ã¿ã³ã¹çšã
src/main/resources/instance2.properties
org.quartz.scheduler.instanceName=ClusteredExampleScheduler org.quartz.scheduler.instanceId=instance2 org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount=5 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.isClustered=true 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
3ã€ç®ã®ã€ã³ã¹ã¿ã³ã¹çšã
src/main/resources/instance3.properties
org.quartz.scheduler.instanceName=ClusteredExampleScheduler org.quartz.scheduler.instanceId=instance3 org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount=5 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.isClustered=true 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.scheduler.instanceId
ãç°ãªãã ãã§ãã
ããšããã€ã³ãã¯org.quartz.jobStore.isClustered
ãtrue
ãšããŠããããšã§ããã
Quartzã¯èšå®ãã¡ã€ã«ãéåžžquartz.properties
ãšããŠèªã¿èŸŒã¿ãŸãããä»ã®ãã¡ã€ã«ãæå®ããå Žåã¯-Dorg.quartz.properties
ã·ã¹ãã ããããã£ã§
æå®ããã°OKã§ãã
By default, StdSchedulerFactory load a properties file named âquartz.propertiesâ from the âcurrent working directoryâ. If that fails, then the âquartz.propertiesâ file located (as a resource) in the org/quartz package is loaded. If you wish to use a file other than these defaults, you must define the system property âorg.quartz.propertiesâ to point to the file you want.
確èªããŠã¿ã
ã§ã¯ã確èªããŠã¿ãŸãããã
以äžã®ããã«ããŠå®è¡ããŸããã²ãšã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ã®ã¿ãregister-job
ãèµ·ååŒæ°ã«æå®ããŠããŸãã
## ã²ãšã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ $ mvn compile exec:java \ -Dexec.mainClass=org.littlewings.quartz.App \ -Dexec.args=register-job \ -Dorg.quartz.properties=instance1.properties ## 2ã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ $ mvn compile exec:java \ -Dexec.mainClass=org.littlewings.quartz.App \ -Dorg.quartz.properties=instance2.properties ## 3ã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ $ mvn compile exec:java \ -Dexec.mainClass=org.littlewings.quartz.App \ -Dorg.quartz.properties=instance3.properties
ã²ãšã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ã§ã®èµ·åæã®ãã°ã
2022-10-22 19:15:06.556 [org.littlewings.quartz.App.main()] INFO org.quartz.impl.StdSchedulerFactory - Using ConnectionProvider class 'org.quartz.utils.C3p0PoolingConnectionProvider' for data source 'mysqlds' 2022-10-22 19:15:06.604 [MLog-Init-Reporter] INFO com.mchange.v2.log.MLog - MLog clients using slf4j logging. 2022-10-22 19:15:06.917 [org.littlewings.quartz.App.main()] INFO com.mchange.v2.c3p0.C3P0Registry - Initializing c3p0-0.9.5.4 [built 23-March-2019 23:00:48 -0700; debug? true; trace: 10] 2022-10-22 19:15:07.088 [org.littlewings.quartz.App.main()] INFO org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor 2022-10-22 19:15:07.191 [org.littlewings.quartz.App.main()] INFO o.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl 2022-10-22 19:15:07.192 [org.littlewings.quartz.App.main()] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.3.2 created. 2022-10-22 19:15:07.194 [org.littlewings.quartz.App.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - Using db table-based data access locking (synchronization). 2022-10-22 19:15:07.196 [org.littlewings.quartz.App.main()] INFO o.q.impl.jdbcjobstore.JobStoreTX - JobStoreTX initialized. 2022-10-22 19:15:07.197 [org.littlewings.quartz.App.main()] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.2) 'ClusteredExampleScheduler' with instanceId 'instance1' 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 clustered. 2022-10-22 19:15:07.197 [org.littlewings.quartz.App.main()] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'ClusteredExampleScheduler' initialized from specified file: 'instance1.properties' in the class resource path. 2022-10-22 19:15:07.197 [org.littlewings.quartz.App.main()] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.2 2022-10-22 19:15:07.326 [org.littlewings.quartz.App.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 -> z8kfsxar1yt0gwk81b43p|586fed53, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.cj.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> z8kfsxar1yt0gwk81b43p|586fed53, 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-22 19:15:08.372 [org.littlewings.quartz.App.main()] INFO org.littlewings.quartz.App - registered, job 2022-10-22 19:15:08.420 [org.littlewings.quartz.App.main()] INFO org.quartz.core.QuartzScheduler - Scheduler ClusteredExampleScheduler_$_instance1 started. 2022-10-22 19:15:08.420 [org.littlewings.quartz.App.main()] INFO org.littlewings.quartz.App - Quartz scheduler started.
ããŒãèŠããšclustered
ãšè¡šç€ºãããŠãããã¯ã©ã¹ã¿ãŒã¢ãŒãã«ãªã£ãŠããããšãããããŸãã
Using job-store 'org.quartz.impl.jdbcjobstore.JobStoreTX' - which supports persistence. and is clustered.
Job
èªäœã¯ãä»åã¯ã²ãšã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ã§å®è¡ããç¶ããŠããŸããã
2022-10-22 19:15:10.043 [ClusteredExampleScheduler_Worker-1] INFO o.littlewings.quartz.PrintMessageJob - [instance1] execute job, message = [Hello, Clustering Job!!] 2022-10-22 19:15:20.035 [ClusteredExampleScheduler_Worker-2] INFO o.littlewings.quartz.PrintMessageJob - [instance1] execute job, message = [Hello, Clustering Job!!] 2022-10-22 19:15:30.104 [ClusteredExampleScheduler_Worker-3] INFO o.littlewings.quartz.PrintMessageJob - [instance1] execute job, message = [Hello, Clustering Job!!] 2022-10-22 19:15:40.053 [ClusteredExampleScheduler_Worker-4] INFO o.littlewings.quartz.PrintMessageJob - [instance1] execute job, message = [Hello, Clustering Job!!] 2022-10-22 19:15:50.037 [ClusteredExampleScheduler_Worker-5] INFO o.littlewings.quartz.PrintMessageJob - [instance1] execute job, message = [Hello, Clustering Job!!]
ããã§ãEnterãæã£ãŠã²ãšã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ãçµäºããŠã¿ãŸãã
2022-10-22 19:18:26.362 [org.littlewings.quartz.App.main()] INFO org.quartz.core.QuartzScheduler - Scheduler ClusteredExampleScheduler_$_instance1 shutting down. 2022-10-22 19:18:26.362 [org.littlewings.quartz.App.main()] INFO org.quartz.core.QuartzScheduler - Scheduler ClusteredExampleScheduler_$_instance1 paused. 2022-10-22 19:18:26.667 [org.littlewings.quartz.App.main()] INFO org.quartz.core.QuartzScheduler - Scheduler ClusteredExampleScheduler_$_instance1 shutdown complete.
å°ãåŸ ã£ãŠãããšãä»åã¯3ã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ãæ€ç¥ããããã§ãã
2022-10-22 19:18:39.266 [QuartzScheduler_ClusteredExampleScheduler-instance3_ClusterManager] INFO o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: detected 1 failed or restarted instances. 2022-10-22 19:18:39.266 [QuartzScheduler_ClusteredExampleScheduler-instance3_ClusterManager] INFO o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Scanning for instance "instance1"'s failed in-progress jobs. 2022-10-22 19:18:39.383 [ClusteredExampleScheduler_Worker-1] INFO o.littlewings.quartz.PrintMessageJob - [instance3] execute job, message = [Hello, Clustering Job!!] 2022-10-22 19:18:40.135 [ClusteredExampleScheduler_Worker-2] INFO o.littlewings.quartz.PrintMessageJob - [instance3] execute job, message = [Hello, Clustering Job!!] 2022-10-22 19:18:50.062 [ClusteredExampleScheduler_Worker-3] INFO o.littlewings.quartz.PrintMessageJob - [instance3] execute job, message = [Hello, Clustering Job!!]
ãã®åŸãJob
ã¯3ã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ã§å®è¡ããç¶ããŸããã
忢ããã²ãšã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãèµ·ååŒæ°ãæå®ããªããã°å床ã¯ã©ã¹ã¿ãŒã«åå ã§ããŸãã
$ mvn compile exec:java \ -Dexec.mainClass=org.littlewings.quartz.App \ -Dorg.quartz.properties=instance1.properties
ãã®åŸãã€ã³ã¹ã¿ã³ã¹ã忢ããããå床起åããããããšã¢ã¯ãã£ããªã€ã³ã¹ã¿ã³ã¹ãç§»ãã€ã€ãJob
ã¯å®è¡ããç¶ããããšã確èªã§ããŸãã
ä»åã¯å®è¡ããJob
ãå°ãªãããããããŒããã©ã³ã·ã°çãªåäœã¯ç¢ºèªã§ããŸããã§ãããâŠã
ããã§ããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã1床çµäºããŠãç»é²ããJob
ãã¯ãªã¢ããŠãããŸãã
$ mvn compile exec:java \ -Dexec.mainClass=org.littlewings.quartz.App \ -Dexec.args=clear-job \ -Dorg.quartz.properties=instance1.properties
ãã®ã€ã³ã¹ã¿ã³ã¹èªäœãçµäºãããå¿ èŠããããŸããâŠã
ã€ã³ã¹ã¿ã³ã¹ã®IDãèªåæ¡çªãã
ä»åãåã€ã³ã¹ã¿ã³ã¹ã®IDãåã ã«æå®ããããã«ããããèšå®ãã¡ã€ã«ãäœæããŸããã
ãšã¯ãããã€ã³ã¹ã¿ã³ã¹ã®æ°ã墿žããããããšãã€ã³ã¹ã¿ã³ã¹ããšã«èšå®ãã¡ã€ã«ãçšæããã®ã¯é¢åãããããŸããã
ããã§ãorg.quartz.scheduler.instanceId
ããããã£ã®èª¬æãèŠããšAUTO
ãšæå®ããããšã§ã€ã³ã¹ã¿ã³ã¹ã®IDãèªåæ¡çªã§ããããªããšã
ããããŸããã
org.quartz.scheduler.instanceId
You may use the value âAUTOâ as the instanceId if you wish the Id to be generated for you.
ãã¡ãã詊ããŠã¿ãŸãããã
èšå®ãã¡ã€ã«ãquartz.properties
ã«ããŠãorg.quartz.scheduler.instanceId
ãAUTO
ãšæå®ããŸãã
src/main/resources/quartz.properties
org.quartz.scheduler.instanceName=ClusteredExampleScheduler org.quartz.scheduler.instanceId=AUTO org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount=5 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.isClustered=true 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
ä»åºŠã¯ã-Dorg.quartz.properties
ã·ã¹ãã ããããã£ã§Quartzã®èšå®ãã¡ã€ã«ãæå®ããã«èµ·åããŸããã²ãšã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯èµ·ååŒæ°ã
æå®ããã®ã¯ãå
ã»ã©ãšåãã§ãã
## ã²ãšã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ $ mvn compile exec:java \ -Dexec.mainClass=org.littlewings.quartz.App \ -Dexec.args=register-job ## 2ã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ $ mvn compile exec:java \ -Dexec.mainClass=org.littlewings.quartz.App ## 3ã€ç®ã®ã€ã³ã¹ã¿ã³ã¹ $ mvn compile exec:java \ -Dexec.mainClass=org.littlewings.quartz.App
èµ·åæã®ã€ã³ã¹ã¿ã³ã¹IDãèŠããšãèªåæ¡çªãããŠãããããªã®ã§ãããã©ãããã¹ãåãå ¥ã£ãŠããããã§ãã
2022-10-22 19:32:18.952 [org.littlewings.quartz.App.main()] INFO org.quartz.core.QuartzScheduler - Scheduler ClusteredExampleScheduler_$_myhost1666434737522 started. 2022-10-22 19:32:18.954 [org.littlewings.quartz.App.main()] INFO org.littlewings.quartz.App - Quartz scheduler started.
Job
ã®å®è¡ãã°ã
2022-10-22 19:32:20.044 [ClusteredExampleScheduler_Worker-1] INFO o.littlewings.quartz.PrintMessageJob - [myhost1666434737522] execute job, message = [Hello, Clustering Job!!] 2022-10-22 19:32:30.145 [ClusteredExampleScheduler_Worker-2] INFO o.littlewings.quartz.PrintMessageJob - [myhost1666434737522] execute job, message = [Hello, Clustering Job!!] 2022-10-22 19:32:40.492 [ClusteredExampleScheduler_Worker-3] INFO o.littlewings.quartz.PrintMessageJob - [myhost1666434737522] execute job, message = [Hello, Clustering Job!!] 2022-10-22 19:32:50.051 [ClusteredExampleScheduler_Worker-4] INFO o.littlewings.quartz.PrintMessageJob - [myhost1666434737522] execute job, message = [Hello, Clustering Job!!] 2022-10-22 19:33:00.033 [ClusteredExampleScheduler_Worker-5] INFO o.littlewings.quartz.PrintMessageJob - [myhost1666434737522] execute job, message = [Hello, Clustering Job!!]
ãã£ã±ããã¹ãåãå ¥ã£ãŠããŸãããŸãããã¹ãåã®åŸãã«ä»ããŠããã®ã¯ã¿ã€ã ã¹ã¿ã³ããªæããããŸããã
ã¡ãã£ãšããã¥ã¡ã³ããèŠãŠã¿ãŸããããã€ã³ã¹ã¿ã³ã¹IDã®æ¡çªã«ã€ããŠã¯ãorg.quartz.scheduler.instanceIdGenerator.class
ããããã£ã§
ã¯ã©ã¹ãæå®ã§ããã¿ããã§ãã
org.quartz.scheduler.instanceIdGenerator.class
Only used if org.quartz.scheduler.instanceId is set to âAUTOâ. Defaults to âorg.quartz.simpl.SimpleInstanceIdGeneratorâ, which generates an instance id based upon host name and time stamp. Other IntanceIdGenerator implementations include SystemPropertyInstanceIdGenerator (which gets the instance id from the system property âorg.quartz.scheduler.instanceIdâ, and HostnameInstanceIdGenerator which uses the local host name (InetAddress.getLocalHost().getHostName()). You can also implement the InstanceIdGenerator interface your self.
ããã§org.quartz.scheduler.instanceId
ã«AUTO
ãæå®ããå Žåã¯org.quartz.simpl.SimpleInstanceIdGenerator
ã䜿ãããããšãªã£ãŠããŸãã
InstanceIdGenerator
ããã€ã³ã¹ã¿ã³ã¹IDãæ¡çªããã€ã³ã¿ãŒãã§ãŒã¹ã§ãã
InstanceIdGenerator (Quartz Enterprise Job Scheduler 2.3.0-SNAPSHOT API)
SimpleInstanceIdGenerator
ã¯ããã¹ãåãšçŸåšæå»ã§ã€ã³ã¹ã¿ã³ã¹IDãäœæããInstanceIdGenerator
ã®å®è£
ã§ãã
The default InstanceIdGenerator used by Quartz when instance id is to be automatically generated. Instance id is of the form HOSTNAME + CURRENT_TIME.
SimpleInstanceIdGenerator (Quartz Enterprise Job Scheduler 2.3.0-SNAPSHOT API)
ãã®ä»ããã¹ãåãã€ã³ã¹ã¿ã³ã¹IDãšãããã®ããã·ã¹ãã ããããã£ã§ã€ã³ã¹ã¿ã³ã¹IDãæå®ã§ããå®è£ ãããããã§ãã
HostnameInstanceIdGenerator (Quartz Enterprise Job Scheduler 2.3.0-SNAPSHOT API)
SystemPropertyInstanceIdGenerator (Quartz Enterprise Job Scheduler 2.3.0-SNAPSHOT API)
ä»ã®æ¡çªã«ãŒã«ã«ãããã£ãããèªåã§InstanceIdGenerator
ã€ã³ã¿ãŒãã§ãŒã¹ã®å®è£
ãäœæããŠ
org.quartz.scheduler.instanceIdGenerator.class
ããããã£ã§æå®ããã°è¯ãããã§ããã
ä»åã¯ããããªãšããã§ããããã
ãŸãšã
Quartzã®ã¯ã©ã¹ã¿ãªã³ã°ã詊ããŠã¿ãŸããã
ãšãŠãç°¡åã«äœ¿ããã®ã§è¯ãã®ã§ãããä»åã¯ããŒããã©ã³ã·ã³ã°çãªãšããã確èªã§ããªãã£ãã®ãã¡ãã£ãšæ®å¿µã§ããã
ãŸããåºæ¬çãªãšããã¯ç¢ºèªã§ãããšæãã®ã§ãä»åã¯ããã§è¯ãã§ãããã