Quarz -Cluster -Fähigkeit:
Die oben genannten sind einige persönliche Erkenntnisse. Beginnen wir den Haupttext dieses Artikels. In diesem Artikel wird hauptsächlich relevante Inhalte über die Konstruktion von Spring Boot + Quartz -Clustern eingeführt. Es wird für Ihre Referenz und Ihr Lernen geteilt. Ich werde unten nicht viel sagen. Schauen wir uns die detaillierte Einführung gemeinsam an.
Die Schritte sind wie folgt:
Feder -Boot -Bean -Konfiguration:
@ConfigurationPublic Class quartzconfig {@Value ("$ {quartz.scheduler.instoncneName}") private String quartzinStainName; @Value ("$ {org.quartz.datasource.myds.driver}") private String mydsDriver; @Value ("$ {org.quartz.datasource.myds.url}") private String mydsuser; @Value ("$ {org.quartz.datasource.myds.Password}") private String mydSpassword; @Value ("$ {org.quartz.datasource.myds.maxConnections}") private String mydsMaxConnections; / ** * Eigenschaften setzen prop.put ("quartz.scheduler.inStainName", quartzinstoncename); prop.put ("org.quartz.scheduler.instanceId", "auto"); prop.put ("org.quartz.scheduler.skipupdatecheck", "true"); prop.put ("org.quartz.scheduler.jmx.export", "true"); prop.put ("org.quartz.jobstore.class", "org.quartz.impl.jdbcjobstore.jobstoretx"); prop.put ("org.quartz.jobstore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.stdjdbcdelegate"); prop.put ("org.quartz.jobstore.datasource", "quartzdataSource"); prop.put ("org.quartz.jobstore.tableprefix", "qrtz_"); prop.put ("org.quartz.jobstore.isclustered", "true"); prop.put ("org.quartz.jobstore.clustercheckinInterval", "20000"); prop.put ("org.quartz.jobstore.datasource", "myds"); prop.put ("org.quartz.jobstore.maxmisfirestohandleatatime", "1"); prop.put ("org.quartz.jobstore.misfirethreshold", "120000"); prop.put ("org.quartz.jobstore.txisolationLevelSerializable", "wahr"); prop.put ("org.quartz.jobstore.selectwithlocksql", "Select * aus {0} sperrt, wo lock_name = für update"); prop.put ("org.quartz.threadpool.class", "org.quartz.simpl.simplethreadpool"); prop.put ("org.quartz.threadpool.threadcount", "10"); prop.put ("org.quartz.threadpool.threadpriority", "5"); prop.put ("org.quartz.threadpool.threadsinheritContextClassloaderofinitializingThread", "true"); prop.put ("org.quartz.datasource.myds.Driver", mydsdriver); prop.put ("org.quartz.datasource.myds.url", mydsurl); prop.put ("org.quartz.datasource.myds.user", mydsuser); prop.put ("org.quartz.datasource.myds.password", mydSpassword); System.out.println ("mydsMaxConnections:" + mydsMaxConnections); prop.put ("org.quartz.datasource.myds.maxConnections", mydsmaxConnections); prop.put ("org.quartz.plugin.trigghistory.class", "org.quartz.plugins.history.LoggjobhistoryPlugin"); prop.put ("org.quartz.plugin.shutdownhook.class", org.quartz.plugins.shutdownhookplugin "); prop.put ("org.quartz.plugin.shutdownhook.cleanShutdown", "true"); Return Prop; } @Bean public SchedulerFactoryBean SchedulerFactoryBean (@Qualifier ("Dialogjobtrigger") löst Cronjobtrigger aus) ioException {planeLerFactoryBean factory = new PlanerFactoryBean (); // Dies ermöglicht die Aktualisierung von Triggern in DB, wenn die Einstellungen in der Konfigurationsdatei aktualisiert werden: // für Quartz -Cluster verwendet. QuartzScheduler aktualisiert die vorhandenen Jobs beim Starten, damit die Tabelle qRTZ_JOB_DETAIL nach dem Ändern der TargetObject nicht löschen muss. Die entsprechende Aufzeichnung von fabrik.setoverwriteExistingjobs (true); // für Quartz -Cluster verwendet, Quarzdatenquelle laden //factory.setDataSource(DataSource); // Quartzeduler das Start nach 10 Sekunden Anwendungsstart verzögert, startet Quartzeduler Factory.SetStartUpDelay (10); // für Quartz -Cluster verwendet, Quartz -Datenquellenkonfigurationsfabrik laden. factory.setAutostartup (true); factory.setApplicationContextSchedulerContextKey ("applicationContext"); // Register Trigger Factory.settriggers (Cronjobtrigger); <br data-filtered = "gefiltert"> // Verwenden Sie die Konfigurationsdatei direkt // factory.setConFigLocation (neuer DateisystemeSource (this.getClass). Rückgabefabrik; } / ** * Ladejob * @return * / @bean public JobDetailFactoryBean AktualisierteshobTatUSjobDetail () {return createjobDetail (invokingjobDetailDetailFactory.class, "aktualisierteshobatusgroup", "Dialogjob"); }/** * Laden Sie den Auslöser * @param Jobdetail * @return */@bean (name = "dialogjobtrigger") public crontriggerFactoryBean Dialogstatusjobtrigger (@Qualifier ("UpdateDialogStatusjobdetail" 0/0/zurück -DialogstatusGigger (Return DialogstatusGerger (). } / ** * Erstellen Sie die Jobfabrik * @param JobClass * @param GroupName * @param targetObject * @return * / private statische JobdetailFactoryBean createjobDetail (Klasse <?> JobClassClass, String GroupName, String targetObject) {JobDetailoryBean FactoryBean = new JobDetaTorfactoryBean (); factoryBean.setjobClass (JobClass); factoryBean.setDurability (true); factoryBean.setRequestSRecovery (true); factoryBean.setGroup (GroupName); Karte <String, String> map = new Hashmap <> (); map.put ("targetObject", targetObject); map.put ("targetMethod", "execute"); factoryBean.setjobdataasmap (MAP); Rückkehrfabrik; } / ** * Erstellen Sie eine Trigger -Fabrik * @param Jobdetail * @param cronexpression * @return * / private statische crontriggerfactoryBean Dialogstatustreger (JobDetail -Jobdetail, String cronexpression) {contriggerFactoryBean FactoryBean = new contriggerFactoryBean (); factoryBean.setjobDetail (JobDetail); factoryBean.setCronexpression (cronexpression); Rückkehrfabrik; }}InvokingjobDetailDetailFactory -Objekt:
öffentliche Klasse InvocingJobDetailDetailFactory erweitert Quartzjobbean {// die Klasse, in der sich die geplante Aufgabe befindet, private String targetObject; // Die spezifische geplante Aufgabe muss private String targetMethod ausgeführt werden. private applicationContext ctx; @Override Protected void executeInternal (JobExecutionContext -Kontext) löscht JobExecutionException {try {Object oarGetObject = ctx.getbean (targetObject); Methode M = NULL; try {m = oargetObject.getClass (). getMethod (targetMethod); m.invoke (otargetObject); } catch (SecurityException e) {e.printstacktrace (); } catch (NoSuchMethodException e) {e.printstacktrace (); }} catch (Ausnahme e) {neue jobexecutionException (e) werfen; }} public void setApplicationContext (ApplicationContext applicationContext) {this.ctx = ApplicationContext; } public void settargetObject (String targetObject) {this.targetObject = targetObject; } public void settargetMethod (String targetMethod) {this.targetMethod = targetMethod; }}Hinweis: Die SET -Methode darf nicht fehlen. Der ApplicationContext im setApplicationContext bezieht sich auf den in factory gefüllten Wert. Das Prinzip wird vom Beanwrapper in der InvocingjobdetailDetailFactory -Elternklasse implementiert.
SQL-Skript:-
<em id = "__ mcedel">- Tabellenstruktur `QRTZ_BLOB_TRIGGERS`-- TABLE CREATE Wenn nicht existiert` qrtz_blob_triggers Motor = InnoDB Standard charSet = utf8mb4; - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ `Time_zone_id` varchar (80) Standard null) Engine = innoDB Standard charset = utf8mb4; . `TRIGGER_NAME` varchar(120) NOT NULL, `TRIGGER_GROUP` varchar(120) NOT NULL, `INSTANCE_NAME` varchar(120) NOT NULL, `FIRED_TIME` bigint(13) NOT NULL, `SCHED_TIME` bigint(13) NOT NULL, `PRIORITY` int(11) NOT NULL, `STATE` varchar(16) NOT NULL, `JOB_NAME` varchar (120) Standardnull, `Job_Group` varchar (120) Standardnull,` is_nonconcurrent` varchar (1) Standardnull, `Requests_Recovery` varchar (1) Standard Null) Engine = innoDB Default charset = utf8mb4; . . varchar (1) nicht null, `is_update_data` varchar (1) nicht null,` requests_recovery` varchar (1) nicht null, `Job_data` bloB) Engine = innoDB Standard charset = utf8mb4; . varchar (40) nicht null) motor = innoDB Standard charSet = utf8mb4; . Motor = InnoDB Standard charSet = utf8mb4; - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ `Checkin_interval` bigint (13) nicht null) motor = innoDB Standard charset = utf8mb4; . `Trigger_group` varchar (120) nicht null,` repect_count` bigint (7) nicht null, `repep_interval` bigint (12) nicht null,` times_triggered` bigint (10) nicht null) Engine = innoDb default charset = utf8mb4; . `qrtz_simprop_triggers` (` pled_name` varchar (120) nicht null, `trigger_name` varchar (120) NICHT NULL,` Trigger_group` varchar (120) nicht `STR_PROP_3` varchar(512) DEFAULT NULL, `INT_PROP_1` int(11) DEFAULT NULL, `INT_PROP_2` int(11) DEFAULT NULL, `LONG_PROP_1` bigint(20) DEFAULT NULL, `LONG_PROP_2` bigint(20) DEFAULT NULL, `DEC_PROP_1` decimal(13,4) DEFAULT NULL, `Bool_prop_1` varchar (1) Standardnull,` bool_prop_2` varchar (1) Standard null) motor = innoDB Standard charSet = utf8mb4; . `TRIGGER_GROUP` varchar(120) NOT NULL, `JOB_NAME` varchar(120) NOT NULL, `JOB_GROUP` varchar(120) NOT NULL, `DESCRIPTION` varchar(250) DEFAULT NULL, `NEXT_FIRE_TIME` bigint(13) DEFAULT NULL, `PREV_FIRE_TIME` bigint(13) DEFAULT NULL, `PRIORITY` int(11) DEFAULT Null, `trigger_state` varchar (16) nicht null,` trigger_type` varchar (8) nicht null, `start_time` bigint (13) nicht null,` end_time 'bigint (13) Standard Null, `calendar_name' varchar (200) standardmäßig null null,` Misfire_instrau). Motor = InnoDB Standard charSet = utf8mb4; --- Indexes for dumped tables- --- Indexes for table `qrtz_blob_triggers`--ALTER TABLE `qrtz_blob_triggers` ADD PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), ADD KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`); --- Indizes für die Tabelle `qrtz_calendars``-Overter Tabelle` qrtz_calendars` add Primärtaste (`pled_name`,` calendar_name`); --- Indizes für die Tabelle `qrtz_cron_triggers`-Overter Tabelle` qrtz_con_triggers`-Overter Tabelle `qrtz_cron_triggers` hinzufügen Primärschlüssel hinzufügen (` pled_name`, `trigger_name`,` trigger_group`); --- Indizes für die Tabelle `qrtz_fired_triggers`-Outter Tabelle` qrtz_fired_triggers` add Primärtast `Idx_qrtz_ft_inst_job_req_rcvry` (` pled_name`, `instance_name`,` Requests_Recovery`, Key # `idx_qrtz_ft_j_j_g` (` pledname`, `idx_qrtz_group`), add Key ad` idx_name`, `,`, `,`, `,`, `,`, `,`, `,`, `,`, `,`, `,`, `,`, `,`, `,`, `,`, `,`, `,`, `,`, `,`, `,`, `, #g. (`Pled_name`,` job_group`), add key `idx_qrtz_ft_t_g` (` pled_name`, `trigger_name`,` trigger_group`), add key `idx_qrtz_tg_tg` (` pledname`, `trigger_group_group); --- Indizes für die Tabelle `qrtz_job_details`-Overter Tabelle` qrtz_job_details` add Primärschlüssel (`pled_name`,` job_name`, `job_group`), add key `Idx_qrtz_j_grp` (` pled_name`, `job_group`); --- Indizes für Tabelle `qrtz_locks`-Overter Tabelle` qrtz_locks` Hinzufügen der Primärschlüssel (`pled_name`,` lock_name`); --- Indizes für die Tabelle `qrtz_paused_trigger_grps`-Overter Tabelle` QRTZ_PAUSED_TRYGER_GRPS` Fügen Sie die Primärschlüssel hinzu (`pled_name`,` Trigger_Group`); --- Indizes für die Tabelle `qrtz_scheduler_state`-Overter Tabelle` qrtz_scheduler_state` Add Primärtaste hinzufügen (`pled_name`,` instance_name`); --- Indizes für die Tabelle `qrtz_simple_triggers`-Overter Tabelle` qrtz_simple_triggers` Hinzufügen der Primärschlüssel (`pled_name`,` trigger_name`, `trigger_group`); --- Indizes für die Tabelle `qrtz_simple_triggers`-Overter Tabelle` qrtz_simple_triggers` Hinzufügen der Primärschlüssel (`pled_name`,` trigger_name`, `trigger_group`); --- Indexes for table `qrtz_triggers`--ALTER TABLE `qrtz_triggers` ADD PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), ADD KEY `IDX_QRTZ_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), ADD KEY `Idx_qrtz_t_jg` (` pled_name`, `job_group`), fügen Sie Taste` idx_qrtz_t_c` (`pled_name`,` calendar_name` (191)) hinzu, add Key `idx_qrtz_tz_g` (` planname `IDX_QRTZ_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`), ADD KEY `IDX_QRTZ_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`), ADD KEY `IDX_QRTZ_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`), ADD KEY `IDX_QRTZ_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`), ADD KEY `IDX_QRTZ_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`), ADD KEY `IDX_QRTZ_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`), ADD KEY `IDX_QRTZ_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`), ADD KEY `Idx_qrtz_t_nft_st_misfire_grp` (` pled_name`, `misfire_instr`,` next_fire_time`, `trigger_group`,` trigger_state`); --- Exportierte Tabellen begrenzen --- Grenztabellen `qrtz_blob_triggers`-Overter-Tabelle` qrtz_blob_triggers` addieren `qrtz_blob_triggers_ibfk_1` fremd key (` pled_name`, `trigger_name`,` trigger_group`) (`Pled_name`,` trigger_name`, `trigger_group`); --- Grenztabelle `QRTZ_CRON_TRIGGERS`-OUTER TABELLE` QRTZ_CRON_TRIGGERS` addieren Einschränkungen `qrtz_cron_triggers_ibfk_1` Fremdkey (` pledname`, `trigger_name`,` trigger_group`) `qrtz_iggers `Trigger_name`,` trigger_group`); --- Restriktionstabelle `qrtz_simple_triggers`-Outter Tabelle` qrtz_simple_triggers` addieren Sie die Einschränkung `qrtz_simple_triggers_ibfk_1 ausländische Taste (` pled_name`, `trigger_name`,` splan_group`) qrtz_triggs` (`trigger_group`) qtz_triggers` (` trigger_group`) `Trigger_name`,` trigger_group`); --- Grenztabelle `qrtz_simprop_triggers`-Overter Tabelle` qrtz_simprop_triggers` addieren Sie die Einschränkung `qrtz_simprop_triggers_ibfk_1` fremd key (` pled_name`, `trigger_name`,` tryder_group`) `Trigger_name`,` trigger_group`) referenzieren `qrtz_triggers` (` pled_name`, `trigger_name`,` trigger_group`); --- Restriktionstabelle `qrtz_triggers`-Overter-Tabelle` qrtz_triggers` Hinzufügen von Einschränkungen `qrtz_triggers_ibfk_1` fremd key (` pled_name`, `job_name`,` job_group`) referenzen `qrtz_job_details` (` platname '(`platname `Job_group`); <br> <br> <br> </em>
Das Implementierungsprinzip von Quartz Cluster verwendet die Datenbank, um das Jobverhalten aufzuzeichnen, und durch den Sperrmechanismus wird der Job nur einmal gleichzeitig ausgeführt.
Jobbean -Beispiel
// Es muss an den Spring übergeben werden, um @Service ("Dialogjob") der öffentlichen Klasse Dialogjob {@autowired private stellservice Fragen zu verwalten; // Der Methodenname wird in Quartz public void execute () ausgelöst {// Spezifische Ausführung der Geschäftsfragendienst.xxxxx (); }}Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.