Capacidad del clúster de cuarzo:
Los anteriores son algunas ideas personales. Comencemos el texto principal de este artículo. Este artículo presenta principalmente contenido relevante sobre la construcción de grupos de arranque de primavera + cuarzo. Se comparte para su referencia y aprendizaje. No diré mucho a continuación. Echemos un vistazo a la introducción detallada juntos.
Los pasos son los siguientes:
Configuración de frijol de arranque de primavera:
@ConfigurationPublic Class QuartzConfig {@Value ("$ {Quartz.scheduler.instancename}") String private QuartzinStanceName; @Value ("$ {org.quartz.dataSource.myds.driver}") String private MydsDriver; @Value ("$ {org.quartz.datasource.myds.url}") privado cadena Mydsuser; @Value ("$ {org.quartz.dataSource.myds.password}") String private MydsPassword; @Value ("$ {org.quartz.dataSource.myds.maxConnections}") String privado mydsmaxConnections; / ** * Establecer propiedades * @return * @throws ioException */ private Properties QuartzProperties () lanza ioException {Properties pro = new Properties (); prop.put ("cuarzo.scheduler.instancename", quartzinstancename); prop.put ("org.quartz.scheduler.instanceid", "auto"); prop.put ("org.quartz.scheduler.skipupdateCheck", "verdadero"); prop.put ("org.quartz.scheduler.jmx.export", "verdadero"); 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", "verdadero"); prop.put ("org.quartz.jobstore.clustercheckininterval", "20000"); prop.put ("org.quartz.jobstore.dataSource", "Myds"); prop.put ("org.quartz.jobstore.maxmisfirestoHandLeatEtime", "1"); prop.put ("org.quartz.jobstore.misfirethreshold", "120000"); prop.put ("org.quartz.jobstore.txisolationLevelSerializable", "verdadero"); prop.put ("org.quartz.jobstore.selectwithlocksql", "Seleccione * de {0} bloqueos donde lock_name =? para actualizar"); 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", "verdadero"); 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", "verdadero"); devolver el apoyo; } @Bean Public SchedulerFactoryBean SchedulerFactoryBean (@Qualifier ("dialogJobTrigger") dispara CronJobTrigger) lanza IOException {schedulerFactoryBean factory = new SchedulerFactoryBean (); // Esto permite actualizar los desencadenantes en DB al actualizar la configuración en el archivo de configuración: // utilizado para el clúster de cuarzo, QuartzScheduler actualiza los trabajos existentes al comenzar, de modo que no es necesario eliminar la tabla QRTZ_JOB_Details después de modificar el TargetObject. El registro correspondiente de fábrica.setOverWriteExistingJobs (verdadero); // Utilizado para el clúster de cuarzo, carga de datos de cuarzo de cuarzo //factory.setDataSource(DataSource); // QuartzScheduler retrasa el inicio, después de 10 segundos de inicio de la aplicación, QuartzScheduler comienza fábrica.setStartUpDelay (10); // Utilizado para el clúster de cuarzo, la configuración de la fuente de datos de cuarzo de cuarzo fábrica.setquartzProperties (QuartzProperties ()); fábrica.setAutostArtup (verdadero); factory.setApplicationContextsChedulerContextKey ("ApplicationContext"); // registrar el gatillo fábrica.setTriggers (cronJobTrigger); <Br datafiltered = "filtrado"> // use el archivo de configuración directamente // factory.setConfigLocation (new FilesystemResource (this.getClass (). GetResource ("/Quartz.Properties"). GetPath ())); Return Factory; } / ** * Cargando trabajo * @return * / @Bean Public JobDetailFactoryBean UpdateTialogStatusJobDetail () {return createJobDetail (invocandoJobDetailDetailfactory.class, "UpdateDialogStatusGroup", "dialogJob"); }/** * Cargue el disparador * @param jobDetail * @return */@Bean (name = "dialogJobTrigger") public crontriggerFactoryBean dialogStatusJobTrigger (@Qualifier ("UpdateDialogStatUsJobDetail") JobDetail JobDetail) {return DialogStigger (JobDetail, "01 *? } / ** * Crea la fábrica de trabajo * @param JobClass * @param groupname * @param TargetObject * @return * / private static jobDetailFactoryBean createJobDetail (class <?> JobClass, String GroupName, String TargetObject) {JobDetailFactoryBean FactoryBean = NewDetailFactoryBean (); FactoryBean.SetJobClass (JobClass); FactoryBean.SetDurability (verdadero); FactoryBean.SetRequestSroCovery (verdadero); FactoryBean.SetGroup (GroupName); Map <string, string> map = new HashMap <> (); map.put ("TargetObject", TargetObject); map.put ("TargetMethod", "ejecutar"); factorybean.setJobdataMap (map); Return FactoryBean; } / ** * Crear una fábrica de activación * @param JobDetail * @param cronexpression * @return * / private static crontriggerFactoryBean dialogStatausSrigger (JobDetail JobDetail, string cronexpression) {crontriggerFactoryBean factoryBean = new CrontriggerFactoryBean (); FactoryBean.SetJobDetail (JobDetail); FactoryBean.setCronexpression (cronexpression); Return FactoryBean; }}InvocingJobDetailDetailFactory Object:
La clase pública invocando JobdetailDetailFactory extiende QuartzJobbean {// La clase donde la tarea programada se encuentra privada String TargetObject; // La tarea programada específica debe ejecutarse privada de cadena TargetMethod; Aplicación privadaContext CTX; @Override Protected void ExecuteInternal (JobExecutionContext Context) lanza JobExecutionException {try {object oarGetObject = ctx.getBean (TargetObject); Método m = nulo; intente {m = oargetObject.getClass (). getMethod (targetMethod); M.Invoke (OtarGetObject); } catch (SecurityException e) {E.PrintStackTrace (); } catch (nosuchmethodexception e) {E.PrintStackTrace (); }} catch (Exception e) {tire New JobExecutionException (e); }} public void setApplicationContext (ApplicationContext ApplicationContext) {this.ctx = ApplicationContext; } public void settarGetObject (String TargetObject) {this.targetObject = TargetObject; } public void settargetMethod (String TargetMethod) {this.TargetMethod = TargetMethod; }}Nota: El método establecido no debe faltar. El ApplicationContext en SetApplicationContext está relacionado con el valor relleno en fábrica. El principio es implementado por el beanwrapper en la clase InvocingJobDetailDetailFactory Parent.
script sql:-
<em id = "__ mcedel">- estructura de la tabla `qrtz_blob_triggers`-- Crear tabla si no existe` qrtz_blob_triggers` (`sched_name` varchar (120) no null,` dispare_name` varchar (120) no null, `thrigger_group` varchar (120) no null,` blob) Motor = innodb predeterminado charset = utf8mb4; - --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- `Time_zone_id` varchar (80) predeterminado nulo) motor = innodb predeterminado charset = utf8mb4; ------------------------------------------------------------------------------------------------------------------------ `Trigger_name` varchar (120) no null,` Trigger_group` varchar (120) no nulo, `instance_name` varchar (120) no null,` Fired_time` bigint (13) no nulo, `sched_time` bigint (13) no null,` priority `int (11) no null,` state` Varchar (16) no nula varchar (120) predeterminado nulo, `job_group` varchar (120) predeterminado nulo,` is_nonconcurrent` varchar (1) predeterminado nulo, `requests_recovery` varchar (1) predeterminado nulo) motor = innodb default Charset = utf8mb4; ------------------------------------------------------------------------------------------------------------------------------------------------------------ ( `SCHED_NAME` varchar(120) NOT NULL, `JOB_NAME` varchar(120) NOT NULL, `JOB_GROUP` varchar(120) NOT NULL, `DESCRIPTION` varchar(250) DEFAULT NULL, `JOB_CLASS_NAME` varchar(250) NOT NULL, `IS_DURABLE` varchar(1) NOT NULL, `IS_NONCONCURRENT` varchar(1) No nulo, `is_update_data` varchar (1) no nulo,` requests_recovery` varchar (1) no null, `job_data` blob) motor = innodb default charset = utf8mb4; ------------------------------------------------------------------------------------------------------------------------------------------------------------ varchar (40) no nulo) motor = innodb predeterminado charset = utf8mb4; -------------------------------------------------------------------------------------------------------------------- Motor = innodb predeterminado charset = utf8mb4; - ------------------------------------------------------------------------------------------- --------------------------------------------------------------------------- `Checkin_interval` bigint (13) no nulo) motor = innodb predeterminado charset = utf8mb4; ------------------------------------------------------------------------------------------------------------------------ `Trigger_group` varchar (120) no nulo,` repet_count` bigint (7) no nulo, `repetir_interval` bigint (12) no nulo,` times_triggered` bigint (10) no nulo) motor = innodb predeterminado charset = utf8mb4; -------------------------------------------------------------------------------------------------------- `QRTZ_SIMPROP_TRIGGERS` (` SHET_NAME` VARCHAR (120) NO NULL, `TRIGGER_NAME` VARCHAR (120) NO NULL,` TRIGGER_GROUP` VARCHAR (120) NO NULL, `STR_PROP_1` VARCHAR (512) NULL,` sTR_PROP_2` VARCHAR (512) NULL) `Str_prop_3` varchar (512) predeterminado nulo,` int_prop_1` int (11) predeterminado nulo, `int_prop_2` int (11) predeterminado nulo,` long_prop_1` bigint (20) predeterminado NULL, `long_prop_2` bigint (20) predeterminado NULL,` dec_prop_1` decimal (13,4) predeterminado, `long_prop_2` bigint (20) predeterminado,` dec_c_prop_1` decimal (13,4) predeterminado, `long_prop_2` bigint (20) predeterminado,` dec_c_prop_1` decimal (13,4) predeterminado, predeterminado) `Bool_prop_1` varchar (1) predeterminado nulo,` bool_prop_2` varchar (1) predeterminado nulo) motor = innodb default charset = utf8mb4; -------------------------------------------------------------------------------------------------------------------- `Trigger_group` varchar (120) no nulo,` job_name` varchar (120) no null, `job_group` varchar (120) no null,` descripción varchar (250) NULL NULL, `next_fire_time` bigint (13) predeterminado NULL,` previo_fire_time` bigint (13) NULL, `Priority` Priority `11) NULL, NULL, NULL,` Prev_fire_time` bigint (13) NULL, `Priority` Priority `11) NULL, 11) NULL, NULL,` PREV_FIRE_TIME` BIGINT (13) NULL, `Priority` Priority `11), 11) NULL, NULL,` previsual. `Trigger_state` varchar (16) no nulo,` thrigger_type` varchar (8) no null, `start_time` bigint (13) no null,` end_time` bigint (13) null null, `calendar_name` varchar (200) predeterminado predeterminado,` falfre_instr` pequeño (2) predeterminado NULL, `job_datE` varchar) Charset = utf8mb4; --- Índices para tablas volcadas --- Índices para la tabla `qrtz_blob_triggers`-alter tabla` qrtz_blob_triggers` Agregue la clave principal (`` shatte_name`, `trigger_name`,` trigger_group`), agregue Key `sched_name` (` sched_name`, `trigger_name`,` `turger`); --- Índices para la tabla `qrtz_calendars`-Tabla alter` QRTZ_CALENDARS` Agregar clave primaria (`sched_name`,` calendar_name`); --- Índices para la tabla `Qrtz_Cron_triggers`-Tabla Alter` QRTZ_CRON_TRIGGERS`-Tabla Alter `Qrtz_Cron_triggers` agregue la tecla primaria (` sched_name`, `trigger_name`,` trigger_group`); --- Índices para la tabla `qrtz_fired_triggers`-Tabla alter` qrtz_fired_triggers` agregue la tecla primaria (`shitte_name`,` entry_id`), agregue la tecla `IDX_QRTZ_FT_TRIG_INST_NAME` (` Sched_name`, `INSTAIGN_NAME '), Add Add `Idx_qrtz_ft_inst_job_req_rcvry` (` sched_name`, `instancy_name`,` requests_RECovery`), agrego clave `idx_qrtz_ft_j_g` (` sched_name`, job_name`, `job_group` (`Sched_name`,` Job_group`), agregue la clave `IDX_QRTZ_FT_T_G` (` SHET_NAME`, `TRIGGER_NAME`,` TRIGGER_GROUP`), agregue la clave `idX_QRTZ_FT_TG` (` Sched_name`, `tgRIGG_GROUP`); --- Índices para la tabla `qrtz_job_details`-alter tabla` qrtz_job_details` agregue la tecla principal (`shitte_name`,` job_name`, `job_group`), agrega clave` idX_QRTZ_J_REQ_RECOVERY` (`Schin `IDX_QRTZ_J_GRP` (` SHET_NAME`, `JOB_GROUP`); --- Índices para la tabla `qrtz_locks`-Tabla alter` qrtz_locks` Agregar clave primaria (`sched_name`,` lock_name`); --- Índices para la tabla `qrtz_paused_trigger_grps`-Tabla alter` QRTZ_PAUSEUDSE_TRIGG_GRPS` Agregar clave primaria (`sched_name`,` trigger_group`); --- Índices para la tabla `qrtz_scheduler_state`-tabla alter` qrtz_scheduler_state` agregue la tecla primaria (`shitte_name`,` instance_name`); --- Índices para la tabla `qrtz_simple_triggers`-Tabla alter` qrtz_simple_triggers` Agregar tecla primaria (`shitte_name`,` trigger_name`, `trigger_group`); --- Índices para la tabla `qrtz_simple_triggers`-Tabla alter` qrtz_simple_triggers` Agregar tecla primaria (`shitte_name`,` trigger_name`, `trigger_group`); --- Índices para la tabla `qrtz_triggers`-alter tabla` qrtz_triggers` Agregar clave primaria (`sched_name`,` thrigger_name`, `trigger_group`), agregar clave` IDX_QRTZ_T_J` (`Sched_name`,` Job_name`, `Job_group`), Agregar clave `Idx_qrtz_t_jg` (` sched_name`, `job_group`), agregue la clave` IDX_QRTZ_T_C` (`sched_name`,` calendar_name` (191), agrega clave `idX_QRTZ_T_G` (` schin_name`, `trigger_group`), add `IDX_QRTZ_T_STATE` (` Sched_name`, `Trigger_state`), agregue la clave` IDX_QRTZ_T_N_STATE` (`Sched_name`,` Trigger_name`, `Trigger_group`,` Trigger_State`), agrega Key `IDX_QRTZ_T_T_G_GE_GE_GE_GE_GE_GE_GE_ (`Shatte_name`,` Trigger_group`, `Trigger_state`), agregue la tecla` idX_QRTZ_T_NEXT_FIRE_TIME` (`shell_name`,` next_fire_time`), agregues `idx_qrtz_tz_t_nft_st` (` thapst_name`, `TRIGSTRO_STATE`,` `IDX_QRTZ_TZ_T_NFT_ST` (` SHET_NAME`, `TRIGSTRO `IDX_QRTZ_T_NFT_MISFIRE` (` SHET_NAME`, `MISFIRE_INSTR`,` NEXT_FIRE_FIRE_TIME`), agregue la clave `idX_QRTZ_T_NFT_ST_MISFIRE` (` sched_nam `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (` SHET_NAME`, `MISFIRE_INSTR`,` NEXT_FIRE_TIME`, `TRIGGER_GROUP`,` TRIGGER_STATE`); --- Límite Tablas exportadas --- Tablas de límite `Qrtz_Blob_triggers`-Alter Table` Qrtz_Blob_triggers` Agregar restricción `qrtz_blob_triggers_ibfk_1` Key (` sphed_nname`, `TRIGGER_NAME`,` TRIGGER_GROUP ') Referencias `Qrtz_Triggers`,` TRAGA_NAME`,', TATED_NAME ' `Trigger_name`,` trigger_group`); --- tabla límite `qrtz_cron_triggers`-alter tabla` qrtz_cron_triggers` Agregar restricción `QRTZ_CRON_TRIGGERS_IBFK_1` Clave exterior (` sched_name`, `Trigger_Name`,` TRIGGER_GROUP`) Referencias `QRTZ_triggers` (` Sched_Name`, `TRIGGER_GROUP`) REFERENCIAS` QRTZ_TRIGGERS` (`SCHED_NAME ' `Trigger_name`,` trigger_group`); --- Tabla de restricción `QRTZ_SIMPLE_TRIGGERS`-TABLA DELTER` QRTZ_SIMPLE_TRIGGERS` Agregar restricción `qrtz_simple_triggers_IBFK_1` Key (` `Name`, `TRIGG_NAME`,` TRIGGER_GROUP ') Referencias `QRTz_ `Trigger_name`,` trigger_group`); --- Tabla de límite `qrtz_simprop_triggers`-Tabla Alter` qrtz_simprop_triggers` Agregar restricción `qrtz_simprop_triggers_ibfk_1` Key (` `sphed_name`,` TRIGGER_NAME`, `TRIGGER_GROUPIENCIAS` QRTZE_ `Trigger_name`,` Trigger_Group`) Referencias `QRTZ_TRIGGERS` (` SHET_NAME`, `TRIGGER_NAME`,` TRIGGER_GROUP`); --- Tabla de restricción `Qrtz_triggers`-Tabla Alter` Qrtz_triggers` Agregar restricción `qrtz_triggers_ibfk_1` Key (` sched_name`, `job_name`,` job_group`) referencias `qrtz_job_details` (` schel_name`, `job_group`)` Qrtz_job_details` (`sched_name`,` job_group`) `QRTZ_JOB_DETAILS` (` SCHED_NAME`, `JOB_GROUP`)` QRTZ_JOB_DETAI `Job_group`); <br> <br> <br> </em>
El principio de implementación del clúster de cuarzo utiliza la base de datos para registrar el comportamiento laboral y, a través del mecanismo de bloqueo, el trabajo se ejecuta solo una vez al mismo tiempo.
Ejemplo de Jobbean
// Debe entregarse para que Spring para administrar @Service ("dialogJob") public class dialogJob {@aUtoWired Preguntas privadas de preguntas de preguntas; // El nombre del método se define en Quartz public void ejecutute () lanza excepción {// Ejecución específica de servicio de negocios.xxxxxxxxx (); }}Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.