ความสามารถของคลัสเตอร์ควอตซ์:
ข้างต้นเป็นข้อมูลเชิงลึกส่วนบุคคล มาเริ่มข้อความหลักของบทความนี้กันเถอะ บทความนี้ส่วนใหญ่แนะนำเนื้อหาที่เกี่ยวข้องเกี่ยวกับการสร้างกลุ่มสปริงบู๊ต + คลัสเตอร์ควอตซ์ มันถูกแบ่งปันสำหรับการอ้างอิงและการเรียนรู้ของคุณ ฉันจะไม่พูดด้านล่างมากนัก มาดูการแนะนำรายละเอียดร่วมกันกันเถอะ
ขั้นตอนมีดังนี้:
การกำหนดค่า Spring Boot Bean:
@ConfigurationPublic คลาส QuartzConfig {@Value ("$ {quartz.scheduler.instancename}") สตริงส่วนตัว Quartzinstancename; @Value ("$ {org.quartz.datasource.myds.driver}") สตริงส่วนตัว mydsdriver; @Value ("$ {org.quartz.datasource.myds.url}") สตริงส่วนตัว mydsuser; @Value ("$ {org.quartz.datasource.myds.password}") สตริงส่วนตัว mydspassword; @Value ("$ {org.quartz.datasource.myds.maxconnections}") สตริงส่วนตัว mydsmaxconnections; / ** * ตั้งค่าคุณสมบัติ * @return * @throws ioexception */ คุณสมบัติส่วนตัว QuartzProperties () พ่น IOException {คุณสมบัติ prop = คุณสมบัติใหม่ (); 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", "เลือก * จาก {0} ล็อคโดยที่ lock_name =? สำหรับการอัปเดต"); 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.threadsinheritcontextclasslassloaderofinitializingThread", "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"); เสากลับ; } @Bean สาธารณะ SchedulerFactoryBean SchedulerFactoryBean (@qualifier ("DialogJobtrigger") Trigger Cronjobtrigger) พ่น IOException {SchedulerFactoryBean Factory = ใหม่ SchedulerFactoryBean (); // สิ่งนี้อนุญาตให้อัปเดตทริกเกอร์ใน DB เมื่ออัปเดตการตั้งค่าในไฟล์กำหนดค่า: // ใช้สำหรับคลัสเตอร์ควอตซ์ Quartzscheduler อัปเดตงานที่มีอยู่เมื่อเริ่มต้นดังนั้นจึงไม่จำเป็นต้องลบตาราง qrtz_job_details หลังจากแก้ไขเป้าหมาย บันทึกที่สอดคล้องกันของ Factory.SetOverWriteExistingJobs (จริง); // ใช้สำหรับคลัสเตอร์ควอตซ์, โหลดแหล่งข้อมูลควอตซ์ //factory.setDataSource(Datasource); // Quartzscheduler เริ่มต้นการเริ่มต้นหลังจาก 10 วินาทีของการเริ่มต้นแอปพลิเคชัน Quartzscheduler เริ่มต้นจากโรงงาน SetStartUpDelay (10); // ใช้สำหรับคลัสเตอร์ควอตซ์, โหลดโรงงานการกำหนดค่าแหล่งข้อมูล Quartz แหล่งข้อมูล SetquartzProperties (QuartzProperties ()); Factory.setAutostartup (จริง); Factory.SetApplicationContextsChedulerConTextKey ("ApplicationContext"); // ลงทะเบียน Trigger Factory.SetTriggers (Cronjobtrigger); <Br data-filtered = "Filtered"> // ใช้ไฟล์การกำหนดค่าโดยตรง // factory.setConfigLocation (FileSySystemResource ใหม่ โรงงานกลับมา; } / ** * กำลังโหลดงาน * @return * / @bean สาธารณะ JobDetailFactoryBean updateDialOgStatusJobDetail () {return createJobDetail (เรียกใช้ JobDetailDetailFactory.class, "UpdatedatedialOgStatUsGroup", "Dialogjob"); }/** * โหลดทริกเกอร์ * @param JobDetail * @return */@bean (name = "dialogjobtrigger") สาธารณะ crontriggerfactorybean dialogstatusjobtrigger (@qualifier ( } / ** * สร้างโรงงานงาน * @param Jobclass * @param GroupName * @param TargetObject * @return * / ส่วนตัวคงที่ JobDetailFactoryBean CreateJobDetail (คลาส <?> JobClass, String GroupName, String TargetObject) FactoryBean.SetJobclass (JobClass); FactoryBean.setDurability (จริง); FactoryBean.SetRequestSrecovery (จริง); FactoryBean.setGroup (GroupName); แผนที่ <สตริงสตริง> แผนที่ = ใหม่ hashmap <> (); map.put ("targetObject", targetObject); map.put ("targetMethod", "ดำเนินการ"); FactoryBean.SetJobDataasmap (MAP); กลับมาจากโรงงาน } / ** * สร้างโรงงานทริกเกอร์ * @param JobDetail * @param cronexpression * @return * / ส่วนตัวคงที่ crontriggerfactorybean dialogstatustrigger (JobDetail JobDetail, String Cronexpression) FactoryBean.SetJobDetail (JobDetail); FactoryBean.setCronexpression (cronexpression); กลับมาจากโรงงาน -ObjoingJobDetailDetailFactory Object:
คลาสสาธารณะที่เรียกใช้ JobDetailDetailFactory ขยาย Quartzjobbean {// คลาสที่งานที่กำหนดเวลาอยู่ในสตริงส่วนตัว targetObject; // งานที่กำหนดเวลาเฉพาะจะต้องดำเนินการสตริงส่วนตัว targetMethod; Private ApplicationContext CTX; @Override Void Protected ExecuteInternal (jobExecutionContEntext บริบท) พ่น jobExecutionException {ลอง {object oargetObject = ctx.getBean (TargetObject); วิธี m = null; ลอง {m = oargetObject.getClass (). getMethod (targetMethod); M.Invoke (OtargetObject); } catch (SecurityException E) {E.printStackTrace (); } catch (nosuchmethodexception e) {e.printstacktrace (); }} catch (exception e) {โยน jobExecutionException ใหม่ (e); }} โมฆะสาธารณะ setApplicationContext (ApplicationContext ApplicationContext) {this.ctx = ApplicationContext; } โมฆะสาธารณะ SettArgetObject (สตริง targetObject) {this.targetObject = targetObject; } โมฆะสาธารณะ SetTargetMethod (String TargetMethod) {this.targetMethod = TargetMethod; -หมายเหตุ: วิธีการตั้งค่าจะต้องไม่หายไป ApplicationContext ใน setApplicationContext เกี่ยวข้องกับค่าที่เติมในโรงงาน SetApplicationContextsChedulerContextKey ("ApplicationContext") หลักการถูกนำไปใช้โดย Beanwrapper ในคลาสแม่ผู้ปกครองที่ถูกเรียกใช้งาน
สคริปต์ SQL:-
<em id = "__ mcedel">- โครงสร้างตาราง `qrtz_blob_triggers`-- สร้างตารางถ้าไม่มีอยู่` qrtz_blob_triggers` (`sched_name` varchar (120) ไม่ใช่ null) null (120) Engine = InnoDB เริ่มต้น charset = UTF8MB4; - - - - - `TIME_ZONE_ID` VARCHAR (80) ค่าเริ่มต้น) เครื่องยนต์ = InnODB เริ่มต้น charset = UTF8MB4; - `trigger_name` varchar (120) ไม่ใช่ null,` trigger_group` varchar (120) null, `อินสแตนซ์ _name` varchar (120) ไม่ใช่ null,` fired_time` bigint (13) null, `sched_time` bigint (13) null varchar (120) ค่าเริ่มต้น null, `job_group` varchar (120) ค่าเริ่มต้น null,` is_nonconcurrent` varchar (1) ค่าเริ่มต้น null, `requests_recovery` varchar (1) เครื่องยนต์เริ่มต้น = innoDb เริ่มต้น charset = utf8mb4; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- (`sched_name` varchar (120) ไม่ใช่ null,` job_name` varchar (120) null, `job_group` varchar (120) ไม่ใช่ null,` คำอธิบาย 'varchar (250) null `varchar (null, varchar (250) ไม่ใช่ null, `is_update_data` varchar (1) ไม่ใช่ null,` requests_recovery` varchar (1) ไม่ใช่ null, `job_data` blob) เครื่องยนต์ = innoDB เริ่มต้น charset = utf8mb4; --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- VARCHAR (40) ไม่ใช่ NULL) เครื่องยนต์ = InnODB เริ่มต้น charset = UTF8MB4; - Engine = InnoDB เริ่มต้น charset = UTF8MB4; - - - `checkin_interval` bigint (13) ไม่ใช่ null) เครื่องยนต์ = innoDb เริ่มต้น charset = utf8mb4; - `trigger_group` varchar (120) ไม่ใช่ null,` repeet_count` bigint (7) ไม่ใช่ null, `repeet_interval` bigint (12) ไม่ใช่ null,` times_triggered` bigint (10) ไม่ใช่ null) เครื่องยนต์ = innoDb เริ่มต้น charset = utf8mb4; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- `qrtz_simprop_triggers` (` sched_name` varchar (120) null, `trigger_name` varchar (120) ไม่ใช่ null,` trigger_group` varchar (120) ไม่ใช่ null (str_prop_1` varchar (512) `str_prop_3` varchar (512) ค่าเริ่มต้น null,` int_prop_1` int (11) ค่าเริ่มต้น null, `int_prop_2` int (11) ค่าเริ่มต้น null,` long_prop_1` bigint (20) ค่าเริ่มต้น null (20) ค่าเริ่มต้น `bool_prop_1` varchar (1) ค่าเริ่มต้น null,` bool_prop_2` varchar (1) null เริ่มต้น) เครื่องยนต์ = innoDB เริ่มต้น charset = utf8mb4; - `trigger_group` varchar (120) ไม่ใช่ null,` job_name` varchar (120) null, `job_group` varchar (120) ไม่ใช่ null,` คำอธิบาย 'varchar (250) ค่าเริ่มต้น null (null -time (13) `trigger_state` varchar (16) ไม่ใช่ null,` trigger_type` varchar (8) null, `start_time` bigint (13) ไม่ใช่ null,` end_time` bigint (13) ค่าเริ่มต้น null (2) ค่าเริ่มต้น (2) charset = utf8mb4; --- ดัชนีสำหรับตารางที่ถูกทิ้ง---- ดัชนีสำหรับตาราง `qrtz_blob_triggers`-ตารางแทน` qrtz_blob_triggers` เพิ่มคีย์หลัก (`sched_name`, trigger_name`, trigger_group`) เพิ่ม key` schede_name ' --- ดัชนีสำหรับตาราง `qrtz_calendars`-ตารางแทน` qrtz_calendars` เพิ่มคีย์หลัก (`sched_name`,` calendar_name`); --- ดัชนีสำหรับตาราง `qrtz_cron_triggers`-แทนตาราง` qrtz_cron_triggers`-ตารางแทน `qrtz_cron_triggers` เพิ่มคีย์หลัก (` sched_name`, `trigger_name`,` trigger_group '); --- ดัชนีสำหรับตาราง `qRTZ_FIRED_TRIGGERS`-TABLE TABLE` qRTZ_FIRED_TRIGGERS` เพิ่มคีย์หลัก (`sched_name`,` entry_id`) เพิ่มคีย์ `idx_qrtz_ft_trig_inst_name` (` sched_name ' `idx_qrtz_ft_inst_job_req_rcvry` (` sched_name`, `อินสแตนซ์ _name`,` requests_recovery`), เพิ่มคีย์ `idx_qrtz_ft_j_g` (`sched_name`,` job_group`), เพิ่มคีย์ `idx_qrtz_ft_t_g` (` sched_name`, `trigger_name`,` trigger_group`) เพิ่มคีย์ `idx_qrtz_ft_tg` (` `sched_name ' --- ดัชนีสำหรับตาราง `qrtz_job_details`-แทนตาราง` qrtz_job_details` เพิ่มคีย์หลัก (`sched_name`,` job_name`, `job_group`) เพิ่มคีย์` idx_qrtz_j_recovery ' `idx_qrtz_j_grp` (` sched_name`, `job_group`); --- ดัชนีสำหรับตาราง `qrtz_locks`-ตารางแทน` qrtz_locks` เพิ่มคีย์หลัก (`sched_name`,` lock_name`); --- ดัชนีสำหรับตาราง `qrtz_paused_trigger_grps`-ตารางแทน` qrtz_paused_trigger_grps` เพิ่มคีย์หลัก (`sched_name`,` trigger_group`); --- ดัชนีสำหรับตาราง `qrtz_scheduler_state`-ตารางแทน` qrtz_scheduler_state` เพิ่มคีย์หลัก (`sched_name`,` instance_name`); --- ดัชนีสำหรับตาราง `qrtz_simple_triggers`-ตารางแทน` qrtz_simple_triggers` เพิ่มคีย์หลัก (`sched_name`,` trigger_name`, `trigger_group`); --- ดัชนีสำหรับตาราง `qrtz_simple_triggers`-ตารางแทน` qrtz_simple_triggers` เพิ่มคีย์หลัก (`sched_name`,` trigger_name`, `trigger_group`); --- ดัชนีสำหรับตาราง `qrtz_triggers`-แทนตาราง` qrtz_triggers` เพิ่มคีย์หลัก (`sched_name`,` trigger_name`, `trigger_group`) เพิ่มคีย์` idx_qrtz_t_j` (sched_name ' `idx_qrtz_t_jg` (` sched_name`, `job_group`), เพิ่มคีย์` idx_qrtz_t_c` (`sched_name`, calendar_name` (191)) เพิ่มคีย์ `idx_qrtz_t_state` (` sched_name`, `trigger_state`) เพิ่มคีย์` idx_qrtz_t_n_state` (`sched_name`,` trigger_name`, `trigger_group`,` trigger ' (`sched_name`,` trigger_group`, `trigger_state`), เพิ่มคีย์` idx_qrtz_t_next_fire_time ' เพิ่มคีย์ `idx_qrtz_t_nft_misfire` (` sched_name`, `misfire_instr`,` next_fire_time`), เพิ่มคีย์ `idx_qrtz_t_nft_st_misfire` (sched_name` `idx_qrtz_t_nft_st_misfire_grp` (` sched_name`, `misfire_instr`,` next_fire_time ', `trigger_group`,` trigger_state`); --- จำกัด ตารางที่ส่งออก --- จำกัด ตาราง `qRTZ_BLOB_TRIGGERS`-ตัวแปรตาราง` qRTZ_BLOB_TRIGGERS` เพิ่มข้อ จำกัด `qRTZ_BLOB_TRIGGERS_IBFK_1` คีย์ต่างประเทศ (` sched_name`, trigger_name ' `trigger_name`,` trigger_group`); --- ตารางขีด จำกัด `qrtz_cron_triggers`-ตารางแทน` qrtz_cron_triggers` เพิ่มข้อ จำกัด `qrtz_cron_triggers_ibfk_1` คีย์ต่างประเทศ (` sched_name`, `trigger_name`,` trigger_group `trigger_name`,` trigger_group`); --- ตารางการ จำกัด `qrtz_simple_triggers`-ตัวแทน` qrtz_simple_triggers` เพิ่มข้อ จำกัด `qrtz_simple_triggers_ibfk_1` คีย์ต่างประเทศ (` sched_name`, trigger_name` `trigger_name`,` trigger_group`); --- ตารางขีด จำกัด `qrtz_simprop_triggers`-ตารางแทน` qrtz_simprop_triggers` เพิ่มข้อ จำกัด `qrtz_simprop_triggers_ibfk_1` คีย์ต่างประเทศ (` sched_name`, trigger_name` `trigger_name`,` trigger_group`) การอ้างอิง `qrtz_triggers` (` sched_name`, `trigger_name`,` trigger_group`); --- ตารางข้อ จำกัด `qrtz_triggers`-ตัวแทนตาราง` qrtz_triggers` เพิ่มข้อ จำกัด `qrtz_triggers_ibfk_1` คีย์ต่างประเทศ (` sched_name`, `job_name`,` job_group`) การอ้างอิง `qrtz_job_details` `job_group`); <br> <br> <br> </em>
หลักการการใช้งานของคลัสเตอร์ควอตซ์ใช้ฐานข้อมูลเพื่อบันทึกพฤติกรรมงานและผ่านกลไกการล็อคงานจะทำงานเพียงครั้งเดียวในเวลาเดียวกัน
ตัวอย่าง Jobbean
// มันจะต้องส่งมอบให้กับฤดูใบไม้ผลิเพื่อจัดการ @Service ("DialogJob") Dialogjob คลาสสาธารณะ {@autowired Private Questurederservice คำถามบริการ; // ชื่อวิธีการกำหนดในช่องว่างสาธารณะควอตซ์ () โยนข้อยกเว้น {// การดำเนินการเฉพาะทางธุรกิจ -สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com