Capacité de cluster en quartz:
Ce qui précède sont des idées personnelles. Commençons le texte principal de cet article. Cet article présente principalement un contenu pertinent sur la construction de clusters Spring Boot + Quartz. Il est partagé pour votre référence et votre apprentissage. Je ne dirai pas beaucoup en dessous. Jetons un coup d'œil à l'introduction détaillée ensemble.
Les étapes sont les suivantes:
Configuration du bean de démarrage de printemps:
@Configurationpublic class quartzconfig {@value ("$ {quartz.scheduler.instanceName}") String privé quartzinstanceName; @Value ("$ {org.quartz.datasource.myds.driver}") String privé MyDSDriver; @Value ("$ {org.quartz.datasource.myds.url}") STRING PRIVÉ MYDSUSER; @Value ("$ {org.quartz.datasource.myds.password}") String privé MyDSPassword; @Value ("$ {org.quartz.datasource.myds.maxconnections}") String privé MyDSMaxConnections; / ** * Définir les propriétés * @return * @throws ioException * / Propriétés privées QuartzProperties () lève ioException {Properties prop = new Properties (); Prop.put ("Quartz.scheduler.instanceName", QuartzinStanceName); 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", "true"); Prop.put ("org.quartz.jobstore.selectwithlocksql", "select * from {0} verrouille où lock_name =? pour la mise à jour"); 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.threadsinheritContextClassLoDerofinitializingThread", "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"); Retour Prop; } @Bean Public SchedulerFactoryBean SchedulerFactoryBean (@qualifier ("DialogJobtrigger") Trigger Cronjobtrigger) lève IOException {SchedulerFactoryBean Factory = new SchedulerFactoryBean (); // Cela permet de mettre à jour les déclencheurs dans la base de données lors de la mise à jour des paramètres dans le fichier de configuration: // utilisé pour le cluster Quartz, QuartzScheduler met à jour les travaux existants au démarrage, afin qu'il ne soit pas nécessaire de supprimer le tableau QRTZ_JOB_DETAILS après avoir modifié le TargetObject. L'enregistrement correspondant de factory.setOverwriteExistingJobs (true); // Utilisé pour le cluster de quartz, la source de données de quartz de charge //factory.setDatasource(DataSource); // QuartzScheduler détache le démarrage, après 10 secondes de démarrage d'application, QuartzScheduler démarre Factory.SetStartupDelay (10); // Utilisé pour le cluster de quartz, charge de la source de données de quartz Configuration Factory.SetHartzProperties (QuartzProperties ()); factory.setAutostartup (true); factory.setApplicationContexTScheDulerConTextKey ("ApplicationContext"); // registre Trigger factory.setTriggers (Cronjobtrigger); <br data-filtory = "filtré"> // utilise le fichier de configuration directement // factory.setConfiglocation (new FileSystemResource (this.getClass (). GetResource ("/ Quartz.Properties"). GetPath ())); Retour Factory; } / ** * Job de chargement * @return * / @bean public jobdetailfactoryBean updateDialogStatusJobDetail () {return CreateJobDetail (invokingJobDetailDetailfactory.class, "UpdatedIalioGStatusGroup", "Dialogjob"); } / ** * Chargez le déclencheur * @param jobdetail * @return * / @bean (name = "DialogJobtrigger") public CronTrighTFactoryBean DialogStatusJobtrigger (@qualifier ("returnaliogStatusJobdetail") Jobdetail jobdetail) {return dialogsaturggerg (jobdetail, "0 0/1 *?"); } / ** * Créer l'usine Job Factory * @param jobclass * @param groupname * @param TargetObject * @return * / private static jobdetailfactoryBean CreateJobDetail (class <?> Jobclass, string groupename, string targetObject) {jobdetailfactorybean factoryBean = newtdetailfactoryBean ();); factorybean.setJobClass (JobClass); FactoryBean.SetDurability (true); FactoryBean.SetRequestSrecovery (true); factorybean.setGroup (groupe de groupe); Map <string, string> map = new hashmap <> (); map.put ("TargetObject", TargetObject); map.put ("TargetMethod", "Execute"); factorybean.setJobDataAmmap (carte); Retour FactoryBean; } / ** * Créer une usine de déclenchement * @param jobdetail * @param cronexpression * @return * / private static CRRRIGGFACTORYBEAN DialogStatugrigger (jobdetail jobdetail, string Cronexpression) {CRerRriggerFactoryBean FactoryBean = new CRONEXPRESTYBEAN (); factoryBean.setJobDetail (JobDetail); FactoryBean.SetCronexpression (cronexpression); Retour FactoryBean; }}InvocingJobDetailDetailFactory Objet:
Classe publique InvocingJobDetailDetailFactory étend QuartzJobbean {// La classe où la tâche planifiée est située à la chaîne privée TargetObject; // La tâche planifiée spécifique doit être exécutée TargetMethod de chaîne privée; Application PrivateContext CTX; @Override Protected void executeInternal (JobExEcutionContext Context) lève JobExEcutionException {try {object oargetObject = ctx.getBean (TargetObject); Méthode m = null; essayez {m = oargetObject.getClass (). getMethod (TargetMethod); M.Invoke (OtargetObject); } catch (SecurityException e) {e.printStackTrace (); } catch (NosuchMethodexception e) {e.printStackTrace (); }} catch (exception e) {lancer un nouveau jobExecutionException (e); }} public void setApplicationContext (applicationContext ApplicationContext) {this.ctx = applicationContext; } public void SettRargetObject (String TargetObject) {this.targetObject = TargetObject; } public void SettargetMethod (String TargetMethod) {this.targetMethod = TargetMethod; }}Remarque: la méthode définie ne doit pas être manquante. L'applicationContext dans le setApplicationContext est liée à la valeur remplie dans factory.setApplicationContexTScheduleConTexty ("ApplicationContext"). Le principe est mis en œuvre par le beanwrapper dans la classe parent InvokingJobDetailDetailFactory.
Script SQL: -
<em id = "__ mcededel"> - Structure de table `qrtz_blob_triggers`-- Créer un tableau s'il n'existe pas` qrtz_blob_triggers` (`sched_name` varchar (120) pas nul Moteur = innodb par défaut Charset = UTF8MB4; - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- `TIME_ZONE_ID` VARCHAR (80) NULL DE DÉFAUT) MOTEUR = INNODB CHARSET DE DÉFAUT = UTF8MB4; - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- `Trigger_name` varchar (120) pas null,` Trigger_group` varchar (120) pas null, `instance_name` varchar (120) pas null,` fine_time` bigint (13) pas null, `sched_time` bigint (13) pas null,` prioritaire 'int (11) non null, `` état` varchar (120) par défaut null, `job_group` varchar (120) par défaut null,` is_nonconcurrent` varchar (1) par défaut null, `requets_recovery` varchar (1) default null) moteur = innodb par défaut charet = utf8mb4; - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- (`Sched_name` varchar (120) pas null,` job_name` varchar (120) pas null, `job_group` varchar (120) pas null,` description` varchar (250) par défaut null, `job_class_name` varchar (250) pas nul Pas null, `is_update_data` varchar (1) pas null,` requests_recovery` varchar (1) pas null, `job_data` blob) moteur = innodb charset par défaut = utf8mb4; - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- varchar (40) non null) moteur = innodb Charset par défaut = utf8mb4; - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Moteur = innodb par défaut Charset = UTF8MB4; - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- `Checkin_Interval` bigInt (13) pas null) moteur = innodb par défaut Charset = utf8mb4; - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- `Trigger_Group` varchar (120) pas null,` repeat_count` bigint (7) pas null, `repeat_interval` bigint (12) pas null,` Times_triggerd` bigint (10) pas null) moteur = innodb charet par défaut = utf8Mb4; - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- `qrtz_simprop_triggers` (` sched_name` varchar (120) pas null, `Trigger_name` varchar (120) pas null,` Trigger_group` varchar (120) non nul `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) par défaut null,` bool_prop_2` varchar (1) moteur null) par défaut = innodb charset par défaut = utf8mb4; - ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- `Trigger_Group` varchar (120) pas null,` job_name` varchar (120) pas null, `job_group` varchar (120) non null,` description` varchar (250) par défaut nul `Trigger_state` varchar (16) pas null,` Trigger_type` varchar (8) pas null, `start_time` bigint (13) pas null,` end_time` bigint (13) null, `calendar_name` varchar (200) par défaut nul Charse = UTF8MB4; --- Indexes pour les tables vidées- --- Index pour la table `qrtz_blob_triggers` - table alter` qrtz_blob_triggers` ajouter la clé primaire (`sched_name`,` Trigger_name`, `Trigger_group`), ajouter la clé` sched_name` (`sched_name`,` Trigger_name`, `TROUGH_GROUP_name`,` Trigger_name`, `TROUGH_GROUP); --- Index pour la table `QRTZ_CALEENDARS` - ALTER TABLE` QRTZ_CALEENDARS` Ajouter une clé primaire (`sched_name`,` calendar_name`); --- Index pour la table `qrtz_cron_triggers` - Tableau alter` qrtz_cron_triggers` - table alter `qrtz_cron_triggers` ajouter la clé primaire (` sched_name`, `Trigger_name`,` Trigger_Group`); --- Index pour la table `qrtz_fired_triggers` - Tableau alter` qrtz_fired_triggers` ajouter la clé primaire (`sched_name`,` entrée_id`), ajouter la clé `idx_qrtz_ft_trig_inst_name` (` sched_name`, `instance`), ajouter key `Idx_qrtz_ft_inst_job_req_rcvry` (` sched_name`, `instance_name`,` requêtes_recover (`Sched_name`,` job_group`), ajoutez la clé `idx_qrtz_ft_t_g` (` sched_name`, `Trigger_name`,` Trigger_Group`), ajoutez la clé `idx_qrtz_ft_tg` (` sched_name`, `Trigger_Group`); --- indexes pour la table `qrtz_job_details` - table alter` qrtz_job_details` ajouter la clé primaire (`sched_name`,` job_name`, `job_group`), ajouter` idx_qrtz_j_req_recover `Idx_qrtz_j_grp` (` sched_name`, `job_group`); --- Index pour la table `qrtz_locks` - Tableau alter` qrtz_locks` ajouter la clé primaire (`sched_name`,` lock_name`); --- Index pour la table `qrtz_paused_trigger_grps` - Tableau alter` qrtz_paused_trigger_grps` ajouter la clé primaire (`sched_name`,` Trigger_group`); --- Index pour la table `QRTZ_SCHEDULER_STATE` - ALTER TABLE` QRTZ_SCHEDULER_STATE` Ajouter une clé primaire (`sched_name`,` instance_name`); --- Indexes pour la table `qrtz_simple_triggers` - alter table` qrtz_simple_triggers` ajouter la clé primaire (`sched_name`,` Trigger_name`, `Trigger_Group`); --- Indexes pour la table `qrtz_simple_triggers` - alter table` qrtz_simple_triggers` ajouter la clé primaire (`sched_name`,` Trigger_name`, `Trigger_Group`); --- indexes pour la table `qrtz_triggers` - alter table` qrtz_triggers` ajouter la clé primaire (`sched_name`,` Trigger_name`, `Trigger_group`), ajouter la clé` idx_qrtz_t_j` (`sched_name`,` job_name`, `job_group`), ajout de clés `Idx_qrtz_t_jg` (` sched_name`, `job_group`), ajouter key` idx_qrtz_t_c` (`sched_name`,` calendar_name` (191)), ajouter `idx_qrtz_t_g` (` sched_name`, `TRIGGOS_GOUP`), ajouter. `Idx_qrtz_t_state` (` sched_name`, `Trigger_state`), ajoutez la clé` idx_qrtz_t_n_state` (`sched_name`,` Trigger_name`, `Trigger_Group`,` Trigger_state`), ajouter la clé `idx_qrtz_t_g_g_g_g_g_g_g_g_go (`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`), Ajoutez une clé `idx_qrtz_t_nft_misfire` (` sched_name`, `misfire_instr`,` next_fire_time`), ajoutez la clé `idx_qrtz_t_nft_st_misfire` (` sched_name`, `misfire_instr`,` Next_fire_time`, `TRIGH_STATE`),` Next_fire_time`, `TRIGGE_),` Next_fire_time`, `TRIGGE_),` Next_fire_time`, `TRIGGE_),,` Next_fire_time`, `TRIGH_STATATE`) `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (` sched_name`, `misfire_instr`,` next_fire_time`, `Trigger_Group`,` Trigger_State`); --- limiter les tables exportées --- limiter les tables `qrtz_blob_triggers` - table alter` qrtz_blob_triggers` ajouter la contrainte `qrtz_blob_triggers_ibfk_1` forest key (` sched_name`, `trigrig (`Sched_name`,` Trigger_name`, `Trigger_Group`); --- Tableau limite `qrtz_cron_triggers` - Tableau alter` qrtz_cron_triggers` Ajouter une contrainte `qrtz_cron_triggers_ibfk_1` Foreign Key (` sched_name`, `Trigger_name`,` Trigger_Group`) `Trigger_name`,` Trigger_Group`); --- Tableau de restriction `Qrtz_simple_triggers` - Tableau alter` Qrtz_simple_triggers` Ajouter une contrainte `Qrtz_simple_triggers_ibfk_1` Foreign Key (` sched_name`, `Trigger_name`,` Trigger_Group`) références ' `Trigger_name`,` Trigger_Group`); --- Tableau de limite `QRTZ_SIMPROP_TRIGGERS` - ALTER TABLE` QRTZ_SIMPROP_TRIGGERS` ADD CONSTRAINTION `QRTZ_SIMPROP_TRIGGERS_IBFK_1` FORGT KEY (' `Trigger_name`,` Trigger_Group`) Références `qrtz_triggers` (` sched_name`, `Trigger_name`,` Trigger_Group`); --- Tableau de restriction `qrtz_triggers` - Tableau alter` qrtz_triggers` Ajouter une contrainte `qrtz_triggers_ibfk_1` Foreign Key (` sched_name`, `job_name`,` job_group`) références `QRTZ_JOB_DETAILS` (' `Job_group`); <br> <br> <br> </em>Le principe d'implémentation du cluster Quartz utilise la base de données pour enregistrer le comportement du travail, et grâce au mécanisme de verrouillage, le travail n'est exécuté qu'une seule fois dans le même temps.
Exemple de Jobbean
// Il doit être remis à Spring pour gérer @Service ("DialogJob") Classe publique DialogJob {@Autowired Private QuesterService QuesterService; // Le nom de la méthode est défini dans Quartz public void execute () lance une exception {// Exécution spécifique de l'entreprise Question Service.xxxxx (); }}Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.