精彩的人生

好好工作,好好生活

BlogJava 首页 新随笔 联系 聚合 管理
  147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks

#

【2005-11-29 16:04】 【Daniel Rubio】 【TechTarget】

 

  在SOA的上下文中设计WebServices必须处理好一系列问题,包括可重用性和灵活性等。然而,一旦最初的设计是让独立的服务一起以集成的方式出现就会导致另一些需求的出现,其中大多数可以被业务过程执行语言(Business Process Execution Language ,BPEL)来处理。

  BPEL是由IBM、Microsoft和BEA在2003年共同发明的。但从诞生尹始,BPEL就得到了Web services标准的引导。现在,在OASIS的资助下已经升到了2.0版本,有超过35家公司正在参与规划未来标准的方向,它将成为处理Web services编排的标准。

  但如何通过BPEL来进行Web services编排呢?一些其它公司把它称为Web services工作流,意思是已经使用基础的Web services协议栈SOAP/WSDL/UDDI。让我们来谈这个问题之前先假设你被派去迁移一个信用卡应用系统并使用到Web services。

  由于自身的特性,我们的信用卡应用程序必须与第三方系统交互,并且在同样的过程中有成百的调用。她们基于同样的Web services,这样可以满足不同系统用户的要求。

  BPEL就是用来构建这些Web services决策链或工作流的。但是,在更深入探讨它的具体使用之前,你应该认识到一个重要事情或者说必备条件,即BPEL背后的价值:可重用性。

  为了尽可能多的构建基于Web services的业务过程并用BPEL把它们粘合到一起,必须使每个独立的服务都达到精确的平衡。使用粗粒度的Web services比使用BPEL创建不同决策链的整体目标更重要,因为它们可能是完整的业务过程。同样的,细粒度的服务不利于重用和构建BPEL工作流。

  这个过程本质上与面向对象的设计很类似,即一个对象需要完成足够的工作来证明它的存在才能不被认为是上层调用对象。你应该用同样的方式考虑Web service。Web service 的可重用性是SOA的一个主要原则,这自不必说,而在使用BPEL的时候这一点体现的更加明显。

  作为核心,BPEL用XML语法来表达Web service交互,而像声明变量、流控、事务和错误处理等其它事情你可以让另一种语言来负责编排协作。

  因为这样也隐含着Web servcies基本的SOAP/WSDL/UDDI方法,因此BPEL要求其自身环境能够执行这些命令,我们称之为BPEL引擎。

  现在,BPEL引擎存在着不同的成熟度和复杂性。当SOA领域的一些厂商用其它核心产品例如ESB来紧密集成他们的BPEL引擎时,其他人则在同样的领域创建单独的产品。

  为了牢固掌握BPEL,我们通过最中立和不侵权的方法,即一个叫做ActiveBPEL的开源Java BPEL引擎来看看下面的BPEL示例。

  ActiveBPEL是一个单独的BPEL引擎,可以在任何Java/J2EE应用服务器下以Web应用(WAR文件)的形式运转。由于ActiveBPEL属于开源产品,所以它与事实上的Java/J2EE开源Tomcat、Apache's Web services框架Axis以及流行的构建工具Ant紧密的结合在一起。

  这些特点使ActiveBPEL成为开发BPEL功能的优秀产品,因为它基于已经被熟知并已获得应用的技术。如果你的机器上还没有这些包,可以下载它们并按照基本安装命令进行安装。我们不会谈论配置问题,因为本文的目的是让你能更快的使用BPEL。

  让我们从高层审视ActiveBPEL编排的过程。你的银行系统需要执行一个信用卡应用过程,并根据一系列详细的决策链返回一个简单的"yes" or a "no"。这些决策链需要拿到贷款数额、某个律师的信用历史或支出地点,所有这一切都是通过调用单独的Web services来完成的。

  根据市场条件或银行政策,这个业务过程将很可能改变信用卡应用的验证方式。用上层Web services返回结果是相当不灵活的方法,因为它使得每次修改Web services之后都要继续修改业务逻辑。另一方面,让BPEL过程来编排应用逻辑会给我们带来两大好处。

  BPEL的XML语法授予我们一种指令级别,通过它可以改变应用的工作流而不必在现场业务逻辑之后再修改。这为我们以后在更复杂的工作流情况下重用某套核心Web services提供了方便。

  假设我们已经为我们的核心Web servcies完成了最后的设计。我们有两个Web services,它们组成了一个approver和一个assessor。初始分析显示这两个服务都能很容易地被其他信用演进过程重用。因此,现在来看BPEL的伪代码并看看为创建BPEL-XML语法我们需要做什么。

if (creditapplication < $10,000) {
        if (assessor returns "lowrisk")
                return "yes"
        else
                return approver response
}
else
        return approver response

  首先是检查信用卡应用的数额。如果它的量超过$10,000,我们就把输入的数据转交给approver Web service以获得一个响应。反之,如果数量在$10,000以下,我们就先调用assessor Web service,让它返回一个回答,如果响应是"lowrisk",那么应用程序立即被证实。否则我们就需要进一步调用approver Web service。

  这是一个很直接的业务过程,很明显的展示了BPEL的强大,达到了为我们的核心Web services编排不同调用场景的目的。现在,让我们来看看实际的BPEL-XML语法。

<?xml version="1.0" encoding="UTF-8"?>
<process name="loanApprovalProcess" suppressJoinFailure="yes"
targetNamespace="http://acme.com/loanprocessing"
xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:apns="http://tempuri.org/services/loanapprover"
xmlns:asns="http://tempuri.org/services/loanassessor"
xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:lns="http://loans.org/wsdl/loan-approval" xmlns:loandef="http://tempuri.org/services/loandefinitions"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <partnerLinks>
      <partnerLink myRole="approver" name="customer" partnerLinkType="lns:loanApprovalLinkType"/>
      <partnerLink name="approver" partnerLinkType="lns:loanApprovalLinkType" partnerRole="approver"/>
      <partnerLink name="assessor" partnerLinkType="lns:riskAssessmentLinkType" partnerRole="assessor"/>
   </partnerLinks>
   <variables>
      <variable messageType="loandef:creditInformationMessage" name="request"/>
      <variable messageType="asns:riskAssessmentMessage" name="riskAssessment"/>
      <variable messageType="apns:approvalMessage" name="approvalInfo"/>
      <variable messageType="loandef:loanRequestErrorMessage" name="error"/>
   </variables>
   <faultHandlers>
      <catch faultName="apns:loanProcessFault" faultVariable="error">
         <reply faultName="apns:loanProcessFault" operation="approve" partnerLink="customer"
       portType="apns:loanApprovalPT" variable="error"/>
      </catch>
   </faultHandlers>
   <flow>
      <links>
         <link name="receive-to-approval"/>
         <link name="receive-to-assess"/>
         <link name="approval-to-reply"/>
         <link name="assess-to-setMessage"/>
        <link name="assess-to-approval"/>
          <link name="setMessage-to-reply"/>
      </links>
      <receive createInstance="yes" name="receive1" operation="approve" partnerLink="customer"
      portType="apns:loanApprovalPT" variable="request">
         <source linkName="receive-to-approval" transitionCondition="bpws:getVariableData('request',
         'amount')>=10000"/>
         <source linkName="receive-to-assess" transitionCondition="bpws:getVariableData('request',
         'amount')<10000"/>
      </receive>
      <invoke inputVariable="request" name="invokeapprover" operation="approve"
      outputVariable="approvalInfo" partnerLink="approver"
     portType="apns:loanApprovalPT">
         <target linkName="receive-to-approval"/>
         <target linkName="assess-to-approval"/>
         <source linkName="approval-to-reply"/>
      </invoke>
      <invoke inputVariable="request" name="invokeAssessor" operation="check" outputVariable="riskAssessment"
     partnerLink="assessor"
     portType="asns:riskAssessmentPT">
         <target linkName="receive-to-assess"/>
         <source linkName="assess-to-setMessage" transitionCondition=
         "bpws:getVariableData('riskAssessment', 'risk')='low'"/>
         <source linkName="assess-to-approval" transitionCondition="bpws:getVariableData
        ('riskAssessment', 'risk')!='low'"/>
      </invoke>
      <reply name="reply" operation="approve" partnerLink="customer" portType="apns:loanApprovalPT"
      variable="approvalInfo">
         <target linkName="approval-to-reply"/>
         <target linkName="setMessage-to-reply"/>
      </reply>
      <assign name="assign">
         <target linkName="assess-to-setMessage"/>
         <source linkName="setMessage-to-reply"/>
         <copy>
            <from expression="'approved'"/>
            <to part="accept" variable="approvalInfo"/>
         </copy>
      </assign>
   </flow>
</process>

  注意BPEL的元素有<partnerLink>, <variable>, <faultHandler>, <flow>, >target>等等。继续讲解BPEL语法的含义超出了本问的范围,但如果你跟进的话你就能发现在伪代码中有同样的模式。还要注意到,很多BPEL过程是使用特殊的编辑器创建的,这样可以避免手写XML时的错误。

  在看过实际的BPEL过程后,你大概会问这跟实际的Web servcies的UPI或WSDL描述符有什么关系。在ActiveBPEL中,它需要你定义一个过程部署描述符(Process Deployment Descriptor)文件来告诉BPEL引擎你的过程。下面就是这个PDD文件。

<process location="bpel/loanapproval.bpel" name="bpelns:loanApprovalProcess"
xmlns="http://www.active-endpoints.com/schemas/deploy/pdd.xsd"
xmlns:bpelns="http://acme.com/loanprocessing"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing">
  <!-- Partner Link for inbound request from customer -->
  <partnerLinks>
    <partnerLink name="customer">
      <myRole allowedRoles="" binding="RPC" service="ApproveLoan"/>
    </partnerLink>
    <!-- Partner Link for outbound request to delegate approver -->
    <partnerLink name="approver">
      <partnerRole endpointReference="static">
 <wsa:EndpointReference xmlns:approver="http://tempuri.org/services/loanapprover">
   <wsa:Address>approver:anyURI</wsa:Address>
   <wsa:ServiceName PortName="SOAPPort">approver:LoanApprover</wsa:ServiceName>
 </wsa:EndpointReference>
      </partnerRole>
    </partnerLink>
    <!-- Partner Link for outbound request to risk assessment process -->
    <partnerLink name="assessor">
      <partnerRole endpointReference="static">
 <wsa:EndpointReference xmlns:assessor="http://tempuri.org/services/loanassessor">
   <wsa:Address>assessor:anyURI</wsa:Address>
   <wsa:ServiceName PortName="SOAPPort">assessor:LoanAssessor</wsa:ServiceName>
 </wsa:EndpointReference>
      </partnerRole>
    </partnerLink>
  </partnerLinks>
  <wsdlReferences>
    <wsdl location="project:/wsdl/loandefinitions.wsdl"
    namespace="http://tempuri.org/services/loandefinitions"/>
    <wsdl location="project:/wsdl/loanapproval.wsdl"
    namespace="http://loans.org/wsdl/loan-approval"/>
    <wsdl location="project:/wsdl/loanapprover.wsdl"
    namespace="http://tempuri.org/services/loanapprover"/>
    <wsdl location="project:/wsdl/loanassessor.wsdl"
   namespace="http://tempuri.org/services/loanassessor"/>
  </wsdlReferences>
</process>

  注意这个描述符是如何与刚才的BPEL过程协作的。它声明了<process location="bpel/loanapproval.bpel">来为每个<partnerLink>定义物理地址,并声明了多个WSDL描述符。

  重要的是,这个文件与我们的Web services一起绑定到BPEL过程。通过上面的讲解,你应该能意识到Web services WSDL文件组成了任何BPEL过程的主体。

  前面的因为WSDL定义了一个Web service的方法、消息和特征。而一个BPEL过程则通过它的引擎使得丰富的使用信息被包含在这些标准Web services文件中,以此来编排需要的业务过程。

  本文通过ActiveBPEL让大家了解BPEL。如果你已经看过Loan Approval Application for ActiveBPEL 并知道它的内部工作方式,那么现在就能体会到BPEL对给你的Web services和SOA开发所带来的价值。


posted @ 2006-04-25 11:26 hopeshared 阅读(1109) | 评论 (1)编辑 收藏

Q:什么是 BPEL?
A: BPEL是一门用于自动化业务流程的形式规约语言。 用XML文档写入BPEL中的流程能在Web 服务之间以标准化的交互方式得到精心组织。这些流程能够在任何一个符合BPEL规范的平台或产品上执行。 所以,通过允许顾客们在各种各样的创作工具和执行平台之间移动这些流程,BPEL使得他们保护了他们在流程自动化上的投资。尽管以前想使业务流程定义标准化,但BPEL已经引起了史无前例的兴趣,而且它最早在软件供应商中获得大量认可。

Q: BPEL、WSBPEL和 BPEL4WS之间的区别是什么?
A: 除了历史参考文献不同外,没有什么其他的不同。这些名字都涉及到相同的未决标准。“BPEL4WS”是起初规范的名字,它由BEA、IBM和Microsoft编写和公布的。“WSBPEL”目前是规范和未决标准的名称。当这个规范提交到OASIS时,出于Web服务相关标准的努力,按照OASIS命名方案更换了这个名字。尽管如此,大部分团体仍然简单地称这个标准为“BPEL”。

Q: 什么是 BPELJ?
A: BPELJ 是BPEL和Java 语言的组合,它允许一起运用这两种编程语言来构建完整的业务流程应用程序。通过允许BPEL和Java一起工作, BPELJ使得每种语言可以做它最擅长的事。BPELJ优于BPEL,但没有它那么有竞争力。

Q:如何把BPELJ和 BPEL联系起来,它们之间区别在哪里?
A: BPEL基本上向编程发展,它支持业务处理流程的逻辑。这些业务处理流程是独立的应用程序,这些应用使用Web服务作为实现业务功能的活动。BPEL 不会成为一门通用的编程语言。然而,有人认为BPEL将和用来实现业务功能的其他语言(少部分的编程)结合起来。为了方便BPEL和Java 结合起来,BPELJ对BPEL做了一些小的改动并且做了一些扩展。

Q: BPEL不是针对业务分析员吗? 如果是,为什么把Java加进来?
A: 有这么一个普遍的误解,那就是BPEL想达到非程序设计人员或者所谓的“业务分析员”也能使用的程度。这个错误的概念部分根源于市场上许多针对于这组用户的业务流程管理工具这样的一个事实。无可置疑,工具供应商为构建BPEL和BPELJ流程提供了广泛的可视化接口,但是语言本身的目的是为了开发人员。

Q: BPELJ如何工作?
A: 通过允许在BPEL流程定义中包含Java代码段(称为Java片断),BPELJ使得Java 和BPEL能够相互协作。

Q: 难道不应该考虑允许使用任何语言(C#、JavaScript和Java等)来设计代码片断吗?
A: 这个片断背后想法是有代表性,我们希望它能用于许多不同的语言。然而,要集成BPEL和一门特定的语言包含的不仅仅是用XML包装目标语言。集成变量绑定、事务管理、调用路径等问题必须周全地定义,然而,每种语言是用不同的方法解决这些问题,对所有语言进行统一的绑定是不现实的。所以, BPELJ集中解决 BPEL 和 Java的这些集成问题。我们期待着解决其他的语言的集成问题 。

Q: 难道BPELJ 没违反“ BPEL中活动是Web服务,数据是XML,数据结构用XML架构描述”这一原则吗?
A: 并不是世界上所有的服务都是Web服务,它们也不应该是。用J2EE更适合紧密耦合的系统,在这种系统中,容器提供的功能如安全和事务是特别有价值的。那些把业务逻辑部署成J2EE组件的人员应该能够在业务流程中充分利用这些组件,BPEL是描述这个过程最好的一门语言。
一些人争论说在程序片断中用Java来完成少量计算和数据操作非常合适,但是应该通过XML/Web服务视图强制所有服务调用。这是一个特别站不住脚的观点。如果您有一个用Java代码片断写的流程,很明显,有一个Java开发人员参与创建这个流程。
这意味着您可能有下面的设想:有一个开发人员熟悉用Java调用组件,他想用Java操纵组件的输入和输出。迫使那个人把所有的调用看成好像是调用Web 服务一样,这会产生一层混乱,阻止考虑业务逻辑。


原文地址:http://dev2dev.bea.com.cn/techdoc/2004120205.html


尽管我知道了bpel的理论,但是仍然觉得写一个bpel挺麻烦的。尽管有一些图形化的编辑工具,但是仍然觉得并不好用,可能是我对bpel还是不熟悉的缘故吧

但是,我可以写一个jave类,在这个类中用各个方法描述出了各个web service的组合调用关系。现在我要做的,就是找一个bpel编辑器和一个bpel服务器来将这个java类的逻辑变成bpel,然后运行之

为什么没有人将这个步骤作成自动化的呢???是因为没有必要还是因为别的什么??

posted @ 2006-04-25 11:05 hopeshared 阅读(444) | 评论 (1)编辑 收藏

本文介绍如何发布一个BPEL到一个ActiveBPEL引擎。

 


要发布一个BPEL process,你必须创建,安装一个发布文件来包含你的BPEL文件。一般使用jar。

发布你的BPEL Process

发布一个BPEL process 调用创建一个发布文件。(一个jar但是使用.bpr为后缀)并且拷贝到你的servlet容器中。要创建这个文件,你必须把你的文件用特殊的目录结构组织起来,创建一个或者2个配置文件。

首先创建一个文件夹,这个例子中我们命名为mybpel.创建以下子文件夹:

  • bpel
  • META-INF
  • wsdl
  • partners (可选)
    ActiveBPEL 用到的文件格式可以在我们的另外的文章中有详细说明。作为一个例子,我们假设你有一个BPEL为:my_process.bpel和两个WSDL 文件:service1.wsdl和service2.wsdl.
    你的文件结构应该是:

    partners文件夹只有你有.pdef文件才需要。

    使用这个文件结构,创建一个jar文件,然后拷贝到servlet容器中。使用下面的命令:

    Windows:

    C:\> cd mybpel
    C:\mybpel> jar cf mybpel.bpr *.pdd META-INF bpel partners wsdl
    C:\mybpel> copy mybpel.bpr $CATALINA_HOME/bpr

    Unix:

    % cd mybpel
    % jar cf mybpel.bpr *.pdd META-INF bpel partners wsdl
    % cp mybpel.bpr $CATALINA_HOME/bpr
    你的WSDL文件可以是远程的,但是要写到.pdd中。
    如果现在引擎在运行,它马上会发现新的.bpr文件然后自动读取它。你的BPEL process就可以使用了。
     
  • 原文地址:http://robertpi.blogchina.com/422342.html
    posted @ 2006-04-25 10:18 hopeshared 阅读(1036) | 评论 (0)编辑 收藏

    本文描述如何安装ActiveBPEL引擎.

     


    1.要求:

    ActiveBPEL引擎需要一个servlet容器。安装脚本使用了CATALINA_HOME环境变量。另外它可以在任何标准servlet容器下运行。

    2.安装:
    运行安装脚本文件:install.bat(Windows)或者是install.sh(Unix).它把需要的lib拷贝到CATALINA_HOME/shared/lib下,并且创建一个$CATALINA_HOME/bpr,这个目录是放置.bpr文件的地方。

    修改引擎配置文件:
    服务启动时候包含一下参数,他们放在aeEngineConfig.xml文件中,你可以在$CATALINA_HOME/bpr找到它。你可以通过http://localhost:8080/BpelAdmin/config.jsp 修改。

    3.发布:

    参看专门的文章:发布BPEL。
    一旦引擎启动,在你发布你的BPEL后,引擎会知道读取对应的.bpr文件。

    4.启动引擎:

    要启动引擎,启动你的servlet引擎即可,对于Tomcat:

    Windows:

    C:\activebpel> %CATALINA_HOME%\bin\startup.bat

    Unix:

    activebpel% $CATALINA_HOME/bin/startup.sh

    5.引擎状态信息:
    当servlet引擎运行的时候,有两个web页面可以查看当前的服务的信息:Axis web服务列表,和ActiveBPEL引擎管理页面。

    Axis web服务列表
    这个页面在http://localhost:8080/active-bpel/services 是Axis生成的。它列出了现有的服务。这是和本引擎独立的。引擎只是把web服务交给Axis去发布。详细知识请看我的Axis的相关文章。

    ActiveBPEL 引擎管理
    页面在:http://localhost:8080/BpelAdmin/ 在这个页面中,你可以修改一下配置参数,还有在线帮助。可以看到发布的BEPL的一些信息。
    点击Deployed Processes可以查看已经发布的BPEL列表。
    点击Active Processes查看激活的BPEL.
    点击Receive Queue查看Receive Queue.

    Debug

    日志在$CATALINA_HOME/logs 你可以查看。


    原文地址:http://robertpi.blogchina.com/421320.html

    posted @ 2006-04-25 10:18 hopeshared 阅读(686) | 评论 (0)编辑 收藏

    做了几个web service之后,就需要做服务的集成

    eclipse上有一个SOA的项目,但是还没有第一个版本出来,尽管用cvs连上了服务器得到了源代码,可以握还是不会运行,呵呵,可能是我比较笨

    机器上RSA和WAS都有了,但是还是不能开发BPEL,查了下资料,似乎可以用WSAD来创建BPEL,也可以用Rational XSD来从UML导出BPEL,然后在WPS中运行BPEL

    等我的机器装上上面的装备,估计就动不了了,于是我四处寻找更简单的开发BPEL的方式

    接下来就找到了Oracle的JDeveloper,这个工具看起来还挺清爽,但是可惜还是不能创建BPEL,原来它需要Oracle的BPEL编辑器插件。接着在Oracle的站点上找到了这个工具,却发现它居然也有Eclipse的插件,于是安装了一个Eclipse插件。

    这个BPEL编辑器运行的效果看起来还不错,但是只能编辑BPEL,运行的时候还需要装Oracle的BPEL Server, omg,我发现自己又差点上了“贼船”,这么装下去估计我还要把Oracle他们家的所有软件都装一遍,于是放弃,继续寻找

    最后不知道在哪里看到了这个链接: http://www.eclipse.org/bpel,这个链接挺眼生 ,没去过,这不,一上去就发现了新大陆

    从这个项目的介绍上看跟Oracle的BPEL编辑器能力差不多,不知道是否能运行BPEL。假如不行的话,还有STP的B2J项目可以运行BPEL

    看来还是有很多人致力于服务集成的,呵呵
    posted @ 2006-04-24 14:19 hopeshared 阅读(5540) | 评论 (2)编辑 收藏

    仅列出标题
    共30页: First 上一页 10 11 12 13 14 15 16 17 18 下一页 Last