这两天礼拜在测试额度中心单系统的几个交易,是通过dubbo直接调用服务的方式去访问,于是也学习了包括dubbo调用,复习了java基础等方面的知识,这篇文章做一个总结,把其中实现的关键点记录下来,以便以后工作需要。
1、dubbo一般是整合了spring框架的,因此要调用dubbo上的服务,必须准备好相关的jar包和配置文件。当然JDK1.8以上的开发环境也是必须的。
jar包:主要包括了dubbo和spring运行所需。列表如下:包括但不限于红框部分,有些需要根据项目要求来。
配置文件:主要是消费者配置文件,因为服务需要采用spring框架控制反转的形式去获取java bean对象。
主要配置要素包括:注册中心地址,应用服务器集群组名,以及各个接口的服务ID(group中配置的名称),前面的id可以自己命名
2、 先在eclipse中调通脚本,新建工程,注意目录存放方式:
新建resouce文件夹(在bulid path中配置成默认路径,脚本运行时会自动去读取),config里面存放bootstrap.properties文件,该文件可能没有作用,但是由于该程序运行需要加载,因此必须存在。dubbo-consumer.xml也存放在里面(如果是loadrunner里面,只要跟脚本路径一致即可)
3、程序代码结构:
package dubbo_test;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dap.api.IService;
import com.dap.param.ControlData;
import com.dap.param.StringInput;
import com.dap.param.StringOutput;
public class Dubbo_check_before_query {
private IService demoService1 = null;
private static ClassPathXmlApplicationContext context = null;
public int init() throws Throwable {
context = new ClassPathXmlApplicationContext("dubbo-consumer.xml"); //加载消费者配置文件
demoService1 = (IService)context.getBean("check_before_query"); //获取服务bean
//System.out.println(demoService1);
//demoService2 = (IService)context.getBean("scan_limit_recover");
return 0;
}//end of init
public int action() throws Throwable {
//报文头:这部分是公司统一规定的格式,任何通过dubbo调用的报文都指定了这部分的内容和格式
StringInput input = new StringInput();
String code = "";
String transSeqNo = "9A201901040004993885";
Map<String, Object> map = new HashMap<String, Object>();
ControlData ctrlData = new ControlData();
ctrlData.setTransSeqNo(transSeqNo);
ctrlData.setTransMedium("NM");
ctrlData.setUserId("UR000000907545");
ctrlData.setTransTeller("9995003");
ctrlData.setTransBranch("801000");
ctrlData.setSysIndicator("9A");
ctrlData.setReqTime(new Date());
ctrlData.setHostIp("127.0.0.1");
ctrlData.setBizTrackNo(transSeqNo);
ctrlData.setPageIndex(1);
ctrlData.setPageSize(0);
ctrlData.setServcId("AS_LCS_RST_CKBFSC"); //服务名为:AS_LCS_RST_CKBFSC
input.setCtrlData(ctrlData);
//根据报文的内容,构造报文体:该报文的json格式,并且使用map去构建的;不同的系统报文格式不一,构建方式要根据后台解析方式确定,这个需要跟对应的开发人员去确认。
map.put("tranam","0.13");
map.put("beanId","queryCKBFSC");
map.put("acctNo","6235401595722401874");
map.put("servcId","AS_LCS_RST_CKBFSC");
map.put("brchno","801000");
map.put("trantp","03");
map.put("servtp","NM");
map.put("dyflag","1");
map.put("custtp","11");
map.put("accttp","3");
map.put("limttp","23");
map.put("cardno","6235401595722401874");
map.put("prcsna","扫码支付扣减前检查");
map.put("risklv","01");
map.put("custid","UR100468920896");
map.put("rebktp","99");
map.put("limttp","23");
String[] ptp = {"02", "03"};
map.put("prodtp",ptp);
//入参:将构建的map对象转成json格式
input.setBody(JSON.toJSONString(map));
StringOutput result1 = (StringOutput) demoService1.handle(input); //发送报文,返回对象存在result1 中
String resultStr1 =JSON.toJSONString(result1); //将返回内容转换成json格式
//获取交易结果信息
code = resultStr1.substring(resultStr1.indexOf("message") - 11, resultStr1.indexOf("message") -3);
//返回不是0,就代表失败。
if(!code.equals("00000000")){
System.out.println("=====failed:" + resultStr1 + "=====");
return 0;
}else {
System.out.println("=====success:" + resultStr1 + "=====");
}
return 0;
}
public static void main(String[] args) throws Throwable {
//调试主方法
Dubbo_check_before_query dt = new Dubbo_check_before_query();
dt.init();
dt.action();
}
}
4、将上述脚本移植到LR12中:
(1)LR协议选择java user
(2)配置运行所需环境,包括jdk和jar包:
(3)根据LR测试脚本结构去移植代码,其实上述eclipse中的代码就是根据LR中的结构写的。唯一的区别就是,要在action中加入LR事务开始和结束的语句。