Capacidade de cluster de quartzo:
O exposto acima são algumas idéias pessoais. Vamos iniciar o texto principal deste artigo. Este artigo apresenta principalmente conteúdo relevante sobre a construção de clusters de bota de primavera + quartzo. É compartilhado para sua referência e aprendizado. Não vou dizer muito abaixo. Vamos dar uma olhada na introdução detalhada juntos.
As etapas são as seguintes:
Configuração do feijão da bota da primavera:
@ConfigurationPublic Classe quartzConfig {@Value ("$ {quartz.scheduler.instanceName}") private string quartzinstancename; @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; / ** * Definir propriedades * @return * @THOWSoxception */ Private Properties QuartzProperties () lança 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", "selecione * de {0} bloqueia onde lock_name =? para atualização"); 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.threadsiRitContextClassLoadeRofinitializeThread", "True"); prop.put ("org.quartz.datasource.myds.driver", mydsdriver); prop.put ("org.quartz.datasource.myds.url", mydsurl); prop.put ("org.quartz.datasource.myds.user", mydsusser); 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"); devolver prop; } @Bean Public SchedulerFactoryBean SchedulerFactoryBean (@qualifier ("DialogJobTrigger") Trigger Cronjobtrigger) lança IoException {SchedulerFactoryBean Factory = new SchedulerFactoryBean (); // Isso permite atualizar gatilhos no banco de dados ao atualizar as configurações no arquivo de configuração: // usado para cluster de quartzo, o QuartzScheduler atualiza os trabalhos existentes ao iniciar, para que não haja necessidade de excluir a tabela QRTZ_JOB_DETAILS após modificar o TargetObject. O registro correspondente de fábrica.setOverWriteExistingJobs (true); // usado para cluster de quartzo, carga de dados de quartzo //factory.setDataSource(DataSource); // quartzscheduler atrasa a startup, após 10 segundos de startup de aplicativos, o quartzscheduler inicia a fábrica.setStartupDelay (10); // Usado para cluster de quartzo, carregar o quartzo de configuração de dados de dados fábrica.setquartzproperties (quartzproperties ()); Factory.SetAutosTup (true); Factory.SetApplicationContextSchedulerContextKey ("ApplicationContext"); // Registre o Trigger Factory.SetTriggers (Cronjobtrigger); <Br Data-filtered = "Filled"> // Use o arquivo de configuração diretamente // Factory.SetConfigLocation (new FileSystemResource (thisgetclass (). fábrica de retorno; } / ** * Trabalho de carregamento * @RETURN * / @Bean public JobDetailFactoryBean UpdatedialogStatusJobDetail () {return createJobDetail (InvokingJobDetailDetailFactory.Class, "UpdateLogStatusGroup", "Dialogjob"); } /** * Load the trigger* @param jobDetail * @return */ @Bean(name = "dialogJobTrigger") public CronTriggerFactoryBean dialogStatusJobTrigger(@Qualifier("updateDialogStatusJobDetail") JobDetail jobDetail) { return dialogStatusTrigger(jobDetail, "0 0 0/1 * * ? "); } / ** * Crie a fábrica de empregos * @param jobclass * @param groupName * @param TargetObject * @return * / private static jobDetailFactoryBean createJobDetail (classe <? FactoryBean.setJobclass (JobClass); FactoryBean.SetDurability (true); FactoryBean.SetRequestSRecovery (true); FactoryBean.SetGroup (GroupName); Mapa <string, string> map = new hashmap <> (); map.put ("TargetObject", TargetObject); map.put ("TargetMethod", "Execute"); FactoryBean.SetJobDataasMap (mapa); retornar a FactoryBean; } / ** * Crie uma fábrica de gatilho * @param jobDetail * @param cronexpression * @return * / private estático crontriggerFactoryBean DialogStAtrigger (JobDetail JobDetail, String cronexpression) {crontriggerFactoryBeanBeanBean = new CroNTriggerBeanBan) FactoryBean.SetJobDetail (JobDetail); FactoryBean.Setcronexpression (Cronexpression); retornar a FactoryBean; }}InvingJobDetailDetailfactory Object:
classe pública InvokingJobDetailDetailfactory estende o quartzjobbean {// a classe onde a tarefa programada está localizada private string TargetObject; // A tarefa agendada específica precisa ser executada de segmentMethod de sequência privada; ApplicationContext privado CTX; @Override Protected void ExecuteInternal (contexto JobExecutionContext) lança JobExecutionException {try {Object OargetObject = ctx.getBean (TargetObject); Método m = nulo; tente {m = oargetObject.getClass (). getMethod (TargetMethod); M.Invoke (OtargegetObject); } Catch (SegurançaException e) {E.PrintStackTrace (); } catch (noschmethodException e) {e.printStackTrace (); }} catch (Exceção e) {lança nova JobExecutionException (e); }} public void setApplicationContext (ApplicationContext ApplicationContext) {this.ctx = ApplicationContext; } public void STETTARGEGETOBJET (String TargetObject) {this.TargeGetObject = TargetObject; } public void SettargetMethod (String TargetMethod) {this.targetMethod = TargetMethod; }}NOTA: O método definido não deve estar faltando. O ApplicationContext no setApplicationContext está relacionado ao valor preenchido em Factory.SetApplicationContextSchedulerContextKey ("ApplicationContext"). O princípio é implementado pelo Beanwrapper na classe de pais InvokingJobDetailDetailFactory.
Script SQL:-
<EM ID = "__ mcedel">- Estrutura da tabela `qrtz_blob_triggers`-- Crie a tabela se não existe` qrtz_blob_triggers` (`sched_name` varchar (120) não nulo,` trigger_name` (120) não null, `trigger_Group_Group ' Mecanismo = innodb padrão padrão = utf8mb4; - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- `Time_zone_id` varchar (80) nulo padrão) mecanismo = innodb Charset padrão = 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) nulo padrão, `job_group` varchar (120) nulo padrão,` is_nonConcurrent` varchar (1) nulo padrão, `requests_recovery` varchar (1) padrão nulo) mecan -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- (`Schede_name` varchar (120) não nulo,` job_name` varchar (120) não nulo, `job_group` varchar (120) não nulo,` descrição 'varchar (250) null, `job_class_name' var (250) não` `is_drucle ' varchar (1) não nulo, `is_update_data` varchar (1) não nulo,` requests_recovery` varchar (1) não nulo, `job_data` blob) mecanismo = innodb default charset = utf8mb4; -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- varchar (40) não nulo) motor = innodb padrão padrão = utf8mb4; -- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Mecanismo = innodb padrão padrão = utf8mb4; - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- `Checkin_interval` bigint (13) não nulo) mecanismo = innodb padrão padrão = utf8mb4; -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- `Trigger_group` varchar (120) não nulo,` repent_count` bigint (7) não nulo, `repet_interval` bigint (12) não nulo,` times_triggered` bigint (10) não nulo) motor = innodb default charset = utf8mb4; -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- `qrtz_simprop_triggers` (` sched_name` varchar (120) não nulo, `trigger_name` varchar (120) não nulo,` trigger_group` varchar (120) não null, `str_prop_1` varchar (512) default null,` ` `Str_prop_3` varchar (512) nulo padrão,` int_prop_1` int (11) nulo padrão, `int_prop_2` int (11) null padrão,` long_prop_1` bigint (20) padrão, `long_prop_2` bigint (20) default null, null,` `long_prop_2` bigint (20) default null, null, null,` long_prop_rop (20) default null, null, null, `` long_prop_2 'bigint (20) default null, null, null, `` long_prop_2' bigint (20) default null, null, `` long_prop_2 'bigint (20) `Bool_prop_1` varchar (1) null padrão,` bool_prop_2` varchar (1) nulo padrão) mecanismo = innodb padrão padrão = utf8mb4; -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- `Trigger_group` varchar (120) não nulo,` job_name` varchar (120) não nulo, `job_group` varchar (120) não nulo,` description` varchar (250) `null null,` next_fire_time` bigint (13) default null, `pred_fire_time,` next_fire_time` (13) default null, `pred_fire_fire,` next_time` 'bigint (13) default null, `pred_fire_fire,` `next_fire_time`' 13) default null,` pred_fire_fire, Null, `trigger_state` varchar (16) não nulo,` trigger_type` varchar (8) não nulo, `start_time` bigint (13) não null,` end_time` bigint (13) `calendar_name` varchar (200) default null, misfire_ling` calendar_name` `200) Mecanismo = innodb padrão padrão = 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`); --- ÍNDICES PARA TABELA `qrtz_calendars`-alter tabela` qrtz_calendars` adicione chave primária (`sched_name`,` calendar_name`); --- índices para tabela `qrtz_cron_triggers`-alter tabela` qrtz_cron_triggers`-alter tabela `qrtz_cron_triggers` add primary Key (` sched_name`, `trigger_name`,` trigger_group`); --- ÍNDICES PARA TABELA `QRTZ_FIRED_TRIGERS`-ALTER TABLE` QRTZ_FIRED_TRIGERS` Adicione a chave primária (`agendamento_name`,` Entry_Id`), add `` idx_qrtz_ft_trig_inst_name` (`` short_name`, `` `` `` `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`), ADD KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), ADD KEY `IDX_QRTZ_FT_JG` (`Sched_name`,` JOB_GROUP`), adicione `` idx_qrtz_ft_t_g` (`sched_name`,` trigger_name`, `trigger_group`), adicione` `idx_qrtz_ft_tg` (` sched_name`, `trigir` `` `` iDX_Qrtz_tg`; --- ÍNDICES PARA TABLE `QRTZ_JOB_DETAILS`-ALTER TABLE` QRTZ_JOB_DETAILS` Adicione a chave primária (`sched_name`,` job_name`, `job_group`), key` `` ` `Idx_qrtz_j_grp` (` sched_name`, `job_group`); --- índices para a tabela `qrtz_locks`-alter tabela` qrtz_locks` adicione chave primária (`sched_name`,` lock_name`); --- ÍNDICES PARA TABELA `qrtz_paused_trigger_grps`-alter tabela` qrtz_paused_trigger_grps` adicione chave primária (`sched_name`,` trigger_group`); --- ÍNDICES PARA TABELA `qrtz_scheduler_state`-alter tabela` qrtz_scheduler_state` adicione chave primária (`sched_name`,` instanta_name`); --- ÍNDICES PARA TABELA `qrtz_simple_triggers`-alter tabela` qrtz_simple_triggers` adicione chave primária (`sched_name`,` trigger_name`, `trigger_group`); --- ÍNDICES PARA TABELA `qrtz_simple_triggers`-alter tabela` qrtz_simple_triggers` adicione chave primária (`sched_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` (` sched_name`, `job_group`), adicione key` idx_qrtz_t_c` (`sched_name`,` calendar_name` (191), add` `ida_qrtz_t_g` (` cronograma (191)), key `` `` `trigor `Idx_qrtz_t_state` (` sched_name`, `trigger_state`), adicione key` idx_qrtz_t_n_state` (`agendamento_name`_` trigger_name`, `trigher_group`,` trigger_stated`_name `idx`` idgrigroug ', `trigGer_nor_name', (`Sched_name`,` trigger_group`, `trigger_state`), adicione key` idx_qrtz_t_next_fire_time` (`sched_name`,` next_fire_time`), add `idx_qrtz_t_st_st_st_st (` cronograma '). Adicione `` `` `` ”' `Idx_qrtz_t_nft_st_misfire_grp` (` sched_name`, `misfire_instr`,` next_fire_time`, `trigger_group`,` trigger_state`); --- Tabelas exportadas de limite --- Tabelas limitadas `qrtz_blob_triggers`-alter tabela` qrtz_blob_triggers` adicione restrins `qrtz_blob_triggers_ibfk_1`` scheding_name ', `` trigger_name`, `trigger_group') `Trigger_name`,` trigger_group`); --- Tabela limite `qrtz_cron_triggers`-alteração tabela` qrtz_cron_triggers` adicione restrição `qrtz_cron_triggers_ibfk_1`` `schede_name ',` trigger_name', `trigger_group`) (` `` `` `` `` `Trigger_name`,` trigger_group`); --- Tabela de restrição `qrtz_simple_triggers`-alter tabela` qrtz_simple_triggers` adicionar restrição `qrtz_simple_triggers_ibfk_1`` cronograma_name ', `trigger_name`,` `trigger_group`) `Trigger_name`,` trigger_group`); --- Tabela limite `qrtz_simprop_triggers`-alteração tabela` qrtz_simprop_triggers` adicionar restrição `qrtz_simprop_triggers_ibfk_1`` scheding_name ', `trigger_name`,` `trigger_groups) `Trigger_name`,` trigger_group`) referências `qrtz_triggers` (` sched_name`, `trigger_name`,` trigger_group`); --- Tabela de restrição `qrtz_triggers`-alteração tabela` qrtz_triggers` adicionar restrição `qrtz_triggers_ibfk_1`` `schede_name ',` job_name', `job_group ')` `qrtz_job_details',` job_group), `Job_group`); <br> <br> <br> </em>
O princípio da implementação do cluster de quartzo usa o banco de dados para registrar o comportamento do trabalho e, através do mecanismo de bloqueio, o trabalho é executado apenas uma vez ao mesmo tempo.
Exemplo de JobBean
// ele precisa ser entregue para o Spring para gerenciar @service ("dialogjob") public classe dialogjob {@aUTowired PrivateService RefestherService; // O nome do método é definido no quartzo public void Execute () lança exceção {// Execução específica do negócio questionário.xxxxxx (); }}Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.