第二节 开发新的业务功能

这个部分是后台业务逻辑的核心部分,所有的业务处理均在此处完成提供给第三方使用者,因此需要定义明确的输入与输出,所有的交互均为json格式报文,暂时不接受二进制文件处理。注意:所有的业务功能必须放在pthink-bu这个工程中,否则不会被应用服务器自动管理。

1、创建新BU

在pthink-bu的工程中创建一个新的Java Class,新的class必须继承com.pthink.cloudapp.standard.abstracts.Atom

2、根据设计要求编写输入与输出的定义注解

注解的内容

@Component(        
tradeCode = 业务交易功能号,必须保证唯一,以6位数字定义,我们把11开头的全部归为质量类系统
status = Component.Status.Run, 是否启用,可用的参数为Run, Stop
internal = 是否内部使用,truefalse,如果是true则不会被外部使用
tradeName = 业务交易功能名称,
author = 开发人员ID
comment = 业务交易功能详细说明
createDate = 创建日期,格式为"2016/08/22"
params = { 
@Parameter(classify = "查询", demo = "1001", 
inputs = { 
@Item(nullable = Item.Nullable.NO, id = "rq", name = "请求类型", type = Item.Type.INT, explain = "用户请求类型,默认1表示机器时间、2表示数据库时间、3表示查询一个结果集"), 
@Item(nullable = Item.Nullable.NO, id = "userid", name = "用户ID", type = Item.Type.STRING, explain = "用户ID"), 
@Item(nullable = Item.Nullable.YES, id = "username", name = "用户名称", type = Item.Type.STRING, explain = "用户名称"), 
@Item(nullable = Item.Nullable.YES, id = "userip", name = "用户IP", type = Item.Type.STRING, explain = "用户IP") }, 

outputs = { 
@Item(nullable = Item.Nullable.YES, id = "r01", name = "服务器时间", type = Item.Type.STRING, explain = "服务器时间"), 
@Item(nullable = Item.Nullable.YES, id = "r02", name = "用户IP", type = Item.Type.STRING, explain = "用户IP"), 
@Item(nullable = Item.Nullable.NO, id = "c", name = "返回码", type = Item.Type.STRING, explain = "返回码"), 
@Item(nullable = Item.Nullable.NO, id = "m", name = "说明", type = Item.Type.STRING, explain = "返回码说明") } 
), 
@Parameter(classify = "设置时间", demo = "1001", 
inputs = { 
@Item(nullable = Item.Nullable.YES, id = "usertime", name = "用户请求时间", type = Item.Type.STRING, explain = "用户请求时间"), 
@Item(nullable = Item.Nullable.YES, id = "userip", name = "用户IP", type = Item.Type.STRING, explain = "用户IP") }, 
outputs = { 
@Item(nullable = Item.Nullable.NO, id = "c", name = "返回码", type = Item.Type.STRING, explain = "返回码"), 
@Item(nullable = Item.Nullable.NO, id = "m", name = "说明", type = Item.Type.STRING, explain = "返回码说明") } )},
modified = {@Modified})

3、根据业务要求实现业务方法

方法名为atomicTransaction

boolean result = false;
String tradeCode = tradeInfo.tradeCode();
Logs.log().debug("Begin request, TradeCode[{}], clientIp=[{}]", tradeCode, tradeInfo.getConninfo().getRemoteIp());
try {    

tradeInfo.wrap2First(RFrame.entity);    //提取报文中entity部分的内容到顶层
int reqType = tradeInfo.getInt("rq");   //获取输入中rq的内容 
String userid = tradeInfo.getString("userid");    //获取输入中rq的内容
 String userName = tradeInfo.getString("username");    
String userIP = tradeInfo.getString("userip");    
if (Utility.isEmpty(userid)) {        //对输入字段进行数据校验,有错误则直接调用异常抛出
throw new RWarn(RWarn.MSG_99997, "userid不能为空");    
}    
if (Utility.isEmpty(reqType)) {        
throw new RWarn(RWarn.MSG_99997, "reqType不能为空");    
}    
//<outputs name=defaultout>    
tradeInfo.put("r02", userIP);    //构造输出字段
if (getResult(reqType, tradeInfo)) {        
tradeInfo.putReason(RWarn.MSG_00000, "调用成功");   //返回成功标志 
}    
//</outputs>    
result = true;
} catch (RWarn e) {   //异常处理 
throw e;
} catch (Exception e) {    
e.printStackTrace();    
//记录日志
Logs.log().error("Failure request, TradeCode[{}] , TradeName [{}], err=[{}]", tradeCode, tradeInfo.getAtomInfo().getTradeName(), e.getCause().getMessage());    
throw new RWarn(RWarn.MSG_90010, tradeCode, tradeInfo.getAtomInfo().getTradeName());
}
Logs.log().debug("Success TradeCode[{}]", tradeCode);
return result;

3、编译发布

操作步骤与数据库映射的编译发布雷同。区别只是工程名称和所在目录不同而已。

请注意 :

a ) 生成的pthink-bu.jar放入运行环境下覆盖同名文件,下次重启服务后就可以自动加载新的业务模块。

b ) 如果需要立刻生效并进行测试,可以直接将编译好的class放入unit目录下就可以实现热部署,不需要重启服务就能进行测试了。

c)如果只更新了class而没有更新jar,则下次应用服务器重启时会自动恢复jar文件内部的class。

4、编写测试报文范例

每一个业务功能开发完成后,需要把自己测试的接收报文与返回范例提取出来,放入resources/docs目录中,文件名必须是对应的"tradecode".txt,比如注解中声明的tradeCode =1000,则报文范例也必须是1000.txt

Copyright © www.pthink.com.cn 2016 all right reserved,powered by Gitbookmodified: 2016-08-30 13:25:12

results matching ""

    No results matching ""