中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> Bea专区 > WebLogic Integration
WLI81中调用Process的方法总结
作者:梁医 时间:2005-09-26 10:29 出处:互连网 责编:小渔
              摘要:在WLI81中,一个Process(*.JPD) 可以生成WSDL文件,Process Control,Service Broker Control。所以客户端可以有多种方式调用该JPD。在WLI81中客户端可以通过下面这么多种方法调用一个JPD。

WLI81中,一个Process(*.JPD) 可以生成WSDL文件,Process ControlService Broker Control。所以客户端可以有多种方式调用该JPD。在WLI81中客户端可以通过下面这么多种方法调用一个JPD

Ø       通过WLI81提供的JAVA API直接调用该JPD

Ø       JPD转化为一个WebService进行调用

Ø       JPD转化为一个Process Control,进行调用

Ø       JPD转化为一个Service Broker Control进行调用

Ø       通过HTTP ,HTTPS式直接访问该JPD所对应的URL进行调用

Ø       WLI81SP2中可以通过JAVA PROXY方式调用一个JPD

以上每种方式都有其自己的特点以及一定的适用范围,下面分别说明。

1.       通过WLI81提供的JAVA API直接调用该JPD

可以通过调用EJB: RemoteWorklistManagerBean startProcess()方法启动一个Process.如下所示:

try

        {

               String str=”test the demo”;

                String s=rwmb.startProcess("/demo/newOrder.jpd","clientRequest", str);

        }

        catch(Exception e)

        {

            e.printStackTrace();   

        }

采用这种方式,执行该段代码的用户必须属于Administrator 组。可以在JSPJAVA客户端或PAGE FLOW中采用该方式直接调用JPD,这种方式比较简单直接。

2.       JPD转化为一个Web Service进行调用

Workshop中可以为一个JPD生成一个WSDL文件,然后客户端就可以以调用Web Service的方式调用该JPD。可以在支持Web Service的客户端中采用这种方式调用JPD。如在.NET平台上调用WLI81上的JPD就可以采用这种方式。

3.       JPD转化为一个Process Control,进行调用

可以通过把JPD转化为Process Control,然后调用Process ControlclientRequest()方法调用一个JPD。如在Workshop开发环境中。可以通过下面的方法在一个JSP中以Process Control的方式调用一个JPD

在一个jspsource view中,将要在该JSP中调用的Process Control拖入该jsp,然后可以通过pageContext得到Control的实例:调用该Process ControlclientRequest()启动该Process.

<%@ page language="java" contentType="text/html;charset=UTF-8"%>

<%@ taglib uri="netui-tags-databinding.tld" prefix="netui-data"%>

<%@ taglib uri="netui-tags-html.tld" prefix="netui"%>

<%@ taglib uri="netui-tags-template.tld" prefix="netui-template"%>

<netui-data:declareControl type="process.demo.approveControl" controlId="approveControl"></netui-data:declareControl>

<%

approveControl ac=(lapproveControl)pageContext.getAttribute("approveControl");

    ac. clientRequest (applyid);

%>

调用该JPD的客户端必须与该JPD位于同一个WLI Domain中。它允许一个工作流(JPD),Web ServiceJWS)或pageflowJPF)向一个工作流(Target JPD)发出调用请求,同时也可以接收Target JPDCallbackProcess Control通常用于父流程调用子流程,事务上下文通过Process Control从父流程传递到子流程中,即Target JPDclient处于同一个事务中。

4.       把该JPD转化为一个Service Broker Control进行调用

Service Broker,从名字就可以知道它实现了对服务调用请求消息的代理功能。换而言之,服务代理接收服务调用请求消息,然后过滤服务调用请求消息,最后根据服务调用请求消息调用相应的服务。Service Broker一般用于:

Ø       通过参数实现动态服务调用

Ø       在流程中实现子流程调用

Ø       实现企业间的应用集成

以下通过一个例子说明Service Broker Control的使用,场景为Process A通过Service Broker Control调用Process B,二者位于不同的两个Domain中。由于Serivce Broker Control是一个Dymamic Control,可以在WliConsole中设置Selector来实现依照输入参数选择调用不同的JPD,从而实现对于Target JPD的动态调用。

                    

1.         生成Target JPDWSDL文件

自动生成的WSDL文件中location部分默认标明localhost,为了在Client端可以找到Target JPD,需要将其中URL部分中的localhost更换为本机ip或机器名。

… …

  <service name="paticipant">

    <port name="paticipantSoap" binding="s0:paticipantSoap">

      <soap:address location="http://CAITAO:7001/SBprocess/processes/paticipant.jpd"/>

    </port>

  </service>

… …

2.         Client端的Applicationimport Target JPDWSDL文件

3.         基于上述WSDL文件产生一个Service Broker ControlProcess A即通过此Service Broker Control来调用Process B

4.         Service Broker Control在生成时需要设置一个Xquery,可以实现对clientRequest参数的抽取,从而依照用户输入参数调用不同的Target JPD(这一点在后面的Dynamic Selector会提及)。

5.         生成的Service Broker Control有一个defaultHttp-url,说明默认的Service Broker Control调用此Url标识的Target JPD

Process A中只要调用配置好的Service Broker Control,即可调用http-url中指定的JPD资源。

6.         Service Broker是一个Dynamic Control,可以通过wliconsole来设置selector,达到依照用户输入来分发请求到不同的Target JPD的目的。具体实施如下:

²        屏蔽defaultHttp-Url,即在Service Broker ControlProperty Editor中消去默认的Http-url。这一点非常重要,因为默认的http-url中指定的JPD资源可以屏蔽在wliconsoleDynamic Selector指定的资源。

²        进入wliconsole->Process Configuration->View Dynamic Controls,定位您当前需要设置Dynamic Selectorprocess

²        选择Add Selector来添加选择条件

例如筛选条件为:若Selector Value为‘liangyi’时,调用URI

http://10.130.2.139:7001/SBprocess/processes/paticipant.jpdTarget JPD,修改后显示如下:

经过上述设置,只有当clientRequest中的XmlDocument经过Xquery查询后的字段值为‘liangyi’(此例中字段为Customer_Name)时才会调用End Point表明的Target JPD,其他的请求不能调用此Target JPD

5.       通过HTTPHTTPS方式直接访问一个JPD所对应的URL进行调用

如上图所示,我们在WORKSHOP中开发测试JPD的时候,从WORKSHOP的测试页面中的”test soap”页,可以看到SOAP格式的Service Client RequestService Response。所以我们可以拼一个SOAP格式的字符串,并通过HTTP  POST方式调用该JPD。并且可以取到调用的JPD的处理结果,如下所示。

StringBuffer soapRequest = (new StringBuffer()).append("<SOAP-ENV:Envelope xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" ");

       soapRequest.append("xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ");

       soapRequest.append("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><SOAP-ENV:Body>");

       soapRequest.append("<t xmlns=\"http://www.openuri.org/\">\r\n");

       soapRequest.append("<s>kkk</s>");

    soapRequest.append("</t>");

       soapRequest.append("\r\n</SOAP-ENV:Body></SOAP-ENV:Envelope>\r\n");

       URL url = new URL("http://localhost:7001/wlidemo/demo.jpd ");

       URLConnection uc = url.openConnection();

       uc.setDoInput(true);

       uc.setDoOutput(true);

       uc.setRequestProperty("Content-Type", "text/xml");

       PrintWriter post = new PrintWriter(new OutputStreamWriter(uc.getOutputStream()),true);

       post.println(soapRequest);

       InputStreamReader isr = new InputStreamReader(uc.getInputStream());

       char[] resultBytes = new char[1024];

       int rcount = isr.read(resultBytes, 0, 1024);

       StringBuffer soapResponse = new StringBuffer();

       while(rcount!=-1)

       {

              soapResponse = soapResponse.append(resultBytes, 0 , rcount);

              rcount = isr.read(resultBytes, 0, 1024);

       }

只要是支持HTTPHTTPS的客户端都可以通过该方式调用JPD。如可以在CC++环境中通过该方式调用一个JPD

6.       通过JPD Proxy方式进行调用

该方式WLI81SP2中提供,WLI81SP1中支持不完善。可以实现非Workshop J2EE客户端或独立java客户端调用WLI81上的JPDJava Proxy是为任何普通Java Client端与JPD通信设计的。通过JPD Proxy的调用是Java RMI调用,当Client端通过JPD Proxy调用工作流时,其事务上下文将通过JPD Proxy传递给Target JPD,即Target JPDClient端处于同一个事务中。示例实施步骤:

²        Workshop中运行需要调用Target JPD,得到Target JPDJPD Proxyjar文件)

 

²        将上述jar文件引入client端所在的工程,以供程序调用。示例中是在与Target JPD相同的Application中设计Java Client端,所以把jar包引入到ApplicationAPP-INFlib中即可。

²        Application中建立一个Java Project,编写Java Client

文本框: //Proxy classes are located in
            //the com.bea.wli.bpm.proxy package.
            import com.bea.wli.bpm.proxy.JpdProxy;
            import com.bea.wli.bpm.proxy.JpdProxySession;
            //import Target JPD
            import weblogic.wli.jpdproxy.process;
            import javax.naming.Context;
            import javax.naming.NamingException;
            import javax.naming.InitialContext;
            import weblogic.jndi.Environment;
            import java.io.*;
 

                                                                     

²        运行Java Client端,可以成功调用Target JPD

需要特别说明的是:JPD Proxy调用方式虽然适用于所有的Java Client端,但是它有一个局限-JPD Proxy不能接收Target JPDCallback,即若Client使用JPD Proxy启动一个包含Client CallbackJPD,会在该流程尝试发出CallbackJPD Proxy时产生Runtime failure

 

 作者简介
梁医是(dev2dev ID: lymathly )BEA系统(中国)有限公司 TSG技术顾问
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有