当前位置:   article > 正文

使用java通过jolt调用tuxedo_tuxedo中文乱码

tuxedo中文乱码

先来段废话

很多东西都是成功前,觉得非常难;成功了之后,又觉得没什么,不值得记录下来。其实不是的,你成功了,后面还是有很多的未成功的新人的,所以必须要分享出来。

特别是一些用的人不多的技术。像tuxedo现在用的人不多吧,也就一些银行电信旧系统占多,jolt又是tuxedo里的一个分支而已,用的人就更少了,导致我遇到困难时上百度基本找不到很多有用的信息,硕果仅存的也被现在铺天盖地的云计算、NoSQL所淹没。


先贴一段成功调用的代码,然后再详细说明。


成功调用的代码

  1. public void testTamRecvFeeTest() throws Exception {
  2. JoltSession session;
  3. JoltSessionAttributes sattr;
  4. JoltRemoteService passFml;
  5. String userName = null;
  6. String userPassword = null;
  7. String appPassword = null;
  8. String userRole = null;
  9. String sendStr = new String("TAM_RECV_FEE");
  10. sattr = new JoltSessionAttributes();
  11. sattr.setString(JoltSessionAttributes.APPADDRESS,
  12. "//32.121.80.205:45000");
  13. sattr.setInt(JoltSessionAttributes.IDLETIMEOUT, 300);
  14. session = new JoltSession(sattr, userName, userRole, userPassword,
  15. appPassword);
  16. passFml = new JoltRemoteService("QAM_CBS1_L1SVC", session);
  17. passFml.setString("X_TRANS_CODE", sendStr);
  18. passFml.setString("ROUTE_EPARCHY_CODE", "0010");
  19. passFml.setString("TRADE_EPARCHY_CODE", "0010");
  20. passFml.setString("TRADE_CITY_CODE", "0010");
  21. passFml.setString("TRADE_DEPART_ID", "Z0010");
  22. passFml.setString("TRADE_STAFF_ID", "Z999999");
  23. passFml.setString("SERIAL_NUMBER", "18802027700");
  24. passFml.setInt("PAYMENT_ID", 100001);
  25. passFml.setString("TRADE_FEE", "0");
  26. passFml.setString("CHANNEL_ID", "15000");
  27. passFml.call(null);
  28. JoltMessage jm = passFml.getOutputs();
  29. String b = new String(jm.toString().getBytes("iso-8859-1"), "gbk");
  30. String[] strPar = b.split(":");
  31. String resultCode = "-1";
  32. for (int i = 0; i < strPar.length; i++) {
  33. System.out.println("item:" + strPar[i]);
  34. if (strPar[i].split("\\[")[0].equals("X_RESULTCODE"))
  35. resultCode = strPar[i].split("\"")[1];
  36. }
  37. passFml.clear();
  38. session.endSession();
  39. assertTrue(resultCode.equals("0"));
  40. }



这篇文章只讨论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(明显就是照顾银行系统),不过可惜里面没有提及对中文的支持。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/371820
推荐阅读
相关标签
  

闽ICP备14008679号