1. 功能介绍

    接口调用为Java端调用其他接口,一般包括本地调用、Tuxedo调用、EJB调用、WebService调用、Http调用等。

  2. 主要特性

    1. 封装通用的方法实现各类接口的调用。
    2. 本地调用方法,不需要构造对象直接执行,并能够提供通用灵活配置记录日志的功能。
    3. 所有接口调用的输入输出参数保持一致,都采用通用的IData和IDataset,减少接口数据的转换。
  3. 开发步骤

    1. 生成配置文件。通过图形化配置工具配置页面流并生成配置文件,也可以手工编写页面流配置文件。
    2. 根据配置文件中配置的每个页面流步骤,编写对应的页面类和页面模板。
    3. 若需要在页面流的操作按钮中实现自定义的逻辑(JavaScript、Java逻辑),绑定页面流步骤页面的上一步、下一步按钮。
    4. 调试页面流,通过url或者reidrectTo,redirectToNav方法打开页面流,页面名称:component.flow.pageflow.FlowFrame、方法名称:init、参数:&FLOW_FILE=demo/Demo.xml
  4. 方法说明

    类路径 com.linkage.appframework.mwji.LocalInvoke
    类描述 本地逻辑调用基类
    方法名称 public LocalInvoke(PageData pd, logicPath, logPath)
    方法描述 本地逻辑调用构造函数,传入要执行的类路径,以及日志记录逻辑的路径,类和方法通过@分隔,如:com.linkage.echannel.bean.CommonBean@createFavoriteMenu
    方法名称 public Object execute(IData param) throws Exception
    方法描述 传入人参,执行方法
    类路径 com.linkage.component.util.TuxedoHelper
    类描述 CallTuxedo工具类
    方法名称 public static IDataset callTuxSvc(PageData pd, String svcLogicName, IData params) throws Exception
    方法描述 调用服务,svcLoginName:服务名,params:入参
    方法名称 public static IDataset callTuxSvc(PageData pd, String svcLogicName, IDataset params) throws Exception
    方法描述 调用服务,svcLoginName:服务名,params:入参
    方法名称 public static IDataset callTuxSvc(PageData pd, Pagination page, String svcLogicName, IData params) throws Exception
    方法描述 调用服务,page:分页模型,svcLoginName:服务名,params:入参
    方法名称 public static IDataset callTuxSvc(PageData pd, Pagination page, String svcLogicName, IData params, boolean iscatch)
    方法描述 调用服务,page:分页模型,svcLoginName:服务名,params:入参,iscatch:是否根据返回的错误结果而抛出异常(默认是会抛出)
    类路径 com.linkage.component.util.WSHelper
    类描述 Call WebService工具类
    方法名称 public static Object callWSSvc(PageData pd, String svcLogicName, IData params) throws Exception
    方法描述 调用服务,svcLoginName:服务名,params:入参
    方法名称 public static Object callWSSvc(PageData pd, String svcLogicName, IDataset params) throws Exception
    方法描述 调用服务,svcLoginName:服务名,params:入参
    方法名称 public static Object callWSSvc(PageData pd, Pagination page, String svcLogicName, IData params) throws Exception
    方法描述 调用服务,page:分页模型,svcLoginName:服务名,params:入参
    方法名称 public static Object callWSSvc(PageData pd, Pagination page, String svcLogicName, IData params, boolean iscatch)
    方法描述 调用服务,page:分页模型,svcLoginName:服务名,params:入参,iscatch:是否根据返回的错误结果而抛出异常(默认是会抛出)
    类路径 com.linkage.component.util.HttpHelper
    类描述 Call Http工具类
    方法名称 public static Object callHttpSvc(PageData pd, String svcLogicName, IData params) throws Exception
    方法描述 调用服务,svcLoginName:服务名,params:入参
    方法名称 public static Object callHttpSvc(PageData pd, String svcLogicName, IDataset params) throws Exception
    方法描述 调用服务,svcLoginName:服务名,params:入参
    方法名称 public static Object callHttpSvc(PageData pd, Pagination page, String svcLogicName, IData params) throws Exception
    方法描述 调用服务,page:分页模型,svcLoginName:服务名,params:入参
    方法名称 public static Object callHttpSvc(PageData pd, Pagination page, String svcLogicName, IData params, boolean iscatch)
    方法描述 调用服务,page:分页模型,svcLoginName:服务名,params:入参,iscatch:是否根据返回的错误结果而抛出异常(默认是会抛出)
  5. 注意事项

    1. 本地逻辑调用的接口,能够提供通用灵活配置记录日志的功能,而且不需要构造类提供更灵活的调用方式,,如:
      IInvoke invoke = new LocalInvoke(bd, "com.linkage.echannel.bean.CommonBean@createFavoriteMenu", "com.linkage.echannel.bean.CommonBean@createQueryLog");
      return invoke.execute(param);
      说明:
      1. LocalInvoke构造函数参数2表示调用的查询逻辑,参数3表示调用的日志存储逻辑,其中,日志逻辑的数据来源于parma中,故日志的大类、小类以及定制字段要从parma传入
      2. @分隔类的路径和类的方法
      3. 接续逻辑,即日志逻辑必须要手工commit,如在createQueryLog逻辑最后加上pd.getDBConn().commit();
    2. 掉服务支持WTC|JOLT|JNI方式,通过在application.xml的tuxconn type="JNI|WTC|JOLT"方式配置,一般WTC用于上线运行,JNI方式为开发方式,不同的方式都需要对环境进行一定的配置才能支持,请参看相关的配置文档。
    3. 除本地逻辑调用外,其他服务调用方式在开发时可以指定默认服务名和默认服务地址(参看mwji.properties配置),若不指定或系统上线时,将统一通过名字服务表来配置服务名和服务地址。
    4. 若要发布接口给外系统使用,需参看接口发布相关配置,注:如果发布的接口是给基于WADE框架的应用使用,只需要把接口的服务名和服务地址配置在名字服务表中,其他系统通过接口名称到名字服务表中找到接口所在的服务器地址和物理服务名,这样接口的调用和发布可以基于统一的配置来实现。
  6. 接口调用返回错误编码问题

    1. 目前存在问题

      1. 对于提供给其他系统使用的接口,在错误编码上存在不一致性,比如客户资料不存在这个功能,内部系统的编码为:001,在一级Boss对应的编码为:1001,在电子渠道对应的为2001
      2. 每个系统中一般都定义了错误编码,输出的错误编码在系统内是一致的,但做为接口提供给外系统时可能编码不一致,而且不同的外系统需要多级编码,如一级BOSS
    2. 现在解决办法

      1. 如果内部系统编码和提供给外系统的编码需要不一致时,需要配置错误编码对应表,这样接口调用时会自动将系统定义的错误编码转换为对应的接口错误编码
        在TD_S_ERRITFCODE配置记录:
        SUBSYS_CODE
        (系统编码)
        IN_MODE_CODE
        (接入方式)
        APP_RSCODE
        (错误编码)
        ITF_RSCODE
        (接口错误编码)
        APP_RSINFO
        (错误信息)
        saleserv 6 0 0000:0(多级编码:号分隔) OK
        saleserv 6 001 2998:01(多级编码:号分隔) 客户资料不存在
        saleserv 5 001 1001 客户资料不存在
        说明:TD_S_ERRITFCODE以SUBSYS_CODE,INMODE_CODE,APP_RSCODE作为唯一性约束,也要包含0这种成功编码,如0对应0000:0
      2. 代码中抛出错误编码时,可以通过common.error方式,如:common.error("001", "客户资料不存在");//抛出错误编码
        说明:以前的common.error("错误编码:错误内容")还继续保留,但建议改为新的
    3. 需要注意的问题

      1. 目前提供的接口错误编码是按照接口文档提供的固定编码,这种编码需要改成系统内部编码,调用接口时由错误编码映射表自动转为接口错误编码,如果错误编码表映射不到的编码,还是会返回原编码,也就是说以前的编码不改也能正常使用,但还是建议统一改下,这样更灵活。
      2. 错误编码映射最好能够提供统一的Excel文档来管理,便于以后查问题。
      3. 如果不能通过common.error抛出错误编码,也可以直接给返回结果设置返回编码和返回信息,如:
        如果返回结果为IData,设置方式:
        data.put("X_RESULTCODE", "001");
        data.put("X_RESULTINFO", "客户资料不存在");
        如果返回结果为IDataset(只要设置第一行),设置方式:
        IData data = dataset.getData(0);
        data.put("X_RESULTCODE", "001");
        data.put("X_RESULTINFO", "客户资料不存在");
        说明:错误编码字段和错误信息只有X_RESULTCODE,X_RESULTINFO,以前的X_RSPCODE,X_RSPDESC等都不要加,接口调用时会自动转换
  7. 代码片段

    1. 本地逻辑调用示例

      //传入参数
      IData param = new DataMap();
      param.put("TEST1", "test1");
      param.put("TEST2", "test2");
      //调用本地方法,传入逻辑,传入记录日志
      IInvoke invoke = new LocalInvoke(bd,
      	"com.linkage.echannel.bean.CommonBean@createFavoriteMenu", 
      	"com.linkage.echannel.bean.CommonBean@createQueryLog");
      //执行方法
      return invoke.execute(param);
      
    2. Tuxedo服务调用示例

      //传入参数
      IData inparam = pd.getData();
      inparam.put("CALL_RULE_ID", "10");
      inparam.put("CALL_TYPE_NAME", "UsrChkBef");
      //调用tuxedo服务
      IDataset dataset = TuxedoHelper.callTuxSvc(pd, "QCS_RuleFlow", inparam);
      
    3. WebService服务调用示例

      //传入参数
      IData inparam = pd.getData();
      inparam.put("CALL_RULE_ID", "10");
      inparam.put("CALL_TYPE_NAME", "UsrChkBef");
      //调用webservice服务
      IDataset dataset = (IDataset) WSHelper.callWSSvc(pd, "WS_RuleFlow", inparam);
      
    4. HTTP服务调用示例

      //传入参数
      IData inparam = pd.getData();
      inparam.put("CALL_RULE_ID", "10");
      inparam.put("CALL_TYPE_NAME", "UsrChkBef");
      //调用http服务
      IDataset dataset = (IDataset) HttpHelper.callHttpSvc(pd, "WS_RuleFlow", inparam);
      
    说明:
    1. Tuxedo调用时,如果只有一条记录,要转成IData data = (IData) dataset.get(0),其他WS,HTTP调用需要直接强制转换为IData|IDatset类型
    2. 调用服务服务时,若无法看到服务调用相关日志,需要在日志配置(log4j.properties)中配置:
      log4j.logger.com.linkage.mwji=DEBUG,A1
      log4j.logger.com.linkage.wtrans=DEBUG,A1
    3. 接口调用时对应的服务端地址和路径在服务调用配置(mwji.properties)配置,若mwji.properties未设定usedefaultsvc=true,将通过名字服务表来配置服务端地址、端口、路径等
    4. 若需要做为服务提供者,可以参看配置文档中的接口发布配置(interface.xml),应用部署配置(web.xml)来发布服务
    5. 程序正式部署时,如果调用的是远端接口,需要在TD_M_NAMING中配置服务名以及服务地址