国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

分布式之任務(wù)調(diào)度學(xué)習(xí)二

這篇具有很好參考價值的文章主要介紹了分布式之任務(wù)調(diào)度學(xué)習(xí)二。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

4 Quartz 集成到 Spring

Spring-quartz 工程
Spring 在 spring-context-support.jar 中直接提供了對 Quartz 的支持
分布式之任務(wù)調(diào)度學(xué)習(xí)二,分布式,學(xué)習(xí),分布式,學(xué)習(xí)
可以在配置文件中把 JobDetail、Trigger、Scheduler 定義成 Bean。

4.1 定義 Job

<bean name="myJob1" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
	<property name="name" value="my_job_1"/>
	<property name="group" value="my_group"/>
	<property name="jobClass" value="com.gupaoedu.quartz.MyJob1"/>
	<property name="durability" value="true"/>
</bean>

4.2 定義 Trigger

<bean name="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
	<property name="name" value="my_trigger_1"/>
	<property name="group" value="my_group"/>
	<property name="jobDetail" ref="myJob1"/>
	<property name="startDelay" value="1000"/>
	<property name="repeatInterval" value="5000"/>
	<property name="repeatCount" value="2"/>
</bean>

4.3 定義 Scheduler

<bean name="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	<property name="triggers">
		<list>
			<ref bean="simpleTrigger"/>
			<ref bean="cronTrigger"/>
		</list>
	</property>
</bean>

既然可以在配置文件配置,當然也可以用@Bean 注解配置。在配置類上加上@Configuration 讓 Spring 讀取到。

public class QuartzConfig {
	@Bean
	public JobDetail printTimeJobDetail(){
		return JobBuilder.newJob(MyJob1.class)
		.withIdentity("gupaoJob")
		.usingJobData("gupao", "職位更好的你")
		.storeDurably()
		.build();
	}
	@Bean
	public Trigger printTimeJobTrigger() {
		CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
		return TriggerBuilder.newTrigger()
		.forJob(printTimeJobDetail())
		.withIdentity("quartzTaskService")
		.withSchedule(cronScheduleBuilder)
		.build();
	}
}

5 動態(tài)調(diào)度的實現(xiàn)

springboot-quartz 工程
傳統(tǒng)的 Spring 方式集成,由于任務(wù)信息全部配置在 xml 文件中,如果需要操作任務(wù)或者修改任務(wù)運行頻率,只能重新編譯、打包、部署、重啟,如果有緊急問題需要處理,會浪費很多的時間。
有沒有可以動態(tài)調(diào)度任務(wù)的方法?比如停止一個 Job?啟動一個 Job?修改 Job 的觸發(fā)頻率?
讀取配置文件、寫入配置文件、重啟 Scheduler 或重啟應(yīng)用明顯是不可取的。
對于這種頻繁變更并且需要實時生效的配置信息,我們可以放到哪里?
ZK、Redis、DB tables。
并且,我們可以提供一個界面,實現(xiàn)對數(shù)據(jù)表的輕松操作。

5.1 配置管理

這里我們用最簡單的數(shù)據(jù)庫的實現(xiàn)。
問題 1:建一張什么樣的表?參考 JobDetail 的屬性

CREATE TABLE `sys_job`(
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `job_name` varchar(512) NOT NULL COMMENT '任務(wù)名稱', `job_group` varchar(512) NOT NULL COMMENT '任務(wù)組名', `job_cron` varchar(512) NOT NULL COMMENT '時間表達式', `job_class_path` varchar(1024) NOT NULL COMMENT '類路徑,全類型', `job_data_map` varchar(1024) DEFAULT NULL COMMENT '傳遞 map 參數(shù)', `job_status` int(2) NOT NULL COMMENT '狀態(tài):1 啟用 0 停用', `job_describe` varchar(1024) DEFAULT NULL COMMENT '任務(wù)功能描述', PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;

5.2 數(shù)據(jù)操作與任務(wù)調(diào)度

操作數(shù)據(jù)表非常簡單,SSM 增刪改查。
但是在修改了表的數(shù)據(jù)之后,怎么讓調(diào)度器知道呢?
調(diào)度器的接口:Scheduler
在我們的需求中,我們需要做的事情:
1、 新增一個任務(wù)
2、 刪除一個任務(wù)
3、 啟動、停止一個任務(wù)
4、 修改任務(wù)的信息(包括調(diào)度規(guī)律)

5.3 容器啟動與 Service 注入

5.3.1 容器啟動

因為任務(wù)沒有定義在 ApplicationContext.xml 中,而是放到了數(shù)據(jù)庫中,Spring Boot 啟動時,怎么讀取任務(wù)信息?
或者,怎么在 Spring 啟動完成的時候做一些事情?
創(chuàng)建一個類,實現(xiàn) CommandLineRunner 接口,實現(xiàn) run 方法。
從表中查出狀態(tài)是 1 的任務(wù),然后構(gòu)建。

5.3.2 Service 類注入到 Job 中

Spring Bean 如何注入到實現(xiàn)了 Job 接口的類中?
例如在 TestTask3 中,需要注入 ISysJobService,查詢數(shù)據(jù)庫發(fā)送郵件。
如果沒有任何配置,注入會報空指針異常。
原因:
因為定時任務(wù) Job 對象的實例化過程是在 Quartz 中進行的,而 Service Bean 是由Spring 容器管理的,Quartz 察覺不到 Service Bean 的存在,所以無法將 Service Bean裝配到 Job 對象中。
分析:
Quartz 集成到 Spring 中,用到 SchedulerFactoryBean,其實現(xiàn)了 InitializingBean方法,在唯一的方法 afterPropertiesSet()在 Bean 的屬性初始化后調(diào)用。調(diào)度器用 AdaptableJobFactory 對 Job 對象進行實例化。所以,如果我們可以把這個 JobFactory 指定為我們自定義的工廠的話,就可以在 Job 實例化完成之后,把 Job納入到 Spring 容器中管理。
解決這個問題的步驟:
1、定義一個 AdaptableJobFactory,實現(xiàn) JobFactory 接口,實現(xiàn)接口定義的newJob 方法,在這里面返回 Job 實例
分布式之任務(wù)調(diào)度學(xué)習(xí)二,分布式,學(xué)習(xí),分布式,學(xué)習(xí)
2、定義一個 MyJobFactory,繼承 AdaptableJobFactory。
使用 Spring 的 AutowireCapableBeanFactory,把 Job 實例注入到容器中。

@Component
public class MyJobFactory extends AdaptableJobFactory {
@Autowired
	private AutowireCapableBeanFactory capableBeanFactory;
		protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
		Object jobInstance = super.createJobInstance(bundle);
		capableBeanFactory.autowireBean(jobInstance);
		return jobInstance;
	}
}

3、指定 Scheduler 的 JobFactory 為自定義的 JobFactory。

scheduler.setJobFactory(myJobFactory);

6 Quartz 集群部署

springboot-quartz 工程

6.1 為什么需要集群?

1、防止單點故障,減少對業(yè)務(wù)的影響
2、減少節(jié)點的壓力,例如在 10 點要觸發(fā) 1000 個任務(wù),如果有 10 個節(jié)點,則每個節(jié)點之需要執(zhí)行 100 個任務(wù)

6.2 集群需要解決的問題?

1、任務(wù)重跑,因為節(jié)點部署的內(nèi)容是一樣的,到 10 點的時候,每個節(jié)點都會執(zhí)行相同的操作,引起數(shù)據(jù)混亂。比如跑批,絕對不能執(zhí)行多次。
2、任務(wù)漏跑,假如任務(wù)是平均分配的,本來應(yīng)該在某個節(jié)點上執(zhí)行的任務(wù),因為節(jié)點故障,一直沒有得到執(zhí)行。
3、水平集群需要注意時間同步問題
4、Quartz 使用的是隨機的負載均衡算法,不能指定節(jié)點執(zhí)行
所以必須要有一種共享數(shù)據(jù)或者通信的機制。在分布式系統(tǒng)的不同節(jié)點中,我們可以采用什么樣的方式,實現(xiàn)數(shù)據(jù)共享?
兩兩通信,或者基于分布式的服務(wù),實現(xiàn)數(shù)據(jù)共享。
例如:ZK、Redis、DB。
在 Quartz 中,提供了一種簡單的方式,基于數(shù)據(jù)庫共享任務(wù)執(zhí)行信息。也就是說,一個節(jié)點執(zhí)行任務(wù)的時候,會操作數(shù)據(jù)庫,其他的節(jié)點查詢數(shù)據(jù)庫,便可以感知到了。
同樣的問題:建什么表?哪些字段?依舊使用系統(tǒng)自帶的 11 張表

6.3 集群配置與驗證

quartz.properties 配置。
四個配置:集群實例 ID、集群開關(guān)、數(shù)據(jù)庫持久化、數(shù)據(jù)源信息
注意先清空 quartz 所有表、改端口、兩個任務(wù)頻率改成一樣
驗證 1:先后啟動 2 個節(jié)點,任務(wù)是否重跑
驗證 2:停掉一個節(jié)點,任務(wù)是否漏

7 Quartz 調(diào)度原理

問題:
1、Job 沒有繼承 Thread 和實現(xiàn) Runnable,是怎么被調(diào)用的?通過反射還是什么?
2、任務(wù)是什么時候被調(diào)度的?是誰在監(jiān)視任務(wù)還是監(jiān)視 Trigger?
3、任務(wù)是怎么被調(diào)用的?誰執(zhí)行了任務(wù)?
4、任務(wù)本身有狀態(tài)嗎?還是觸發(fā)器有狀態(tài)?
看源碼的入口

Scheduler scheduler = factory.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();

7.1 獲取調(diào)度器實例

7.1.1 讀取配置文件
public Scheduler getScheduler() throws SchedulerException {
	if (cfg == null) {
		// 讀取 quartz.properties 配置文件
		initialize();
	}
	// 這個類是一個 HashMap,用來基于調(diào)度器的名稱保證調(diào)度器的唯一性
	SchedulerRepository schedRep = SchedulerRepository.getInstance();
	Scheduler sched = schedRep.lookup(getSchedulerName());
	// 如果調(diào)度器已經(jīng)存在了
	if (sched != null) {
		// 調(diào)度器關(guān)閉了,移除
		if (sched.isShutdown()) {
			schedRep.remove(getSchedulerName());
		} else {
			// 返回調(diào)度器
			return sched;
		}
	}
	// 調(diào)度器不存在,初始化
	sched = instantiate();
	return sched;
}

instantiate()方法中做了初始化的所有工作:文章來源地址http://www.zghlxwxcb.cn/news/detail-774879.html

// 存儲任務(wù)信息的 JobStore
JobStore js = null;
// 創(chuàng)建線程池,默認是 SimpleThreadPool
ThreadPool tp = null;
// 創(chuàng)建調(diào)度器
QuartzScheduler qs = null;
// 連接數(shù)據(jù)庫的連接管理器
DBConnectionManager dbMgr = null;
// 自動生成 ID
// 創(chuàng)建線程執(zhí)行器,默認為 DefaultThreadExecutor
ThreadExecutor threadExecutor;

到了這里,關(guān)于分布式之任務(wù)調(diào)度學(xué)習(xí)二的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 分布式定時任務(wù)調(diào)度框架Quartz

    分布式定時任務(wù)調(diào)度框架Quartz

    Quartz是一個定時任務(wù)調(diào)度框架,比如你遇到這樣的問題: 比如淘寶的待支付功能,后臺會在你生成訂單后24小時后,查看訂單是否支付,未支付則取消訂單 比如vip的每月自動續(xù)費功能 … 想定時在某個時間,去做某件事 Quartz是一套輕量級的任務(wù)調(diào)度框架,只需要定義了 Job(

    2024年02月04日
    瀏覽(36)
  • 【分布式任務(wù)調(diào)度】XXL-JOB的任務(wù)調(diào)度實現(xiàn)原理(四)

    【分布式任務(wù)調(diào)度】XXL-JOB的任務(wù)調(diào)度實現(xiàn)原理(四)

    XXL-JOB專題歷史文章列表: XXL-JOB調(diào)度中心集群部署配置(一) XXL-JOB執(zhí)行器配置及定時任務(wù)的創(chuàng)建(二) XXL-JOB調(diào)度中心對執(zhí)行器的上下線感知實現(xiàn)原理(三) 本篇的主要內(nèi)容是XXL-JOB的任務(wù)調(diào)度流程及其實現(xiàn)原理,包含了兩個部分: 調(diào)度中心如何進行任務(wù)調(diào)度 執(zhí)行器執(zhí)行任

    2024年02月16日
    瀏覽(26)
  • 系統(tǒng)設(shè)計面試指南之分布式任務(wù)調(diào)度

    系統(tǒng)設(shè)計面試指南之分布式任務(wù)調(diào)度

    任務(wù)是需要資源(CPU 時間、內(nèi)存、存儲、網(wǎng)絡(luò)帶寬等)在指定時間內(nèi)完成的一段計算工作。 通過智能地將資源分配給任務(wù)以滿足任務(wù)級和系統(tǒng)級目標的系統(tǒng)稱為任務(wù)調(diào)度程序。 任務(wù)調(diào)度程序: 及時決定和分配資源給任務(wù)的過程稱為任務(wù)調(diào)度。 當我們在 Facebook 發(fā)表評論時。我

    2024年02月05日
    瀏覽(21)
  • OpenHarmony4.0分布式任務(wù)調(diào)度淺析

    OpenHarmony4.0分布式任務(wù)調(diào)度淺析

    OpenHarmony 分布式任務(wù)調(diào)度是一種基于分布式軟總線、分布式數(shù)據(jù)管理、分布式 Profile 等技術(shù)特性的任務(wù)調(diào)度方式。它通過構(gòu)建一種統(tǒng)一的分布式服務(wù)管理機制,包括服務(wù)發(fā)現(xiàn)、同步、注冊和調(diào)用等環(huán)節(jié),實現(xiàn)了對跨設(shè)備的應(yīng)用進行遠程啟動、遠程調(diào)用、綁定/解綁,以及遷移等

    2024年04月28日
    瀏覽(19)
  • xxl-Job分布式任務(wù)調(diào)度

    xxl-Job分布式任務(wù)調(diào)度

    我們可以先思考一下業(yè)務(wù)場景的解決方案: 某電商系統(tǒng)需要在每天上午10點,下午3點,晚上8點發(fā)放一批優(yōu)惠券。 某銀行系統(tǒng)需要在信用卡到期還款日的前三天進行短信提醒。 某財務(wù)系統(tǒng)需要在每天凌晨0:10結(jié)算前一天的財務(wù)數(shù)據(jù),統(tǒng)計匯總。 12306會根據(jù)車次的不同,設(shè)置某

    2024年02月15日
    瀏覽(27)
  • 分布式定時任務(wù)調(diào)度xxl-job

    分布式定時任務(wù)調(diào)度xxl-job

    Quartz中最重要的三個對象:Job(作業(yè))、Trigger(觸發(fā)器)、Scheduler(調(diào)度器)。 xxl-job的調(diào)度原理:調(diào)度線程在一個while循環(huán)中不斷地獲取一定數(shù)量的即將觸發(fā)的Trigger,拿到綁定的Job,包裝成工作線程執(zhí)行。 當然,不管在任何調(diào)度系統(tǒng)中,底層都是線程模型。如果要自己寫一個

    2024年03月10日
    瀏覽(20)
  • 太強了!全新一代分布式任務(wù)調(diào)度與計算框架!

    大家好,我是 Java陳序員 。 我們在工作開發(fā)中,離不開任務(wù)調(diào)度。通過指定的間隔時間執(zhí)行各類操作,來完成無需用戶操作的任務(wù)。 目前市場上,有一些編程語言本身自帶的定時任務(wù)工具,如 Java 中 Timer。也有一些比較成熟的定時任務(wù)框架,如 Quartz?,F(xiàn)在大部分系統(tǒng)都是使

    2024年02月03日
    瀏覽(29)
  • xxl-Job分布式任務(wù)調(diào)度 入門

    xxl-Job分布式任務(wù)調(diào)度 入門

    我們可以先思考一下業(yè)務(wù)場景的解決方案: 某電商系統(tǒng)需要在每天上午10點,下午3點,晚上8點發(fā)放一批優(yōu)惠券。 某銀行系統(tǒng)需要在信用卡到期還款日的前三天進行短信提醒。 某財務(wù)系統(tǒng)需要在每天凌晨0:10結(jié)算前一天的財務(wù)數(shù)據(jù),統(tǒng)計匯總。 12306會根據(jù)車次的不同,設(shè)置某

    2024年02月03日
    瀏覽(20)
  • 分布式任務(wù)調(diào)度框架Power-Job

    分布式任務(wù)調(diào)度框架Power-Job

    在大型業(yè)務(wù)業(yè)務(wù)系統(tǒng)中,不可避免會出現(xiàn)一些需要定時執(zhí)行需求的場景,例如定時同步數(shù)據(jù),定時清洗數(shù)據(jù),定時生成報表,大量機器一同執(zhí)行某個任務(wù),甚至有些需要分布式處理的任務(wù)例如需要更新一大批數(shù)據(jù),單機耗時太長需要進行任務(wù)分發(fā),利用集群的計算能力等等

    2024年02月04日
    瀏覽(51)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包