国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
spring+quartz集群
     轉(zhuǎn)載自 http://www.iteye.com/topic/486055 和 http://julylin.iteye.com/blog/849100

概述

雖然單個(gè)Quartz實(shí)例能給予你很好的Job調(diào)度能力,但它不能滿(mǎn)足典型的企業(yè)需求,如可伸縮性、高可靠性滿(mǎn)足。假如你需要故障轉(zhuǎn)移的能力并能運(yùn)行日益增多的 Job,Quartz集群勢(shì)必成為你應(yīng)用的一部分了。使用 Quartz 的集群能力可以更好的支持你的業(yè)務(wù)需求,并且即使是其中一臺(tái)機(jī)器在最糟的時(shí)間崩潰了也能確保所有的 Job 得到執(zhí)行。

Quartz 中集群如何工作

一個(gè) Quartz 集群中的每個(gè)節(jié)點(diǎn)是一個(gè)獨(dú)立的 Quartz 應(yīng)用,它又管理著其他的節(jié)點(diǎn)。意思是你必須對(duì)每個(gè)節(jié)點(diǎn)分別啟動(dòng)或停止。不像許多應(yīng)用服務(wù)器的集群,獨(dú)立的 Quartz 節(jié)點(diǎn)并不與另一其的節(jié)點(diǎn)或是管理節(jié)點(diǎn)通信。Quartz 應(yīng)用是通過(guò)數(shù)據(jù)庫(kù)表來(lái)感知到另一應(yīng)用的。

圖:表示了每個(gè)節(jié)點(diǎn)直接與數(shù)據(jù)庫(kù)通信,若離開(kāi)數(shù)據(jù)庫(kù)將對(duì)其他節(jié)點(diǎn)一無(wú)所知

創(chuàng)建Quartz數(shù)據(jù)庫(kù)表

因?yàn)镼uartz 集群依賴(lài)于數(shù)據(jù)庫(kù),所以必須首先創(chuàng)建Quartz數(shù)據(jù)庫(kù)表。Quartz 包括了所有被支持的數(shù)據(jù)庫(kù)平臺(tái)的 SQL 腳本。在 <quartz_home>/docs/dbTables 目錄下找到那些 SQL 腳本,這里的 <quartz_home> 是解壓 Quartz 分發(fā)包后的目錄。
這里采用的Quartz 2.0.2版本,總共11張表,不同版本,表個(gè)數(shù)可能不同。數(shù)據(jù)庫(kù)為mysql,用tables_mysql.sql創(chuàng)建數(shù)據(jù)庫(kù)表。

介紹下主要的幾張表:
       表qrtz_job_details: 保存job詳細(xì)信息,該表需要用戶(hù)根據(jù)實(shí)際情況初始化
       job_name:集群中job的名字,該名字用戶(hù)自己可以隨意定制,無(wú)強(qiáng)行要求
       job_group:集群中job的所屬組的名字,該名字用戶(hù)自己隨意定制,無(wú)強(qiáng)行要求
       job_class_name:集群中個(gè)note job實(shí)現(xiàn)類(lèi)的完全包名,quartz就是根據(jù)這個(gè)路徑到classpath找到該job類(lèi)
       is_durable:是否持久化,把該屬性設(shè)置為1,quartz會(huì)把job持久化到數(shù)據(jù)庫(kù)中
       job_data:一個(gè)blob字段,存放持久化job對(duì)象

       表qrtz_triggers: 保存trigger信息
       trigger_name: trigger的名字,該名字用戶(hù)自己可以隨意定制,無(wú)強(qiáng)行要求
       trigger_group:trigger所屬組的名字,該名字用戶(hù)自己隨意定制,無(wú)強(qiáng)行要求
       job_name: qrtz_job_details表job_name的外鍵
       job_group: qrtz_job_details表job_group的外鍵
       trigger_state:當(dāng)前trigger狀態(tài),設(shè)置為ACQUIRED,如果設(shè)置為WAITING,則job不會(huì)觸發(fā)
       trigger_cron:觸發(fā)器類(lèi)型,使用cron表達(dá)式

       表qrtz_cron_triggers:存儲(chǔ)cron表達(dá)式表
       trigger_name: qrtz_triggers表trigger_name的外鍵
       trigger_group: qrtz_triggers表trigger_group的外鍵
       cron_expression:cron表達(dá)式
      
       表qrtz_scheduler_state:存儲(chǔ)集群中note實(shí)例信息,quartz會(huì)定時(shí)讀取該表的信息判斷集群中每個(gè)實(shí)例的當(dāng)前狀態(tài)
       instance_name:之前配置文件中org.quartz.scheduler.instanceId配置的名字,就會(huì)寫(xiě)入該字段,如果設(shè)置為AUTO,quartz會(huì)根據(jù)物理機(jī)名和當(dāng)前時(shí)間產(chǎn)生一個(gè)名字
       last_checkin_time:上次檢查時(shí)間
       checkin_interval:檢查間隔時(shí)間

配置數(shù)據(jù)庫(kù)連接池
1.配置jdbc.properties文件
#mysql database setting
quartz.jdbc.driver=com.mysql.jdbc.Driver
quartz.jdbc.url=jdbc:mysql://10.10.46.145:3306/test?useUnicode=true&characterEncoding=utf-8
quartz.jdbc.username=root
quartz.jdbc.password=root

2.配置applicationContext.xml文件
Xml代碼  
  1. <bean id="quartzDataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">  
  2.     <property name="driverClass" value="${quartz.jdbc.driver}" />  
  3.     <property name="url" value="${quartz.jdbc.url}" />  
  4.     <property name="username" value="${quartz.jdbc.username}" />  
  5.     <property name="password" value="${quartz.jdbc.password}" />  
  6. </bean>  


3.applicationContext-quartz-timer-cluster.xml
Xml代碼  
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns:util="http://www.springframework.org/schema/util"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
  5.                         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"  
  6.     default-lazy-init="true">  
  7.   
  8.     <description>Quartz的定時(shí)集群任務(wù)配置</description>  
  9.   
  10.     <!-- Quartz集群Schduler -->  
  11.     <bean id="clusterQuartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  12.         <!-- Triggers集成 -->  
  13.         <property name="triggers">  
  14.             <list>  
  15.                 <ref bean="timerTrigger" />  
  16.             </list>  
  17.         </property>  
  18.         <!--  quartz配置文件路徑-->  
  19.         <property name="configLocation" value="classpath:schedule/quartz-cluster.properties" />  
  20.         <!-- 啟動(dòng)時(shí)延期3秒開(kāi)始任務(wù) -->  
  21.         <property name="startupDelay" value="3" />  
  22.         <!-- 保存Job數(shù)據(jù)到數(shù)據(jù)庫(kù)所需的數(shù)據(jù)源 -->  
  23.         <property name="dataSource" ref="quartzDataSource" />  
  24.         <!-- Job接受applicationContext的成員變量名 -->  
  25.         <property name="applicationContextSchedulerContextKey" value="applicationContext" />  
  26.     </bean>  
  27.   
  28.     <!-- Timer式 Trigger定義-->  
  29.     <bean id="timerTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">  
  30.         <property name="jobDetail" ref="timerJobDetail" />  
  31.         <property name="repeatInterval" value="120000" />  
  32.     </bean>  
  33.   
  34.     <!--   
  35.     <bean id="timerTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
  36.         <property name="jobDetail" ref="timerJobDetail" />  
  37.         <property name="cronExpression" value="0 0/2 * * * ?" />  
  38.     </bean> -->  
  39.   
  40.     <!-- Timer JobDetail, 基于JobDetailBean實(shí)例化Job Class,可持久化到數(shù)據(jù)庫(kù)實(shí)現(xiàn)集群 -->  
  41.     <bean id="timerJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">  
  42.         <property name="jobClass" value="com.test.schedule.QuartzClusterableJob" />  
  43.     </bean>  
  44.   
  45.     <!-- Timer Job的可配置屬性,在job中通過(guò)applicationContext動(dòng)態(tài)獲取 -->  
  46.     <util:map id="timerJobConfig">  
  47.         <entry key="nodeName" value="default" />  
  48.     </util:map>  
  49. </beans>  

dataSource:項(xiàng)目中用到的數(shù)據(jù)源,里面包含了quartz用到的11張數(shù)據(jù)庫(kù)表;
applicationContextSchedulerContextKey: 是org.springframework.scheduling.quartz.SchedulerFactoryBean這個(gè)類(lèi)中把spring上下 文以key/value的方式存放在了quartz的上下文中了,可以用applicationContextSchedulerContextKey所 定義的key得到對(duì)應(yīng)的spring上下文;
configLocation:用于指明quartz的配置文件的位置

4.quartz-cluster.properties
#============================================================================
# Configure Main Scheduler Properties 
#============================================================================
org.quartz.scheduler.instanceName = ClusteredScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.skipUpdateCheck = true

#============================================================================
# Configure ThreadPool 
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 5

#============================================================================
# Configure JobStore 
#============================================================================
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.tablePrefix = QRTZ_

org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 15000

org.quartz.scheduler.instanceName屬性可為任何值,用在 JDBC JobStore 中來(lái)唯一標(biāo)識(shí)實(shí)例,但是所有集群節(jié)點(diǎn)中必須相同。

org.quartz.scheduler.instanceId 屬性為 AUTO即可,基于主機(jī)名和時(shí)間戳來(lái)產(chǎn)生實(shí)例 ID。

org.quartz.jobStore.class屬性為 JobStoreTX,將任務(wù)持久化到數(shù)據(jù)中。因?yàn)榧褐泄?jié)點(diǎn)依賴(lài)于數(shù)據(jù)庫(kù)來(lái)傳播 Scheduler 實(shí)例的狀態(tài),你只能在使用 JDBC JobStore 時(shí)應(yīng)用 Quartz 集群。這意味著你必須使用 JobStoreTX 或是 JobStoreCMT 作為 Job 存儲(chǔ);你不能在集群中使用 RAMJobStore。

org.quartz.jobStore.isClustered 屬性為 true,你就告訴了 Scheduler 實(shí)例要它參與到一個(gè)集群當(dāng)中。這一屬性會(huì)貫穿于調(diào)度框架的始終,用于修改集群環(huán)境中操作的默認(rèn)行為。

org.quartz.jobStore.clusterCheckinInterval 屬性定義了Scheduler 實(shí)例檢入到數(shù)據(jù)庫(kù)中的頻率(單位:毫秒)。Scheduler 檢查是否其他的實(shí)例到了它們應(yīng)當(dāng)檢入的時(shí)候未檢入;這能指出一個(gè)失敗的 Scheduler 實(shí)例,且當(dāng)前 Scheduler 會(huì)以此來(lái)接管任何執(zhí)行失敗并可恢復(fù)的 Job。通過(guò)檢入操作,Scheduler 也會(huì)更新自身的狀態(tài)記錄。clusterChedkinInterval 越小,Scheduler 節(jié)點(diǎn)檢查失敗的 Scheduler 實(shí)例就越頻繁。默認(rèn)值是 15000 (即15 秒)。
5.QuartzClusterableJob.java
Java代碼  
  1. /** 
  2.  * 被Spring的Quartz JobDetailBean定時(shí)執(zhí)行的Job類(lèi), 支持持久化到數(shù)據(jù)庫(kù)實(shí)現(xiàn)Quartz集群. 
  3.  *  
  4.  * 因?yàn)樾枰怀志没?只能在每次調(diào)度時(shí)從QuartzJobBean注入的applicationContext中動(dòng)態(tài)    取出. 
  5.  */  
  6. public class QuartzClusterableJob extends QuartzJobBean {  
  7.   
  8.     private ApplicationContext applicationContext;  
  9.   
  10.     /** 
  11.      * 從SchedulerFactoryBean注入的applicationContext. 
  12.      */  
  13.     public void setApplicationContext(ApplicationContext applicationContext) {  
  14.         this.applicationContext = applicationContext;  
  15.     }  
  16.   
  17.     @Override  
  18.     protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {  
  19.         Map config = (Map) applicationContext.getBean("timerJobConfig");  
  20.         String nodeName = (String) config.get("nodeName");  
  21.         System.out.println("quartz cluster job on node "+nodeName+" .");  
  22.     }  
  23. }  


Quartz 實(shí)際并不關(guān)心你是在相同的還是不同的機(jī)器上運(yùn)行節(jié)點(diǎn)。當(dāng)集群是放置在不同的機(jī)器上時(shí),通常稱(chēng)之為水平集群。節(jié)點(diǎn)是跑在同一臺(tái)機(jī)器是,稱(chēng)之為垂直集群。對(duì)于垂直集群,存在著單點(diǎn)故障的問(wèn)題。這對(duì)高可用性的應(yīng)用來(lái)說(shuō)是個(gè)壞消息,因?yàn)橐坏C(jī)器崩潰了,所有的節(jié)點(diǎn)也就被有效的終止了。

當(dāng)你運(yùn)行水平集群時(shí),時(shí)鐘應(yīng)當(dāng)要同步,以免出現(xiàn)離奇且不可預(yù)知的行為。假如時(shí)鐘沒(méi)能夠同步,Scheduler 實(shí)例將對(duì)其他節(jié)點(diǎn)的狀態(tài)產(chǎn)生混亂。有幾種簡(jiǎn)單的方法來(lái)保證時(shí)鐘何持同步,而且也沒(méi)有理由不這么做。最簡(jiǎn)單的同步計(jì)算機(jī)時(shí)鐘的方式是使用某一個(gè) Internet 時(shí)間服務(wù)器(Internet Time Server ITS)。

沒(méi)什么會(huì)阻止你在相同環(huán)境中使用集群的和非集群的 Quartz 應(yīng)用。唯一要注意的是這兩個(gè)環(huán)境不要混用在相同的數(shù)據(jù)庫(kù)表。意思是非集群環(huán)境不要使用與集群應(yīng)用相同的一套數(shù)據(jù)庫(kù)表;否則將得到希奇古怪的結(jié)果,集群和非集群的 Job 都會(huì)遇到問(wèn)題。

假如你讓一個(gè)非集群的 Quartz 應(yīng)用與集群節(jié)點(diǎn)并行著運(yùn)行,設(shè)法使用 JobInitializationPlugin和 RAMJobStore。

注:例子中使用的是mysql數(shù)據(jù)庫(kù),還要解決水平集群時(shí)不同機(jī)器通過(guò)ip訪(fǎng)問(wèn)mysql的問(wèn)題
在mysql數(shù)據(jù)庫(kù)服務(wù)器中
進(jìn)入:mysql -u root -p/mysql -h localhost -u root -p mysql;
授權(quán):grant all privileges on   *.* to root@"%" identified by 'root' with grant option;
flush privileges;

它的意思是給從任意ip地址連接的用戶(hù)名為root,密碼為root的用戶(hù)賦予所有的權(quán)限。其中的"%"為任意的ip地址,如果想設(shè)為特定的值也可以設(shè)定為特定的值。   
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
spring Quartz配置
Spring中定時(shí)任務(wù)Quartz集群配置學(xué)習(xí)
Quartz應(yīng)用與集群原理分析
Spring整合實(shí)戰(zhàn)丨Quartz 集群配置
阿里P8架構(gòu)師談:Quartz調(diào)度框架詳解、運(yùn)用場(chǎng)景、與集群部署實(shí)踐 優(yōu)知學(xué)院
淺析Quartz的集群配置
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服