WebsphereMQ設(shè)計(jì)篇第十二章觸發(fā)(Trigger)_第1頁(yè)
WebsphereMQ設(shè)計(jì)篇第十二章觸發(fā)(Trigger)_第2頁(yè)
WebsphereMQ設(shè)計(jì)篇第十二章觸發(fā)(Trigger)_第3頁(yè)
WebsphereMQ設(shè)計(jì)篇第十二章觸發(fā)(Trigger)_第4頁(yè)
WebsphereMQ設(shè)計(jì)篇第十二章觸發(fā)(Trigger)_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第十二章觸發(fā)(Trigger)原理WebSphereMQ中的本地隊(duì)列或模型隊(duì)列上可以設(shè)置消息觸發(fā)器(Trigger),到達(dá)的消息在優(yōu)先級(jí)、數(shù)量和到達(dá)方式上如果滿足預(yù)先設(shè)定的條件,則會(huì)有觸發(fā)消息自動(dòng)生成,放入指定的初始化隊(duì)列,再由觸發(fā)監(jiān)控器(TriggerMonitor)將觸發(fā)消息讀出,并根據(jù)觸發(fā)消息的內(nèi)容啟動(dòng)相應(yīng)的應(yīng)用程序。一般說來,該程序應(yīng)該首先從本地隊(duì)列中將應(yīng)用消息讀出并進(jìn)行應(yīng)用處理。應(yīng)用消息初始化隊(duì)列進(jìn)程定義*本地隊(duì)列觸發(fā)消息其中,本地隊(duì)列、初始化隊(duì)列、進(jìn)程定義是事先設(shè)置好的WebSphereMQ對(duì)象,觸發(fā)監(jiān)控器也是處于運(yùn)行狀態(tài)的,即在初始化隊(duì)列上等待觸發(fā)消息,一旦讀到觸發(fā)消息,則可以立

2、即啟動(dòng)MQGET應(yīng)用程序,所以MQGET應(yīng)用程序是被觸發(fā)啟動(dòng)的,通常情況下是觸發(fā)監(jiān)控器的子進(jìn)程。所有這些都只是設(shè)定了“連鎖反應(yīng)”中的各個(gè)環(huán)節(jié),而觸動(dòng)這個(gè)機(jī)關(guān)的是應(yīng)用消息的到達(dá)。WebSphereMQ中與消息觸發(fā)相關(guān)的參數(shù)如下:對(duì)象屬性缺省值可取值說明隊(duì)列管理器TRIGINT999,999,9990-999,999,999TriggerInterval,單位毫秒,只對(duì)FIRST方式有效隊(duì)列(Local/Model)TRIGGERNOTRIGGERTRIGGERNOTRIGGERTriggerControl隊(duì)列(Local/Model)TRIGTYPEFIRSTFIRSTEVERYDEPTHTri

3、ggerType隊(duì)列(Local/Model)TRIGDPTH1TriggerDepth隊(duì)列(Local/Model)TRIGMPRI0TriggerMsgPriority隊(duì)列(Local/Model)TRIGDATA空最多64字節(jié)觸發(fā)數(shù)據(jù)字串,可以用來指明觸發(fā)通道名進(jìn)程APPLICID空應(yīng)用程序名進(jìn)程APPLTYPE空應(yīng)用程序平臺(tái)進(jìn)程USERDATA空用戶數(shù)據(jù),也可以用來指明觸發(fā)通道名進(jìn)程ENVRDATA空環(huán)境數(shù)據(jù)隊(duì)列上的TRIGGER選項(xiàng)有兩種取值:TRIGGER或NOTRIGGER,它相當(dāng)于觸發(fā)器的開關(guān)。如果設(shè)置成NOTRIGGER,則不會(huì)有觸發(fā)發(fā)生,所有與觸發(fā)相關(guān)的設(shè)置全部失效。隊(duì)列上

4、共有三種觸發(fā)方式:FIRST、EVERY、DEPTH,由隊(duì)列屬性TRIGTYPE指定。無論哪一種方式,能夠滿足觸發(fā)條件的消息優(yōu)先級(jí)必須大于等于隊(duì)列觸發(fā)優(yōu)先級(jí)屬性TRIGMPRI。隊(duì)列管理器上的TRIGINT屬性表示FIRST方式時(shí)觸發(fā)的復(fù)位時(shí)間。僅對(duì)FIRST方式有效。隊(duì)列上觸發(fā)深度屬性TRIGDPTH表示DEPTH方式時(shí)滿足觸發(fā)條件的隊(duì)列深度,僅對(duì)DEPTH方式有效。觸發(fā)方式WebSphereMQ支持三種觸發(fā)方式:FIRST、EVERY和DEPTH。FIRST顧名思義即“第一條”消息會(huì)引起觸發(fā),以后緊跟的消息則不會(huì)。WebSphereMQ規(guī)定,如果隊(duì)列深度從0到1的時(shí)候,發(fā)生FIRST觸發(fā)。

5、以后一段時(shí)間內(nèi)后繼到達(dá)的消息只要不是將隊(duì)列深度從0變成1,則不會(huì)再引起FIRST觸發(fā)。在這段時(shí)間過后,F(xiàn)IRST觸發(fā)復(fù)位,下一個(gè)到達(dá)的消息會(huì)再次引起FIRST觸發(fā)。d時(shí)間TriggerintervalTriggerinterval所以,準(zhǔn)確地說,F(xiàn)IRST不是指隊(duì)列中到達(dá)的第一條消息,而是一段時(shí)間內(nèi)到達(dá)的第一條消息。這里所謂的“一段時(shí)間”是由隊(duì)列管理器屬性TRIGINT(TriggerInterval)指定的,TriggerInterval單位毫秒,缺省值為999,999,999,是一段很長(zhǎng)的時(shí)間,大約11.5天。如圖,從觸發(fā)開始記時(shí),在Triggerinterval期間,F(xiàn)IRST觸發(fā)機(jī)制被

6、抑制,只有在這段時(shí)間過后,F(xiàn)IRST觸發(fā)機(jī)制才重新起作用。在應(yīng)用設(shè)計(jì)與布署的時(shí)候,要適當(dāng)?shù)卣{(diào)整Triggerinterval時(shí)間。一批消息到達(dá)的時(shí)候,以第一條消息觸發(fā)起應(yīng)用程序,一般來說,觸發(fā)起來的應(yīng)用程序會(huì)連續(xù)處理隊(duì)列中的消息直到隊(duì)列被取空。后到的消息會(huì)在隊(duì)列中等待一段時(shí)間,到FIRST觸發(fā)機(jī)制復(fù)位后,由以后的第一條消息再次觸發(fā)起來的應(yīng)用程序進(jìn)行處理。如果消息到達(dá)隊(duì)列是均勻的,間隔時(shí)間為T,則消息在隊(duì)列中的最大等待時(shí)間為Triggerinterval+T。如果Triggerinterval=0,則FIRST與EVERY的效果相同。EVERYEVERY方式即每次消息的到達(dá)都會(huì)引起消息觸發(fā)。但由

7、于消息到達(dá)、觸發(fā)消息生成、應(yīng)用進(jìn)程啟動(dòng)、消息處理四個(gè)步驟是異步流水線方式完成的,所以,如果消息以高頻率方式到達(dá),在消息處理的時(shí)候,有可能發(fā)現(xiàn)隊(duì)列中不止一條消息,通常會(huì)連續(xù)處理。反過來,也可能發(fā)現(xiàn)沒有消息,因?yàn)楸簧弦淮斡|發(fā)起來的應(yīng)用程序處理完了。這個(gè)時(shí)候,就要求應(yīng)用程序有一定的靈活性,具有觸發(fā)一次處理多條消息的能力,在觸發(fā)后未發(fā)現(xiàn)相應(yīng)消息也無需報(bào)錯(cuò)。如果隊(duì)列中每一條消息的對(duì)應(yīng)處理程序是相同的,為了追求效率,一個(gè)通用的做法如下:TriggerMonitor可以連續(xù)讀觸發(fā)消息直到空,然后啟動(dòng)Trigger程序。Trigger程序可以用Wait方式讀取消息并進(jìn)行處理,連續(xù)運(yùn)行直到一段時(shí)間內(nèi)等不到新來的

8、消息。DEPTH在隊(duì)列深度達(dá)到一定值(TRiGDPTH)后觸發(fā),每次觸發(fā)后隊(duì)列管理器會(huì)自動(dòng)關(guān)閉隊(duì)列的觸發(fā)機(jī)制,即將隊(duì)列的TRIGGER(TriggerControl)屬性變成NOTRIGGER。所以,在應(yīng)用程序中用MQSET將其復(fù)位或通過MQSCalterqueue將觸發(fā)開關(guān)重新打開。在計(jì)算隊(duì)列深度的時(shí)候,消息的優(yōu)先級(jí)必須大于等于TRIGMPRIoTriggerDepth=1時(shí),DEPTH與EVERY效果相同。以EVERY觸發(fā)方式有例,每到達(dá)一條消息,啟動(dòng)Win2000記事本程序。QM:DEFINEQLOCAL(QLQM1)TRIGGERTRIGTYPE(EVERY)PROCESS(PNOTE

9、PAD)INITQ(SYSTEM.DEFAULT.INITIATION.QUEUE)REPLACETOC o 1-5 h zDEFINEPROCESS(P_NOTEPAD)+APPLICID(C:/WINNT/system32/notepad.exe)+USERDATA(abc)+REPLACE觸發(fā)過程當(dāng)消息到達(dá)本地隊(duì)列后,WebSphereMQ會(huì)檢查:隊(duì)列TRIGGER開關(guān)是否打開消息的優(yōu)先級(jí)是否達(dá)到TRIGMPRI根據(jù)隊(duì)列的觸發(fā)類型,檢查觸發(fā)條件是否滿足隊(duì)列屬性中是否指定了觸發(fā)進(jìn)程(PROCESS),相應(yīng)的進(jìn)程定義是否存在。如果隊(duì)列是傳輸隊(duì)列,且指定了TRIGDATA,則可以不檢查PROC

10、ESS屬性,然而也不會(huì)生成觸發(fā)消息。是否有進(jìn)程對(duì)初始化隊(duì)列INPUT方式打開,即初始化隊(duì)列上OpenInputCount計(jì)數(shù)至少為1。一般來說,這意味著TriggerMonitor在工作。如果檢查通過,則產(chǎn)生觸發(fā)消息,消息的目標(biāo)隊(duì)列由隊(duì)列的INITQ屬性指定,當(dāng)然INITQ也可以是一個(gè)遠(yuǎn)程隊(duì)列,這樣可以將觸發(fā)消息路由去其它隊(duì)列管理器。觸發(fā)消息的格式為MQTM結(jié)構(gòu),共684字節(jié)。如下:structtagMQTMMQCHAR4StrucId;“TM”MQLONGVersion;MQTM_VERSION_1MQCHAR48QName;本地隊(duì)列名,即隊(duì)列的QUEUE屬性MQCHAR48ProcessN

11、ame;觸發(fā)進(jìn)程名,即隊(duì)列的PROCESS屬性MQCHAR64TriggerData;觸發(fā)數(shù)據(jù)字串,即隊(duì)列的TRIGDATA屬性MQLONGApplType;應(yīng)用程序平臺(tái),即進(jìn)程的APPLTYPE屬性MQCHAR256ApplId;應(yīng)用程序名,即進(jìn)程的APPLICID屬性MQCHAR128EnvData;環(huán)境數(shù)據(jù),即進(jìn)程的ENVRDATA屬性MQCHAR128UserData;用戶數(shù)據(jù),即進(jìn)程的USERDATA屬性;其中的域一半來自本地隊(duì)列的屬性,另一半來自對(duì)應(yīng)進(jìn)程定義的屬性。觸發(fā)消息被觸發(fā)監(jiān)控器(TriggerMonitor)讀走,TriggerMonitor可以根據(jù)MQTM結(jié)構(gòu)中的域啟動(dòng)相

12、應(yīng)的觸發(fā)程序。TriggerMonitor可以自己寫,這樣可以幾乎不受約束地做任何事,甚至不啟動(dòng)觸發(fā)程序,或親自去應(yīng)用消息。如果使用系統(tǒng)缺省的觸發(fā)監(jiān)控器(runmqtrm),啟動(dòng)命令如下,則會(huì)將MQTM結(jié)構(gòu)中的Version域改為MQTM_VERSI0N_2,同時(shí)在MQTM結(jié)構(gòu)下加一個(gè)域QMgrName(隊(duì)列管理器名),形成MQTMC2結(jié)構(gòu)。runmqtrm-mQueueManager-qInitQueueMQTMC2結(jié)構(gòu):structtagMQTMC2MQTM_VERSION_1MQCHAR4StrucId;“TM”MQLONGVersion;MQCHAR48QName;MQCHAR48Pr

13、ocessName;MQCHAR64TriggerData;MQLONGApplType;MQCHAR256ApplId;MQCHAR128EnvData;MQCHAR128UserData;MQCHAR48QMgrName;本地隊(duì)列名,即隊(duì)列的QUEUE屬性觸發(fā)進(jìn)程名,即隊(duì)列的PROCESS屬性觸發(fā)數(shù)據(jù)字串,即隊(duì)列的TRIGDATA屬性應(yīng)用程序平臺(tái),即進(jìn)程的APPLTYPE屬性應(yīng)用程序名,即進(jìn)程的APPLICID屬性環(huán)境數(shù)據(jù),即進(jìn)程的ENVRDATA屬性用戶數(shù)據(jù),即進(jìn)程的USERDATA屬性隊(duì)列管理器名;缺省的觸發(fā)監(jiān)控器(runmqtrm)會(huì)啟動(dòng)觸發(fā)程序(由MQTM2.ApplId指定),并

14、將MQTMC2結(jié)構(gòu)以命令行參數(shù)的方式傳給它,傳入argv1。對(duì)于觸發(fā)程序而言,從命令行參數(shù)收到MQTMC2結(jié)構(gòu)后,可以按照約定讀取并處理應(yīng)用消息。觸發(fā)過程結(jié)束。并發(fā)對(duì)于FIRST和DEPTH觸發(fā)方式,觸發(fā)程序一般會(huì)以INPUT方式打開本地隊(duì)列,讀取并處理應(yīng)用消息。在觸發(fā)程序MQCLOSE之前,可能會(huì)有新的消息到達(dá),這些消息無法生成新的觸發(fā)消息。也就是說,在MQOPEN(MQOO_INPUT_*)到MQCLOSE之間,隊(duì)列上的FIRST和DEPTH觸發(fā)機(jī)制是暫時(shí)失效的。所以,對(duì)于FIRST和DEPTH這兩種觸發(fā)方式,是不可能觸發(fā)起多個(gè)應(yīng)用程序來并行工作的,這也就是為什么觸發(fā)起來的應(yīng)用程序通常要連

15、續(xù)工作直到將隊(duì)列取空。一個(gè)初始化隊(duì)列上可以有多個(gè)TriggerMonitor在讀觸發(fā)消息,即初始化隊(duì)列的OpenInputCount可以大于1。這時(shí),這些TriggerMonitor將會(huì)輪流讀到觸發(fā)消息。但是,通常來說,使用觸發(fā)的應(yīng)用消息到達(dá)的頻度是比較低的,一個(gè)TriggerMonitor是夠用的,多個(gè)TriggerMonitor也不會(huì)提高性能。如果大消息在放入隊(duì)列時(shí)被自動(dòng)拆分成多個(gè)段(Segment),則在MQPUT時(shí)只會(huì)觸發(fā)一次。但是一旦消息路由到遠(yuǎn)端目標(biāo)隊(duì)列,它們將被視為多條物理消息而在遠(yuǎn)端觸發(fā)多次。在WMQforz/OS中,Non-SharedLocalQueue在DEPTH方式觸發(fā)

16、計(jì)算消息數(shù)量的時(shí)候,無論消息是否提交都被計(jì)算在內(nèi)。所以被觸發(fā)起來的程序有可能沒有消息可讀,因?yàn)橛邢⑸形刺峤?。這種情況下,建議在MQGET的時(shí)候使用WaitInterval選項(xiàng),使得讀消息等一段時(shí)間。SharedLocalQueue在計(jì)算消息數(shù)量的時(shí)候,只計(jì)算提交后的消息。觸發(fā)通道可以用進(jìn)程定義的USERDATA也可以用隊(duì)列的TRIGDATA屬性指定要觸發(fā)的通道通常用FIRST方式觸發(fā),一段時(shí)間內(nèi)的第一消息自動(dòng)觸發(fā)連接在缺省情況下,初始化隊(duì)列為SYSTEM.CHANNEL.INITQ。當(dāng)然也可以使用其它的初始化隊(duì)列,那樣就需要手工runmqchi。觸發(fā)應(yīng)該設(shè)置在通道主動(dòng)方,如SENDER、RE

17、QUESTER。可以設(shè)定DISCINT在一斷時(shí)間后自動(dòng)斷連,重新處于待觸發(fā)狀態(tài)。配置可以是:(每次第一條消息觸發(fā)通道,隔10秒鐘通道自動(dòng)斷開)QM1:DEFINEQREMOTE(QR_QM2)+RNAME(QL_QM2)+RQMNAME(QM2)+XMITQ(QX_QM2)+REPLACEDEFINEQLOCAL(QX_QM2)+USAGE(XMITQ)+TRIGGER+TRIGTYPE(FIRST)+PROCESS(PQM1.QM2)+INITQ(SYSTEM.CHANNEL.INITQ)+REPLACEDEFINEPROCESS(PQM1.QM2)+USERDATA(CQM1.QM2)+R

18、EPLACEDEFINECHANNEL(CQM1.QM2)+CHLTYPE(SDR)+TRPTYPE(TCP)+CONNAME(127.0.0.1(1415)+XMITQ(QX_QM2)+DISCINT(10)+REPLACEQM2:DEFINEREPLACEDEFINECHANNELCHLTYPETRPTYPEREPLACE也可以是:QM1:DEFINETRIGGERTRIGTYPETRIGDATA(CQM1.QM2)+INITQ(SYSTEM.CHANNEL.INITQ)+REPLACE其它相上,不需要有PROCESS定義QM2:同上觸發(fā)通道是靠通道初始程序(ChannelInitiator)完成的,它相當(dāng)于一個(gè)TriggerMonitor,監(jiān)聽相應(yīng)的初始化隊(duì)列,一旦有消息在傳輸隊(duì)列上等待傳送,該程序會(huì)從初始化隊(duì)列中讀到觸發(fā)消息,自動(dòng)啟動(dòng)通道。屆時(shí),發(fā)送端就會(huì)出現(xiàn)runmqchl進(jìn)程。事實(shí)上,這樣的程序用戶也可以自己開發(fā)。系統(tǒng)提供了缺省的ChannelI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論