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

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在 Spring Boot 中整合 Jolt,你可以按照以下步骤进行操作: 1. 添加依赖:在你的 Spring Boot 项目的 pom.xml 文件中,添加 Jolt 的依赖。你可以在 Maven 中央仓库中找到最新的 Jolt 依赖版本。例如: ```xml <dependency> <groupId>com.bazaarvoice.jolt</groupId> <artifactId>jolt</artifactId> <version>0.4.0</version> </dependency> ``` 2. 创建 Jolt 转换规则:在你的项目中创建一个 JSON 文件,定义 Jolt 转换规则。例如,创建一个名为 `jolt-spec.json` 的文件,内容如下: ```json [ { "operation": "shift", "spec": { "name": "firstName", "age": "age" } } ] ``` 这个规则将把输入 JSON 中的 "name" 字段映射到输出 JSON 的 "firstName" 字段,将 "age" 字段映射到输出 JSON 的 "age" 字段。 3. 创建 Jolt 转换类:在你的 Spring Boot 项目中创建一个类,用于加载和应用 Jolt 转换规则。例如,创建一个名为 `JoltTransformer.java` 的类: ```java import com.bazaarvoice.jolt.Chainr; import com.bazaarvoice.jolt.JsonUtils; import java.util.List; public class JoltTransformer { private Chainr chainr; public JoltTransformer() { List<Object> specs = JsonUtils.classpathToList("/jolt-spec.json"); chainr = Chainr.fromSpec(specs); } public Object transform(Object input) { return chainr.transform(input); } } ``` 这个类加载了之前定义的 Jolt 转换规则,并提供了一个 `transform` 方法用于应用规则。 4. 使用 Jolt 转换:在你的 Spring Boot 项目中,使用 JoltTransformer 类来进行 JSON 数据转换。例如,创建一个名为 `JoltController.java` 的控制器类: ```java import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class JoltController { private JoltTransformer joltTransformer; public JoltController(JoltTransformer joltTransformer) { this.joltTransformer = joltTransformer; } @PostMapping("/transform") public Object transformJson(@RequestBody Object input) { return joltTransformer.transform(input); } } ``` 这个控制器类使用JoltTransformer 类进行 JSON 数据转换。当 POST 请求发送到 "/transform" 路径时,它会将请求体中的 JSON 数据应用 Jolt 转换规则,并返回转换后的结果。 5. 运行应用程序:启动你的 Spring Boot 应用程序,并访问 "/transform" 路径进行测试。你可以通过发送 JSON 数据的 POST 请求来测试转换功能。 以上是整合 Spring Boot 和 Jolt 的基本步骤,你可以根据自己的需求进行进一步的扩展和定制。希望对你有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值