- 論壇徽章:
- 0
|
本帖最后由 niuhua77 于 2011-07-12 18:33 編輯
一 基本概念:
Service program是由module和其他Service program組成的,在系統(tǒng)中用*SRVPGM來(lái)表示(好像是廢話- -!),其包含了很多可被其他程序調(diào)用的procedure。
Service program是用by reference方式綁定,功能類似于其他語(yǔ)言的函數(shù)庫(kù),提供了很多procedure供其他ILE program調(diào)用。
Service program中哪些procedure可以被其他program調(diào)用,哪些不可以呢?這就牽扯到了Service program中一個(gè)非常重要的概念:public interface。
二 公共接口(public interface)
Service program的public interface規(guī)定了哪些procedure和data item可以被外界使用,哪些不可。如果public interface設(shè)置的不合理,很容易產(chǎn)生program與Service program不兼容的問(wèn)題,導(dǎo)致程序發(fā)生異常。那么如何定義Service program的public interface呢,如下:
CRTSRVPGM命令的EXPROT參數(shù)規(guī)定了Service program如何對(duì)外提供接口,并提供2個(gè)參數(shù)值:
1 EXPORT (*ALL)。選擇*all的話,那么Service program里所有使用key word:EXPORT修飾的procedure和data item都可以被外界程序使用。
2 EXPROT(*SRCFILE)。*SRCFILE是默認(rèn)的參數(shù)值。使用*SRCFILE的話,可以使用binder language(BND文件)來(lái)自定義public interface,自己選擇哪些procedure和data item可以被外界使用(這些 procedure、data item也必須使用key word:EXPROT修飾)。
注:binder language的文件類型是BND,默認(rèn)的SOURCE FILE是QSRVSRC,并且BND文件是不需要編譯的。
下面說(shuō)一下*ALL和*SRCFILE各自的優(yōu)缺點(diǎn):
*ALL的優(yōu)點(diǎn):使用起來(lái)非常方便,不需要額外的輔助文件,Service program中所有的export procedure 和data item就都可以被其他程序調(diào)用。
*ALL的缺點(diǎn):兼容性太差,無(wú)論增加或者減少Service program的export procedure、data item,都會(huì)導(dǎo)致program與Service program的不兼容。那么所有用到此Service program的program都需要重新綁定(UPDPGM)或者重新編譯(CRTPGM)才能正常使用。就算是這種變化并不會(huì)影響程序的正常運(yùn)行(比如說(shuō)你向Service program中追加了一個(gè)新的procedure,并且現(xiàn)程序并不使用此procedure,即增加procedure不影響現(xiàn)在的程序運(yùn)行)那么所有用到此Service program的program也要重新綁定或編譯。很麻煩吧。
*SRCFILE的缺點(diǎn):*SRCFILE使用起來(lái)要比*ALL麻煩些,因?yàn)橐褂胋inder language定義BND文件才能使用。
*SRCFILE的優(yōu)點(diǎn):提供了很好的兼容性。即增加或者減少Service program 的 export 的procedure、data item,程序仍然運(yùn)行,不需要重新編譯相關(guān)的program。
那到底是什么原因產(chǎn)生的兼容性問(wèn)題?聽(tīng)我慢慢道來(lái)
三 signature與binder language
1 signature
首先系統(tǒng)為Service program提供了一個(gè)類似PF的level check的功能,來(lái)檢查ILE program與Service program當(dāng)前的接口是否一致。大概的過(guò)程如下:
1)CRTSRVPGM時(shí),系統(tǒng)會(huì)根據(jù)Service program 的export procedure、data item的數(shù)量、名稱、順序產(chǎn)生一個(gè)signature(類型于PF的record format ID,具有唯一性),并保存在*SRVPGM中。例如:
DSPSRVPGM SRVPGM(PASS) DETAIL(*SIGNATURE)
splay Service Program Information
Display 1 of 1
Service program . . . . . . . . . . . . : PASS
Library . . . . . . . . . . . . . . . : MYLIB
Owner . . . . . . . . . . . . . . . . . : MYLIB
Service program attribute . . . . . . . : RPGLE
Detail . . . . . . . . . . . . . . . . . : *SIGNATURE
Signatures:
0000000000000000C5F03F1A5845D322
2)CRTPGM時(shí),會(huì)將此Service program綁定到*PGM中,同時(shí)會(huì)把Service program當(dāng)前的signature值也保存在*PGM中。例如:
DSPPGM PGM(PASSBY2) DETAIL(*SRVPGM)
Display Program Information
Service
Opt Program Library Signature
PASS *LIBL 0000000000000000C5F03F1A5845D322
QRNXIE QSYS D8D9D5E7C9C540404040404040404040
QRNXUTIL QSYS D8D9D5E7E4E3C9D34040404040404040
QLEAWI QSYS 44F70FABA08585397BDF0CF195F82EC1
3)當(dāng)*PGM被調(diào)用的時(shí)候,PGM會(huì)激活Service program(即把Service program加入到active group中),在激活的過(guò)程中會(huì)比較*PGM中的signature值與*SRVPGM的signature值是否一致。如果一致,則程序正常運(yùn)行;如果不一致,則程序出現(xiàn)異常。
大概就這么個(gè)過(guò)程。
2 與PF LEVEL CHECK(*YES/*NO)類似,你也可以指定是否進(jìn)行signature的檢查
1)*ALL的話,默認(rèn)LVLCHK(*YES)并且不能更改,會(huì)進(jìn)行檢查。那么當(dāng)Service program的export procedure、data item發(fā)生變化時(shí)(增加、減少),相應(yīng)的signature值也發(fā)生變化了,如果不重新綁定,重新編譯相關(guān)的program,那么就導(dǎo)致了program與Service program的signature值不一樣,必然導(dǎo)致不兼容。
2)*SRCFILE的話,可以選擇LVLCHK *YES還是*NO。選擇*NO的話,就不用細(xì)說(shuō)了,因?yàn)?NO不會(huì)進(jìn)行signature檢查無(wú)論你怎么變化procedure、data item都不要緊。因?yàn)橄到y(tǒng)根本不會(huì)對(duì)program與Service program的signature進(jìn)行對(duì)比,自然不存在兼容不兼容的問(wèn)題。(使用*NO要謹(jǐn)慎,沒(méi)有系統(tǒng)的檢查,可能會(huì)出現(xiàn)一下不可預(yù)知的錯(cuò)誤)
選擇*YES的話,你可以在一個(gè)BND文件中,定義多個(gè)signature,只要*PGM中保存的signature值與BND文件中任意一個(gè)signature值相當(dāng),程序就可以正常運(yùn)行。舉個(gè)例子吧:
PGM1用到了SRVPGM1
SRVPGM1有2個(gè)export procedure:export P1 export P2
BND文件:
STRPGMEXP PGMLVL(*CURRENT) LVLCHK(*YES)
EXPORT SYMBOL(‘P1’)
EXPORT SYMBOL(’P2’)
ENDPGMEXP
假設(shè)經(jīng)過(guò)編譯后,PGM1可以正常調(diào)用SRVPGM1。
現(xiàn)在SRVPGM1增加了一個(gè)export procedure,那么為了保持PGM1與SRVPGM1的兼容,我會(huì)增加一個(gè)signature,如下:
BND文件:
STRPGMEXP PGMLVL(*CURRENT) LVLCHK(*YES)
EXPORT SYMBOL(‘P1’)
EXPORT SYMBOL(’P2’)
EXPORT SYMBOL(’P3’)
ENDPGMEXP
STRPGMEXP PGMLVL(*PRV) LVLCHK(*YES)
EXPORT SYMBOL(‘P1’)
EXPORT SYMBOL(’P2’)
ENDPGMEXP
這樣的話,即使我不重新編譯PGM1,PGM1也可以正常調(diào)用SRVPGM1(不過(guò)不能使用新追加的P3,只能使用*PRV的export block)
注意:signature的值是由export procedure、data item的名稱、數(shù)量、順序決定的,且具有唯一性。為了避免不兼容問(wèn)題的發(fā)生,注意以下幾點(diǎn):
1)不要破壞原來(lái)export block中export procedure、data item的順序和數(shù)量。
2)新追加export block(即定義多個(gè)signature)的話,新的export block必須要包含原來(lái)的export block中的內(nèi)容,并且順序、數(shù)量都不能改變。新追加的export procedure、data item要放export list的最后面。(如上面例子所示)
3)不要?jiǎng)h除原export block中的procedure、data item
此外,還可以通過(guò)自定義signature的值,也可以解決兼容性問(wèn)題,這里就不多說(shuō)了。
四 service program的激活
Service program不能夠直接激活。調(diào)用SRVPGM的ILE PROGRAM被調(diào)用的話,那么此SRVPGM就自動(dòng)被激活。
Service program的激活過(guò)程中,主要干2件事:
1 通過(guò)符號(hào)鏈接與物理地址的轉(zhuǎn)換,完成綁定工作。
2 進(jìn)行signature checking。
這兩步之前都進(jìn)行過(guò)詳細(xì)說(shuō)明,不再敘述。
—————————————補(bǔ)充說(shuō)明————————————————————————————————————————————————————
五 service program的用途、目的、優(yōu)勢(shì)
為什么要使用service program呢?service program能給我們提供什么好處呢?
我們之所以選擇service program,主要從以下2方面進(jìn)行考慮:
1 采用service program,能使系統(tǒng)維護(hù)更加方便,提高可重用性(我認(rèn)為是最主要的原因)
2 采用service program,可以節(jié)省硬盤(pán)空間,節(jié)省內(nèi)存空間。
下面還是擺事實(shí)、講道理吧
1) 可維護(hù)性:
假如說(shuō)有N個(gè)程序,都會(huì)調(diào)用MOD1,不使用service program方式的話,就得使用by copy的方式綁定,即:CRTPGM (PGM1) MODULE(MOD1)。那么,如果MOD1發(fā)生變更的話,這N個(gè)程序都需要重新綁定(UPDPGM)或者編譯(CRTPGM),才能使用更新后的MOD1。
如果使用service program的話,把MOD1加入到SRVPGM1中。當(dāng)MOD1再次發(fā)生變更時(shí),如果MOD1的變更不影響SRVPGM1的public interface(即PGM1與SRVPGM1仍然兼容),那么你只需要UPDSRVPGM即可,其他相關(guān)聯(lián)的N個(gè)程序都不需要重新綁定或編譯;如果MOD1的變更影響到了SRVPGM1的public interface的話(比如說(shuō)MOD1新增加了一個(gè)export procedure,即PGM1與SRVPGM1不兼容),那么你UPDSRVPGM之后,也只需要UPDPGM(或CRTPGM)與新追加的export procedure相關(guān)的PGM即可,不需要UPDPGM所有的PGM,方便吧。
2)節(jié)省空間:
使用by copy的方式綁定,N個(gè)程序中就有N個(gè)MOD1的代碼。如果使用service program,那么整個(gè)硬盤(pán)中實(shí)際上只有一個(gè)MOD1的代碼,節(jié)省了硬盤(pán)空間。
而在實(shí)際運(yùn)行中,所有的用戶實(shí)際上是共用一份service program的代碼,系統(tǒng)會(huì)給每個(gè)用戶分配獨(dú)立的靜態(tài)變量區(qū),但是代碼是共用一份的。而使用by copy的方式,每個(gè)程序中,還是會(huì)包含一分MOD1的代碼,這樣service program也就節(jié)省了內(nèi)存空間。
六 實(shí)際使用情況
如果一個(gè)procedure被多個(gè)程序調(diào)用的話,那么就應(yīng)該把它加入到service program中。如果這個(gè)procedure僅僅是一次性使用的話,那么就沒(méi)必要了。
我認(rèn)為理想的情況是,ILE *PGM應(yīng)該由一個(gè)main procedure/module(提供PEP)+ 其它service program組成。
具體的應(yīng)用情況是,可以把功能類似的程序組成一個(gè)service program。比如把各種登錄驗(yàn)證的程序,歸為一個(gè)service program;各種日期轉(zhuǎn)換,日期編輯的程序放到一個(gè)service program;還有各種處理代碼程序,放到一個(gè)service program等。
每個(gè)公司的應(yīng)用情況都不同,歡迎其他的同學(xué)可以補(bǔ)充,指正。 |
|