先来段废话
很多东西都是成功前,觉得非常难;成功了之后,又觉得没什么,不值得记录下来。其实不是的,你成功了,后面还是有很多的未成功的新人的,所以必须要分享出来。
特别是一些用的人不多的技术。像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,
"//132.121.80.202: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", "0020");
passFml.setString("TRADE_EPARCHY_CODE", "0020");
passFml.setString("TRADE_CITY_CODE", "0020");
passFml.setString("TRADE_DEPART_ID", "Z0020");
passFml.setString("TRADE_STAFF_ID", "Z999999");
passFml.setString("SERIAL_NUMBER", "18602017700");
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.202:45000
3、这个端口是在你要调用的tuxedo机器的etc目录下的ubbconfig中,wtc的端口和jolt的端口都在里面,配置的语句分别大概是这样子
WSL SRVGRP=GROUP1 SRVID=112 CLOPT="-A -- -n //32.121.80.202:46000 -m 10 -M 10 -x 10 -c 1024"
JSL SRVGRP=GROUP1 SRVID=112 CLOPT="-A -- -n //32.121.80.202: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 //12.121.80.202: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.202:45000.
Reason:NwHdlr: Cannot open socket
解决方法:tuxedo shutdown后会出现,重启tuxedo即可
还有一个原因,用tuxedo里的RE.html我试图配置,也出现了这个错误(未明原因)
最后
补充一下,tuxedo的安装目录里有详细的例子sample,比如Atm.java(明显就是照顾银行系统),不过可惜里面没有提及对中文的支持。