使用 BPEL 构建 Web 服务网络(二)

日期: 2007-12-13 作者:Yves Coene 来源:TechTarget中国

  为便于服务、一致性和消息转换的比较,ESA 要求使用 XSD 模式表示 XML 有效载荷。SSE 还要求使用主 XSLT 文档来确保表示层中的一致性。必须按如下所示在每个服务中导入模板样式表:

<xsl:stylesheet version="1.0" xmlns_xsl="http://www.w3.org/1999/XSL/Transform" xmlns_oi="http://www.esa.int/oi">
<!– Import statements –>
<xsl:import href="./SSE.xsl"/>
<!– Apply the template for the root element from SSE standard template –>
<xsl:template match="/">
<xsl:apply-imports/>
</xsl:template>

  xsl:apply-imports 使用从 SSE 样式表中导入的模板规则处理根节点。注册该服务时,服务提供商提供 XML 模式、WSDL 和 XSLT 文件的 URL。SSE 强制使用文档样式的 SOAP。该方法允许使用 XML 模式对输入服务和服务输出的数据进行详细的指定并验证传入和传出的消息。

  ESA 采用的方法为打算构建一个合作伙伴数量有限的 Web 服务网络的公司提供了一个便捷解决方案。随着网络规模的增长,将需要引入新的消息格式、通信规则、安全性以及传输机制。

  简化合作伙伴的参与。任何网络的壮大都离不开合作伙伴的轻松参与。下列因素将对此过程产生很大的影响。

  与集线器的集成 – 合作伙伴如何创建和提交他们的 Web 服务?集线器能否支持不同的传输协议?

  流程管理 – 不同合作伙伴流程之间是否有清晰的界限?合作伙伴能否修改它的业务流程而不影响整个网络的可靠性?能否使用元数据定义即时生成流程?

  SSE 通过降低对服务提供商的技术要求成功稳固了与其合作伙伴的联系。ESA 通过分发合作伙伴连接软件、划分开发平台以及自动代表合作伙伴生成流程流实现了该目标。

  例如,为加快集成流程的速度,ESA 分发了 SSE Toolbox,这是一个在 SSE 与服务提供商的现有系统间充当接口的免费工具包。基于 Sun Java Web Services Developer Pack 的 SSE Toolbox 提供了一个支持各种后端集成机制(如 FTP、文件交换、JDBC、调用 Java API、HTTP 等)的 XML 脚本语言。它还自动生成注册服务所需的 WSDL 文件。

  不同的合作伙伴将多个服务提供给中央信息库。开发和部署环境的划分使合作伙伴间的更改互不影响。SSE 通过在 Oracle BPEL 流程管理器中使用 BPEL 域有效地利用了划分功能。BPEL 域使开发人员或管理员能够将 Oracle BPEL 流程管理器的单个实例划分为多个虚拟 BPEL 沙箱。BPEL 域由一个 ID 标识,并由一个口令保护。当服务提供商在 SSE 上注册时,将调用 Oracle BPEL 流程管理器 API 自动创建一个 BPEL 域保存服务定义文件。

  以下是一个 createDomain 方法示例:

/**
* Create new domain space for a service provider to hold her/his services workflow
* definitions files in
     *
* @param domainName The Id to identify the domain
* @param password The password used to login to the corresponding domain
* @exception RemoteException System communication error
* @exception WorkflowException Thrown if any error happens on the server that prevent the delete
     *
     */
public void createDomain(String domainName, String password)
throws RemoteException, WorkflowException{
if(ml.isDebugEnabled()) ml.debug("Enter createDomain(domain = " + domainName + " password = " + password);
      /**
* check if the being created domain exist?
       */
     
try {
  Locator locator = new Locator(domainName, password);
  ml.info("Stop creating domain:" + domainName + " because it has already existed.");
  throw new WorkflowException("1019");
 
} catch (com.oracle.bpel.client.ServerException e) {
  ;
      }
try {
//obtain the domain admin password from the system configuration SSE.properties file
String domainAdminPassword = SystemConfigurationInfo.getProperty(WorkflowConstant.BPEL_DOMAIN_ADMIN_PASSWORD);
ServerAuth auth = ServerAuthFactory.authenticate( domainAdminPassword, "localhost" );
if(ml.isDebugEnabled()) ml.debug("obtain authentication ok");
// Create server object … this is our service interface
          //
Server server = new Server( auth );
// Domain id is "newDomain", the password is "myPassword"
if(ml.isDebugEnabled()) ml.debug("create server instance ok");
          //
    Map domainProperties = new HashMap();
    domainProperties.put( Configuration.DATASOURCE_JNDI, SystemConfigurationInfo.getProperty
(CommonConstant.DEFAULT_BPELDOMAIN_DS_JNDI));
    domainProperties.put( Configuration.TX_DATASOURCE_JNDI, SystemConfigurationInfo.getProperty
(CommonConstant.DEFAULT_BPELDOMAIN_DS_JNDI));
   
    if(ml.isDebugEnabled()) ml.debug("create domain – ds jndi property key/value:
" + Configuration.DATASOURCE_JNDI + "/" + SystemConfigurationInfo.getProperty
(CommonConstant.DEFAULT_BPELDOMAIN_DS_JNDI));             
    if(ml.isDebugEnabled()) ml.debug("create domain – tx_ds jndi property key/value:
" + Configuration.TX_DATASOURCE_JNDI + "/" + SystemConfigurationInfo.getProperty
(CommonConstant.DEFAULT_BPELDOMAIN_DS_JNDI));
server.createDomain(domainName, password, domainProperties);
             
         
  if(ml.isDebugEnabled()) ml.debug("Enter createDomain(domain = " + domainName + " password = " + password);

} catch( com.oracle.bpel.client.ServerException se ){
ml.error(se.getMessage());
if(ml.isDebugEnabled()) se.printStackTrace();
throw new WorkflowException("1018", se.getCause());
      }
    }
 
  在下面 runBuildScript 方法的实现中,通过一个 Ant 构建脚本访问 Oracle bpelc 函数。runBuildScript 方法调用一个 Ant 项目文件,后者随后调用 bpelc 编译和部署服务提供商的 BPEL 流程。

/**
* execute the ant script to build an Oracle BPEL process that implements the workflow.
* The script also deploys the workflow to the service domains.
* All input information is provided under the props at the input param.
* @param props Contain all necessary properties used to build/deploy the workflow BPEL process
* @throws WorkflowException
     */
private void runBuildScript(String buildFilename, Properties props) throws WorkflowException{
if(ml.isDebugEnabled())ml.debug("Enter runBuildScript(buildFileName = " + buildFilename +
", properties = …");
try {
Project project = new Project();
project.init();
File buildFile = new File(buildFilename);

if (!buildFile.exists()) throw new WorkflowException("1015");
if(ml.isDebugEnabled()) ml.debug("ant build file:" + buildFile.getAbsolutePath());

ProjectHelper.configureProject(project, buildFile);
//prepare logger for the project build
PrintStream out = System.out;
BuildLogger logger = new DefaultLogger();
logger.setMessageOutputLevel(Project.MSG_DEBUG);
logger.setOutputPrintStream(out);
logger.setErrorPrintStream(out);
project.addBuildListener(logger);

//set project properties
Enumeration keys = props.keys();
while(keys.hasMoreElements()){
String key = keys.nextElement().toString();
project.setProperty(key, props.getProperty(key));
           
          }
// test
//excute default target
project.executeTarget(project.getDefaultTarget());
    if(ml.isDebugEnabled())ml.debug("Exit runBuildScript(buildFileName = " + buildFilename +
      ", properties = …");
        }
catch (Exception ex) {
ml.error(ex.getMessage());
if(ml.isDebugEnabled()) ex.printStackTrace();
throw new WorkflowException("1002",ex.getCause());
        }
  }
 
  在 Web 服务网络设计中,应考虑使用 BPEL 域为所有相关各方划分流程设计和部署平台。以下是一些可能的应用:

  将单个 Oracle BPEL 流程管理器实例划分为多开发人员环境。这种情况下,域 ID 通常标识拥有该域的开发人员。

  将单个 Oracle BPEL 流程管理器实例划分为开发环境和 QA 环境。这种情况下,域 ID 可能为“test”和“QA”。

  将单个 Oracle BPEL 流程管理器实例划分为一个可以由多个部门或合作伙伴使用的环境。这些情况下,域 ID 是部门或合作伙伴的名称。

  创建中央服务信息库。定义了网络关系后,合作伙伴便可以免费加入并提供他们的服务。当然,发布和搜索这些服务的功能是 SOA 平台的一个基础功能。

  在该流程中,合作伙伴将他们的 Web 服务发布到一个中央信息库,有关该服务的所有信息都在这里进行管理。这个中央框架提高了服务的可重用性,最大限度地降低了定位服务所需的工作量和时间。没有中央信息库将导致不一致和混乱。这反过来会降低网络的灵活性和开放性。

 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • SAP收购CallidusCloud 与Salesforce竞争

    一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]

  • API设计如龙生九子 各不相同

    IT咨询管理公司CA Technologies对API产业做了个问卷调查,问卷内容涉及API设计风格以及管理部署的新动向。调查结果表明,JSON与XML可谓两分天下。

  • 保险公司如何能从BPEL中获益

    对于保险业整合不同系统是一件寻常的工作。但保险公司经常会面临监管条例改变和应对不同的顾客需求。为了解决这些系统问题,软件专家正在使用一种强大的工具——BPEL。

  • 从头开始实现领域驱动设计

    领域描述业务;它是驱动企业的概念和逻辑的集合。如果遵循领域驱动设计(DDD)这一本质,那么领域就是应用程序中最重要的组成部分。