1. 程式人生 > >使用java通過jolt呼叫tuxedo

使用java通過jolt呼叫tuxedo

先來段廢話

很多東西都是成功前,覺得非常難;成功了之後,又覺得沒什麼,不值得記錄下來。其實不是的,你成功了,後面還是有很多的未成功的新人的,所以必須要分享出來。

特別是一些用的人不多的技術。像tuxedo現在用的人不多吧,也就一些銀行電信舊系統佔多,jolt又是tuxedo裡的一個分支而已,用的人就更少了,導致我遇到困難時上百度基本找不到很多有用的資訊,碩果僅存的也被現在鋪天蓋地的雲端計算、NoSQL所淹沒。

先貼一段成功呼叫的程式碼,然後再詳細說明。

成功呼叫的程式碼

	public void testTamRecvFeeTest() throws Exception {
		JoltSession session;
		JoltSessionAttributes sattr;
		JoltRemoteService passFml;

		String userName = null;
		String userPassword = null;
		String appPassword = null;
		String userRole = null;
		String sendStr = new String("TAM_RECV_FEE");
		sattr = new JoltSessionAttributes();
		sattr.setString(JoltSessionAttributes.APPADDRESS,
				"//32.121.80.205:45000");
		sattr.setInt(JoltSessionAttributes.IDLETIMEOUT, 300);
		session = new JoltSession(sattr, userName, userRole, userPassword,
				appPassword);
		passFml = new JoltRemoteService("QAM_CBS1_L1SVC", session);
		
		passFml.setString("X_TRANS_CODE", sendStr);

		passFml.setString("ROUTE_EPARCHY_CODE", "0010");
		passFml.setString("TRADE_EPARCHY_CODE", "0010");
		passFml.setString("TRADE_CITY_CODE", "0010");
		passFml.setString("TRADE_DEPART_ID", "Z0010");
		passFml.setString("TRADE_STAFF_ID", "Z999999");
		passFml.setString("SERIAL_NUMBER", "18802027700");
		passFml.setInt("PAYMENT_ID", 100001);
		passFml.setString("TRADE_FEE", "0");
		passFml.setString("CHANNEL_ID", "15000");

		passFml.call(null);
		JoltMessage jm = passFml.getOutputs();
		String b = new String(jm.toString().getBytes("iso-8859-1"), "gbk");
		String[] strPar = b.split(":");
		String resultCode = "-1";
		for (int i = 0; i < strPar.length; i++) {
			System.out.println("item:" + strPar[i]);
			if (strPar[i].split("\\[")[0].equals("X_RESULTCODE"))
				resultCode = strPar[i].split("\"")[1];
		}
		passFml.clear();
		session.endSession();
		assertTrue(resultCode.equals("0"));
	}



這篇文章只討論java側怎麼呼叫,至於tuxedo側的配置與搭建是不涉及的。預設是已經配置好。

呼叫要點

1、像JoltSession這些類,在Jolt.jar裡,需要引入。這個jar,在tuxedo的安裝目錄可以找到。在weblogic的安裝目錄應該也可以找到。
C:\bea\tuxedo8.1\udataobj\jolt
2、JoltSessionAttributes.APPADDRESS,這個是你呼叫的tuxedo地址與埠,必須//開始,用冒號分隔埠。
//32.121.80.208:45000
3、這個埠是在你要呼叫的tuxedo機器的etc目錄下的ubbconfig中,wtc的埠和jolt的埠都在裡面,配置的語句分別大概是這樣子
WSL SRVGRP=GROUP1 SRVID=112 CLOPT="-A -- -n //32.121.80.200:46000 -m 10 -M 10 -x 10 -c 1024"
JSL SRVGRP=GROUP1 SRVID=112 CLOPT="-A -- -n //32.121.80.200:45000 -m 10 -M 10 -x 10 -c 1024"
4、new JoltSession(sattr, userName, userRole, userPassword,appPassword);這裡裡面的使用者名稱等等我全部都是空,什麼時候可以留空我也沒研究,知道的兄弟也請告訴一下
5、new JoltRemoteService("QAM_CBS1_L1SVC", session);QAM_CBS1_L1SVC是tuxedo的serivce,你搭建tuxedo的時候配置的,同時,你還得在tuxedo的jrepository裡配置它才行;
6、String b = new String(jm.toString().getBytes("iso-8859-1"), "gbk");返回的我認為應該是iso8859_1的編碼,英文是沒有問題的,中文就亂碼,我轉了gbk以後還是有部分的亂碼,還沒解決這個問題;知道的兄弟也請告訴一下
7、inBuf.getOutputs()返回的格式,我看了似乎只能自己用“:”,“[”等slipt取出;沒有分隔好的輸入;


一些報錯的解決

中間還是遇到了很多的報錯,有些問題還是頭痛的一陣子。
1、Exception in thread "main" bea.jolt.SessionException: APPADDRESS format is //host:port,..
解決方法:按照//32.121.80.202:45000這個格式即可。
2、bea.jolt.SessionException: Cannot connect to any //32.121.80.200:46000.
Reason:NwHdlr: Network Error: chkauth: J_CHECKAUTH FAILED

解決方法:反編譯jolt.jar的程式碼就會知道J_CHECKAUTH FAILED這個錯在這裡不是使用者名稱密碼錯誤,而是一個ioexception,最有可能的是ip或埠錯了。我錯誤用了wtc的埠46000,改為45000jolt的埠即可。
3、Exception in thread "main" bea.jolt.ServiceException: Service is not available:TAM_CBS1_L1SVC
JoltRemoteService.init()

解決過程:開啟tuxedo的日誌:/ngbss/tuxapp/log/stderr,顯示的下面這個報錯:
tpcall .GETSVC failed: TPESVCFAIL - application level service failure
再看是JoltRemoteService.init()裡報出的,反編譯程式碼知道是初始化這個remoteservice時的問題,所以不是TAM_CBS1_L1SVC這服務本身有問題。那很可能就是jolt沒識別到這個服務。
解決方法:開啟jrepostory檔案,頭兩行是
#!JOLT1.0
add SVC/TPL_CRM1_L1SVC:bt=FML32:ex=1:BT=FML32:vs=6:\
要把TPL_CRM1_L1SVC改為TAM_CBS1_L1SVC才行。
注意,還有一個原因會導致這個錯誤,就是我在解決亂碼問題時,嘗試加入System.setProperty("bea.jolt.encoding", "iso8859_1");這程式碼
4、Exception in thread "main" java.lang.IllegalArgumentException: PAYMENT_ID
原因1:jrepository沒有配置payment_id
原因2:payment_id配置的型別不對
5、JoltMessage jm = inBuf.getOutputs();
JoltRemoteService裡,有input和output,output只提供了get方法,input只提供了set方法,所以你set了input後,又想直接get出來似乎是不行的。
6、修改jrepository後,必須重啟tux才能生效。
7、Exception in thread "main" bea.jolt.SessionException: Cannot connect to any //132.121.80.206:45000.

Reason:NwHdlr: Cannot open socket
解決方法:tuxedo shutdown後會出現,重啟tuxedo即可
還有一個原因,用tuxedo裡的RE.html我試圖配置,也出現了這個錯誤(未明原因)

最後

補充一下,tuxedo的安裝目錄裡有詳細的例子sample,比如Atm.java(明顯就是照顧銀行系統),不過可惜裡面沒有提及對中文的支援。