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è),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

2、以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á)。WebSphere MQ 中與消息觸發(fā)相關(guān)的參數(shù)如下:對(duì)象屬性缺省值可取值說(shuō)明隊(duì)列管理器TRIGINT999,999,9990 - 999,999,999TriggerInterval,單位毫秒,只對(duì)FIRST方式有效隊(duì)列(Local/Model)TRIGGERNOTRIGGERl TRIGGERl NOTRIGGERTriggerControl隊(duì)列(Local/Model)TRIGTYPEFIRSTl FIRSTl EVERYl DEPTHTri

3、ggerType隊(duì)列(Local/Model)TRIGDPTH1TriggerDepth隊(duì)列(Local/Model)TRIGMPRI0TriggerMsgPriority隊(duì)列(Local/Model)TRIGDATA空最多64字節(jié)觸發(fā)數(shù)據(jù)字串,可以用來(lái)指明觸發(fā)通道名進(jìn)程APPLICID空應(yīng)用程序名進(jìn)程APPLTYPE空應(yīng)用程序平臺(tái)進(jìn)程USERDATA空用戶數(shù)據(jù),也可以用來(lái)指明觸發(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指定。無(wú)論哪一種方式,能夠滿足觸發(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ā)方式WebSphere MQ支持三種觸發(fā)方式:FIRST、EVERY和DEPTH。FIRST顧名思義即“第一條”消息會(huì)引起觸發(fā),以后緊跟的消息則不會(huì)。WebSphere MQ 規(guī)定,如果隊(duì)列深度從0到1的時(shí)候,發(fā)生FIRS

5、T觸發(fā)。以后一段時(shí)間內(nèi)后繼到達(dá)的消息只要不是將隊(duì)列深度從0變成1,則不會(huì)再引起FIRST觸發(fā)。在這段時(shí)間過(guò)后,F(xiàn)IRST觸發(fā)復(fù)位,下一個(gè)到達(dá)的消息會(huì)再次引起FIRST觸發(fā)。所以,準(zhǔn)確地說(shuō),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ī)制被抑制,只有在這段時(shí)間過(guò)后,F(xiàn)IRST觸發(fā)機(jī)制才

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

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

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

9、NOTEPAD)+INITQ(SYSTEM.DEFAULT.INITIATION.QUEUE)+REPLACEDEFINEPROCESS(P_NOTEPAD)+APPLICID('C:/WINNT/system32/notepad.exe')+USERDATA(abc)+REPLACE觸發(fā)過(guò)程當(dāng)消息到達(dá)本地隊(duì)列后,WebSphere MQ會(huì)檢查:l 隊(duì)列TRIGGER開關(guān)是否打開l 消息的優(yōu)先級(jí)是否達(dá)到TRIGMPRIl 根據(jù)隊(duì)列的觸發(fā)類型,檢查觸發(fā)條件是否滿足l 隊(duì)列屬性中是否指定了觸發(fā)進(jìn)程 (PROCESS),相應(yīng)的進(jìn)程定義是否存在。如果隊(duì)列是傳輸隊(duì)列,且指定了TRIGDA

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

11、QUEUE屬性 MQCHAR48ProcessName;觸發(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屬性;其中的域一半來(lái)自本地隊(duì)列的屬性,另一半來(lái)自對(duì)應(yīng)進(jìn)程定義的屬性。觸發(fā)消息被觸發(fā)監(jiān)控器 (Trigger Monitor) 讀

12、走,Trigger Monitor可以根據(jù)MQTM結(jié)構(gòu)中的域啟動(dòng)相應(yīng)的觸發(fā)程序。Trigger Monitor可以自己寫,這樣可以幾乎不受約束地做任何事,甚至不啟動(dòng)觸發(fā)程序,或親自去應(yīng)用消息。如果使用系統(tǒng)缺省的觸發(fā)監(jiān)控器 (runmqtrm),啟動(dòng)命令如下,則會(huì)將MQTM結(jié)構(gòu)中的Version域改為MQTM_VERSION_2,同時(shí)在MQTM結(jié)構(gòu)下加一個(gè)域 QMgrName (隊(duì)列管理器名),形成MQTMC2結(jié)構(gòu)。runmqtrm -m <Queue Manager> -q <Init Queue>MQTMC2結(jié)構(gòu):struct tagMQTMC2 MQCHAR4Str

13、ucId;“TM ” MQLONGVersion;MQTM_VERSION_1 MQCHAR48QName;本地隊(duì)列名,即隊(duì)列的QUEUE屬性 MQCHAR48ProcessName;觸發(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

14、屬性 MQCHAR48QMgrName;隊(duì)列管理器名;缺省的觸發(fā)監(jiān)控器 (runmqtrm) 會(huì)啟動(dòng)觸發(fā)程序 (由MQTM2.ApplId指定),并將MQTMC2結(jié)構(gòu)以命令行參數(shù)的方式傳給它,傳入 argv 1。對(duì)于觸發(fā)程序而言,從命令行參數(shù)收到MQTMC2結(jié)構(gòu)后,可以按照約定讀取并處理應(yīng)用消息。觸發(fā)過(guò)程結(jié)束。并發(fā)對(duì)于FIRST和DEPTH觸發(fā)方式,觸發(fā)程序一般會(huì)以INPUT方式打開本地隊(duì)列,讀取并處理應(yīng)用消息。在觸發(fā)程序MQCLOSE之前,可能會(huì)有新的消息到達(dá),這些消息無(wú)法生成新的觸發(fā)消息。也就是說(shuō),在MQOPEN (MQOO_INPUT_*) 到MQCLOSE之間,隊(duì)列上的FIRST和DE

15、PTH觸發(fā)機(jī)制是暫時(shí)失效的。所以,對(duì)于FIRST和DEPTH這兩種觸發(fā)方式,是不可能觸發(fā)起多個(gè)應(yīng)用程序來(lái)并行工作的,這也就是為什么觸發(fā)起來(lái)的應(yīng)用程序通常要連續(xù)工作直到將隊(duì)列取空。一個(gè)初始化隊(duì)列上可以有多個(gè)Trigger Monitor在讀觸發(fā)消息,即初始化隊(duì)列的 OpenInputCount 可以大于1。這時(shí),這些Trigger Monitor將會(huì)輪流讀到觸發(fā)消息。但是,通常來(lái)說(shuō),使用觸發(fā)的應(yīng)用消息到達(dá)的頻度是比較低的,一個(gè)Trigger Monitor是夠用的,多個(gè)Trigger Monitor也不會(huì)提高性能。如果大消息在放入隊(duì)列時(shí)被自動(dòng)拆分成多個(gè)段 (Segment),則在 MQPUT 時(shí)

16、只會(huì)觸發(fā)一次。但是一旦消息路由到遠(yuǎn)端目標(biāo)隊(duì)列, 它們將被視為多條物理消息而在遠(yuǎn)端觸發(fā)多次。在 WMQ for z/OS 中,Non-Shared Local Queue 在DEPTH方式觸發(fā)計(jì)算消息數(shù)量的時(shí)候,無(wú)論消息是否提交都被計(jì)算在內(nèi)。所以被觸發(fā)起來(lái)的程序有可能沒有消息可讀,因?yàn)橛邢⑸形刺峤?。這種情況下,建議在 MQGET 的時(shí)候使用 WaitInterval 選項(xiàng),使得讀消息等一段時(shí)間。Shared Local Queue 在計(jì)算消息數(shù)量的時(shí)候,只計(jì)算提交后的消息。觸發(fā)通道1. 可以用進(jìn)程定義的USERDATA也可以用隊(duì)列的TRIGDATA屬性指定要觸發(fā)的通道2. 通常用FIRST方式

17、觸發(fā),一段時(shí)間內(nèi)的第一消息自動(dòng)觸發(fā)連接3. 在缺省情況下,初始化隊(duì)列為SYSTEM.CHANNEL.INITQ。當(dāng)然也可以使用其它的初始化隊(duì)列,那樣就需要手工runmqchi。4. 觸發(fā)應(yīng)該設(shè)置在通道主動(dòng)方,如SENDER、REQUESTER??梢栽O(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)+TRIGGE

18、R+TRIGTYPE(FIRST)+PROCESS(P_QM1.QM2)+INITQ(SYSTEM.CHANNEL.INITQ)+REPLACEDEFINEPROCESS(P_QM1.QM2)+USERDATA(C_QM1.QM2)+REPLACEDEFINECHANNEL(C_QM1.QM2)+CHLTYPE(SDR)+TRPTYPE(TCP)+CONNAME('127.0.0.1 (1415)')+XMITQ(QX_QM2)+DISCINT(10)+REPLACEQM2:-DEFINEQLOCAL(QL_QM2)+REPLACEDEFINECHANNEL(C_QM1.QM2

19、)+CHLTYPE(RCVR)+TRPTYPE(TCP)+REPLACE也可以是:QM1:-DEFINEQLOCAL(QX_QM2)+USAGE(XMITQ)+TRIGGER+TRIGTYPE(FIRST)+TRIGDATA(C_QM1.QM2)+INITQ(SYSTEM.CHANNEL.INITQ)+REPLACE其它相上,不需要有PROCESS定義QM2:-同上觸發(fā)通道是靠通道初始程序 (Channel Initiator) 完成的,它相當(dāng)于一個(gè)Trigger Monitor,監(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)提供了缺省的Channel Initiator runmqchi,它缺省監(jiān)聽在初始化隊(duì)列SYSTEM.CHANNEL.INITQ上,在strmqm啟動(dòng)隊(duì)列管理器時(shí)自動(dòng)跟隨啟動(dòng)。如果要自行指定觸發(fā)通道的初始化隊(duì)列,則需手工啟動(dòng) runmqchi。runmqchi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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)論