在電信領域的開發中,如今流行的架構是前臺使用java,負責組織業務流程、展示結果,後臺使用C/C++來封裝各類服務,供前臺調用。這就會出現前臺Java如何鏈接Tuxedo服務器,調用服務的問題。一般,有兩種解決方案,WTC和Jolt。WTC是weblogic鏈接tuxedo的專有方案,Jolt是tuxedo自己攜帶的組件。由於weblogic和tuxedo都是oracle的產品,所以,能夠推測,WTC的集成度和效率會高一些,功能強大一些,但須於weblogic綁定,沒有Jolt自由度高,所以我的推薦使用Jolt來鏈接tuxedo.html
下面將介紹使用Jolt鏈接Tuxedo過程當中,tuxedo側的主要配置,以及使人頭痛的亂碼問題的解決:java
1.1、ubbconfig文件配置web
爲使Jolt客戶端正常鏈接到Tuxedo服務器,須要在ubbconfig中開啓JSL和JREPSVR兩個進程,JSL用於監聽並分發客戶端的請求,JREPSVR進程用於配置Tuxedo導出給Jolt客戶端的服務,具體配置以下:服務器
修改*RESOURCES區的MAXACCESSERS參數的值爲足夠大,如900。架構
在*GROUPS區添加JSLGRP和JREPGRP兩個group,以下:oracle
JSLGRP LMID=SITE1 GRPNO=3編碼
JREPGRP LMID=SITE1 GRPNO=4spa
其中,LMID字段要與*MACHINES區中Tuxedo所在主機的LMID相同。命令行
在*SERVERS區添加JSL和JREPSVR兩個server,以下:code
JSL SRVGRP=JSLGRP SRVID=755
CLOPT="-A -- -n //1.2.3.4:5002 -m 5 -M 10 -x 5"
JREPSVR SRVGRP=JREPGRP SRVID=760 RESTART=Y GRACE=0
CLOPT="-A -- -W -P /bea/tuxedo8.1/udataobj/jolt/repository/jrepository"
其中,SRVGRP字段要與*GROUPS區添加JSLGRP和JREPGRP兩個group對應;JSL的CLOPT字段中的地址要填寫Tuxedo對外提供服務的真實地址;JREPSVR的CLOPT字段中的-P屬性是指定的Jolt的服務註冊表文件,該路徑必須跟真實的路徑相符。其餘各個參數的詳細含義,能夠參照下面的連接:
http://download-llnw.oracle.com/docs/cd/E13161_01/tuxedo/docs10gr3/jdg/dvconfig.html
先前ubbconfig中可能開啓了WSL進程,該進程能夠關閉,Jolt不使用該服務。
確認Tuxedo安裝中是否包含Jolt的licsence
打開
TUXEDO_HOME\udataobj\jolt\lic.txt
文件,查看其中是否包含[BEA JOLT]段,若是不包含,則須要添加該licsence,不然,Jolt 服務器將沒法啓動。
所有配置完畢後,重啓Tuxedo服務器,若在控制檯看到以下輸出,則說明JSL和JREPSVR服務啓動成功:
exec JSL -A -- -n //1.2.3.4:5002 -m 5 -M 10 -x 5 :
process id=5298 ... Started.
exec JREPSVR -A -- -W -P /bea/tuxedo8.1/udataobj/jolt/repository/jrepository :
process id=5304 ... Started.
問題列表:
JSL進程啓動失敗,出現以下異常:
exec JSL -A -- -n //1.2.3.3:5002 -m 5 -M 10 -x 5 :
CMDTUX_CAT:1685: ERROR: Application initialization failure
該異常多是Tuxedo沒裝Jolt的licsence,或Jolt的licsence失效。
JSL進程啓動失敗,出現以下異常:
095007.s22024!JSH.16097.3086915264.-2: JOLT_CAT:1008: "ERROR: Could not establish listening address on network 0x000213890a047822"
該異常多是JSL使用的端口被佔用,換一個可用的端口便可。
1.2、導出Tuxedo服務
爲使Jolt客戶端可以查找到須要的服務,必須將須要的Tuxedo服務導出到Jolt註冊表中,即上面提到的jrepository文件。服務的導出既可在Tuxedo服務器上進行,也可在其餘客戶端機器上進行。具體以下:
在機器上安裝JDK,並配置path環境變量。
將jolt.jar和joltadmin.jar加載到classpath下,以下:
CLASSPATH=.:/bea/tuxedo8.1/udataobj/jolt/joltadmin.jar:/bea/tuxedo8.1/udataobj/jolt/jolt.jar
上面的兩個jar包在TUXEDO_HOME \udataobj\jolt目錄下能夠找到。
導出服務
導出Tuxedo服務時,須要根據要導出的服務的詳細定義編寫導出腳本。好比:
service=SVC
export=true
inbuf=VIEW32
outbuf=STRING
inview=trans
param=routeid
type=string
access=in
param=inxml
type=string
access=in
param=outxml
type=string
access=out
其中service表明Tuxedo服務名,export表示是否導出,inbuf表明傳出參數的類型,outbuf表明返回參數的類型,param表明傳入傳出參數的名字,type表明傳入傳出參數的類型,access表示參數的訪問類型。編寫好導出腳本,將其保存成文本文件,如SVC.rep,在命令行進入所在目錄,執行下面的命令執行導出:
java bea.jolt.admin.jbld -p aaa //1.2.3.4:5002 SVC.rep
注意,ip及端口須要與ubbconfig文件中配置的JSL進程的CLOPT字段中的地址一致。
若是看到以下信息,則說明服務導出成功:
Line[1]: Service [SVC]: Inserted
Previous Package [PKG/aaa]: Deleted
Package [PKG/aaa]: Inserted
BULK LOAD SUMMARY
-----------------
Bulk load file name: SVC.rep
Services Defined in file: 1
Services Inserted: 1
Services Not Replaced: 0
Services Errors: 0
Previous Bulk Services Deleted: 0
問題列表:
導出失敗,出現以下異常:
C:\>java bea.jolt.admin.jbld -p abm //1.2.3.4:5002 SVC_BILL_REDUCE.rep
Exception in thread "main" bea.jolt.ServiceException: Service is not available:.GETKEYS
at bea.jolt.JoltRemoteService.init(JoltRemoteService.java:156)
at bea.jolt.JoltRemoteService.(JoltRemoteService.java:112)
at bea.jolt.admin.JSvcPkgTbl.initTable(jbld.java:1010)
at bea.jolt.admin.JSvcPkgTbl.(jbld.java:990)
at bea.jolt.admin.JBldDefRec.(jbld.java:138)
at bea.jolt.admin.jbld.main(jbld.java:801)
該異常多是由於預先配置了「1.3、國際化」的配置,從而客戶端與服務器的字符編碼不一致,服務器沒法識別客戶端發送的導出命令形成的。解決辦法是,將主機上的系統變量JOLTI18N=TRUE刪除,重啓Tuxedo,從新執行導出命令。
1.3、國際化
因爲Jolt客戶端與Tuxedo交互時,相互傳遞的參數可能包含中文,所以,要對傳輸的內容進行國際化。步驟以下:
Tuxedo服務器端
在主機上添加下面的環境變量,重啓Tuxedo服務器,JSH會參照此變量。
JOLTI18N=TRUE
Jolt客戶端
將jolti18n.jar添加到classpath下,並在系統參數中添加以下屬性,其中,charsetName表明Jolt客戶端與tuxedo交互時使用的字符編碼集,該字符編碼集必須在客戶端和服務器上都支持,如GBK。
bea.jolt.encoding=charsetName
系統屬性的添加方法有以下兩種:
$java ... -Dbea.jolt.encoding=codesetname ...
或 System.setProperty("bea.jolt.encoding", joltEncoding);
注意,導出服務時,需關閉國際化,不然會報錯。
另,以上過程當中若出現異常,能夠查看ULOG進行確認。
以上就是Tuxdeo端的所有配置,配置完畢後,就可使用Jolt客戶端鏈接並調用Tuxedo服務了。