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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、一定值 (TRIGDPTH) 后觸發(fā),每次觸發(fā)后隊列管理器會自動關(guān)閉隊列的觸發(fā)機制,即將隊列的TRIGGER (TriggerControl) 屬性變成NOTRIGGER。所以,在應(yīng)用程序中用MQSET將其復(fù)位或通過MQSC alter queue 將觸發(fā)開關(guān)重新打開。在計算隊列深度的時候,消息的優(yōu)先級必須大于等于TRIGMPRI。TriggerDepth = 1 時,DEPTH與EVERY效果相同。配置以EVERY觸發(fā)方式有例,每到達一條消息,啟動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ā)過程當(dāng)消息到達本地隊列后,WebSphere MQ會檢查:l 隊列TRIGGER開關(guān)是否打開l 消息的優(yōu)先級是否達到TRIGMPRIl 根據(jù)隊列的觸發(fā)類型,檢查觸發(fā)條件是否滿足l 隊列屬性中是否指定了觸發(fā)進程 (PROCESS),相應(yīng)的進程定義是否存在。如果隊列是傳輸隊列,且指定了TRIGDA

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

11、QUEUE屬性 MQCHAR48ProcessName;觸發(fā)進程名,即隊列的PROCESS屬性 MQCHAR64TriggerData;觸發(fā)數(shù)據(jù)字串,即隊列的TRIGDATA屬性 MQLONGApplType;應(yīng)用程序平臺,即進程的APPLTYPE屬性 MQCHAR256ApplId;應(yīng)用程序名,即進程的APPLICID屬性 MQCHAR128EnvData;環(huán)境數(shù)據(jù),即進程的ENVRDATA屬性 MQCHAR128UserData;用戶數(shù)據(jù),即進程的USERDATA屬性;其中的域一半來自本地隊列的屬性,另一半來自對應(yīng)進程定義的屬性。觸發(fā)消息被觸發(fā)監(jiān)控器 (Trigger Monitor) 讀

12、走,Trigger Monitor可以根據(jù)MQTM結(jié)構(gòu)中的域啟動相應(yīng)的觸發(fā)程序。Trigger Monitor可以自己寫,這樣可以幾乎不受約束地做任何事,甚至不啟動觸發(fā)程序,或親自去應(yīng)用消息。如果使用系統(tǒng)缺省的觸發(fā)監(jiān)控器 (runmqtrm),啟動命令如下,則會將MQTM結(jié)構(gòu)中的Version域改為MQTM_VERSION_2,同時在MQTM結(jié)構(gòu)下加一個域 QMgrName (隊列管理器名),形成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;本地隊列名,即隊列的QUEUE屬性 MQCHAR48ProcessName;觸發(fā)進程名,即隊列的PROCESS屬性 MQCHAR64TriggerData;觸發(fā)數(shù)據(jù)字串,即隊列的TRIGDATA屬性 MQLONGApplType;應(yīng)用程序平臺,即進程的APPLTYPE屬性 MQCHAR256ApplId;應(yīng)用程序名,即進程的APPLICID屬性 MQCHAR128EnvData;環(huán)境數(shù)據(jù),即進程的ENVRDATA屬性 MQCHAR128UserData;用戶數(shù)據(jù),即進程的USERDATA

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

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

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

17、觸發(fā),一段時間內(nèi)的第一消息自動觸發(fā)連接3. 在缺省情況下,初始化隊列為SYSTEM.CHANNEL.INITQ。當(dāng)然也可以使用其它的初始化隊列,那樣就需要手工runmqchi。4. 觸發(fā)應(yīng)該設(shè)置在通道主動方,如SENDER、REQUESTER??梢栽O(shè)定DISCINT在一斷時間后自動斷連,重新處于待觸發(fā)狀態(tài)。配置可以是:(每次第一條消息觸發(fā)通道,隔10秒鐘通道自動斷開)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)于一個Trigger Monitor,監(jiān)聽相應(yīng)的初始化隊列,一旦有消息在傳輸隊列上等待傳送,該程序會從初始化隊列中讀到觸發(fā)消息,自動啟動通道。屆時,發(fā)送端就會出現(xiàn)runmqchl進程。事實上,這樣的程序用戶也可以自己開發(fā)。系統(tǒng)提供了缺省的Channel Initiator runmqchi,它缺省監(jiān)聽在初始化隊列SYSTEM.CHANNEL.INITQ上,在strmqm啟動隊列管理器時自動跟隨啟動。如果要自行指定觸發(fā)通道的初始化隊列,則需手工啟動 runmqchi。runmqchi

溫馨提示

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

最新文檔

評論

0/150

提交評論