(OpenText Cordys)PaaS平台多租户共享外部WebService解决方案(草稿)

2016-11-19

  依托多年来在企业管理支撑服务和流程平台规划、实施的积累和沉淀,帮助客户建立高起点的基于业务流程的管理支撑服务平台。系统是在BPM产品的基础上,基于PaaS架构,为企业提供流程再造、流程优化支撑服务;提供企业管理基础应用,例如业务流程、OA、综合信息等。

  按规划,平台将为其他业务系统提供流程服务。下面具体介绍为房产土地系统提供流程服务接口的经验。

  首先,如下图所示了解本系统多租户管理方案,多租户是按多组织模式设置,组织间通过接口人衔接跨组织管理流程(注:也提供垂直管理流程)。

这里写图片描述

  接着,简单介绍房产土地接口需求:

  • 审批流程一般在(省公司、地市分公司)组织内流转;
  • 有跨组织流程;
  • 起草审批单时,需要从房产土地系统提取基础信息;
  • 审批过程中,需要从房产土地系统提取关键决策信息;
  • 审批结果及表单录入内容返回房产土地系统。

这里写图片描述

  在实施过程中,遇到些JavaEE SOA接口技术问题,在平台侧应对措施及解决方案如下所述,简单点说就是为了方便管理,减少工作量,采用共享外部接口方式。

方案一,直接使用外部WebService

  这是首次使用方案,参照房产土地系统迁移前的技术方案,通过JS直接调用挂在UDDI Container下的Webservice。

  在System租户下,以UDDI模式提供外部WebService

这里写图片描述

  外部房产系统的WebService配置详见“External Services Configuration”界面。

这里写图片描述

  为Webservice配置“anonymous”权限。

这里写图片描述

  方案一所用到的JavaScript代码片段。

function sendCordysRequestNew(pageNum, pageSiz) {
    return $.cordys.utils.sendCordysAjax({
        method: "queryHouseAddrs",
        namespace: "http://common.cxf.componets.app.cuc.com/",
        parameters: {
             house_range: {
                '@xmlns':'',
                text:$.trim($('#mysel').val())
            },
            query_addr: {
                '@xmlns':'',
                text:$.trim($('#query_addr').val())
            },
            page_num:{
                '@xmlns':'',
                text:pageNum
            },
            page_size:{
                '@xmlns':'',
                text:pageSiz
            },
            org_id:{
                '@xmlns':'',
                text:orgId
            }
        }
    }).done(function (res) {
    var responseStr = res.return.text;
        responseStr = responseStr.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/\s/g, '');
        var hosueAddrs = $(responseStr);
        contractsNum = $($(hosueAddrs)[0]).find("totalnum").text();
        contracts = [];
        $.each(hosueAddrs, function (index, ele) {
            var obj = new Object;
            obj.house_id = $($(hosueAddrs)[index]).find("house_id").text();
            obj.full_addr = $($(hosueAddrs)[index]).find("full_addr").text();
            obj.house_range = $($(hosueAddrs)[index]).find("house_range").text();
         //......
                obj.xulie_num = index+1;
            contracts.push(obj);
        }); 
    }).fail(function () {
        layer.alert("标准地址查询失败,请重试!",{icon: 2});
    });
}

  普通用户跨租户访问UDDI Container所挂接的外部Web service时,也就是从其他租户访问System租户(ORG),报如下错误:

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP:Header xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
        <header xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://schemas.cordys.com/General/1.0/">
            <msg-id>378014d8-c6d3-11e6-f0a3-2f6583ab5fbd</msg-id>
        </header>
    </SOAP:Header>
    <SOAP:Body>
        <SOAP:Fault>
            <faultcode xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/">ns0:Client</faultcode>
            <faultstring xml:lang="en-US">Access is denied for the Web service operation 'getBudget'.</faultstring>
            <faultactor>http://com.cuc.app.ws.getbudget</faultactor>
            <detail>
                <cordys:FaultDetails xmlns:cordys="http://schemas.cordys.com/General/1.0/">
                    <cordys:LocalizableMessage xmlns:cordys="http://schemas.cordys.com/General/1.0/">
                        <cordys:MessageCode xmlns:cordys="http://schemas.cordys.com/General/1.0/">Cordys.ESBServer.Messages.accessDeniedOnMethod</cordys:MessageCode>
                        <cordys:Insertion xmlns:cordys="http://schemas.cordys.com/General/1.0/">getBudget</cordys:Insertion>
                    </cordys:LocalizableMessage>
                </cordys:FaultDetails>
            </detail>
        </SOAP:Fault>
    </SOAP:Body>
</SOAP:Envelope>

  而具有开发者权限的用户,就可以访问。

  创建用户角色,并从开发环境带到生产环境(角色需要手工建,ISVP包带不过去),试试如下步骤:

  • 在组织中创建角色,例如:HouseOrgRole;
  • 为此角色HouseOrgRole设置外部Webservice配置证书;
  • 授权角色给用户;
  • 授权HouseISVPRole(此角色能调用外部Webservice)给用户。

这里写图片描述

方案二,改进方案,统一管理外部接口Webservice

  外部服务接口就是对所有外部服务进行一次接口封装,在System下部署、管理此接口包。

Created with Raphaël 2.1.0应用应用外部接口日志服务外部接口日志服务(UDDI)外部服务(UDDI)外部服务数据库数据库1.调Webservice2.调用外部服务2.1.返回3.记录调用服务及时间等信息4.记录调用结果5.返回结果

  接口日志数据项目

数据项目 类型 说明
服务名称 字符串 平台所使用服务名称
外部服务名称 字符串 外包接口服务(UDDI所挂接服务)
调用参数 字符串 XML格式请求数据
调用时间 时间
调用租户 字符串
调用用户及组织 字符串 调用用户的DN
返回数据 字符串 XML格式返回数据

  建议直接记录SOAP请求内容。

  下面举例是房产系统所提供的,通过WSDL导入后的外部Webservice的soap请求。由于每个xml节点中有“xmlns”属性问题,系统平台不支持,暂时未解决。

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP:Body>
    <getBudget xmlns="http://budget.cxf.componets.app.cuc.com/">
      <org_id xmlns="">PARAMETER</org_id>
      <budget_year xmlns="">PARAMETER</budget_year>
      <pay_breed xmlns="">PARAMETER</pay_breed>
    </getBudget>
  </SOAP:Body>
</SOAP:Envelope>

方案三,通过多数据源方式

  新建房产土地的DB Metadata。

  移植JavaEE工程下的java代码,重新生产平台下Webservice,供接口业务使用。

附:封装sendCordysAjax代码如下:

sendCordysAjax: function (opts) {
                if (!opts.dataType)
                    opts.dataType = 'xml json';
                if (!opts.loginUrl)
                    opts.loginUrl = getProjectpath() + '/unicom/home/login.html';
                return $.cordys.ajax(opts).fail(function (res) {
                    if (!window.layer && !opts['hideAlert'] && res.responseText) {
                        console.log(res['responseJSON']['faultstring']['text']);
                        if (/[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/.test(res['responseJSON']['faultstring']['text']))
                            alert(res['responseJSON']['faultstring']['text']);
                        else if (/27017/.test(res.responseText))
                            alert('网络不给力,请重试!');
                    } else if (opts['hideAlert']) {
                        console.log(res['responseJSON']['faultstring']['text']);
                    } else {
                        console.log(res['responseJSON']['faultstring']['text']);
                        if (/[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/.test(res['responseJSON']['faultstring']['text']))
                            layer.alert(res['responseJSON']['faultstring']['text']);
                        else if (/27017/.test(res.responseText))
                            layer.alert('网络不给力,请重试', {icon: 2});
                    }
                });
            },


注明:本文章属于转载,仅供行业人员学习交流使用,文章版权属于原创作者,在此向原创者致敬,感谢原创作者为大家学习交流提供精品内容。

站方声明:IThao123是为广大互联网从业者免费提供学习交流的平台,如果侵犯了原创著作权,请联系站方删除,给你带来不便,深表歉意。

顶部