在WLI81中,一个Process(*.JPD) 可以生成WSDL文件,Process Control,Service 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 组。可以在JSP,JAVA客户端或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 Control的clientRequest()方法调用一个JPD。如在Workshop开发环境中。可以通过下面的方法在一个JSP中以Process Control的方式调用一个JPD。
在一个jsp的source view中,将要在该JSP中调用的Process Control拖入该jsp,然后可以通过pageContext得到Control的实例:调用该Process Control的clientRequest()启动该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 Service(JWS)或pageflow(JPF)向一个工作流(Target JPD)发出调用请求,同时也可以接收Target JPD的Callback。Process Control通常用于父流程调用子流程,事务上下文通过Process Control从父流程传递到子流程中,即Target JPD与client处于同一个事务中。
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 JPD的WSDL文件
自动生成的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端的Application中import Target JPD的WSDL文件
3. 基于上述WSDL文件产生一个Service Broker Control,Process A即通过此Service Broker Control来调用Process B
4. Service Broker Control在生成时需要设置一个Xquery,可以实现对clientRequest参数的抽取,从而依照用户输入参数调用不同的Target JPD(这一点在后面的Dynamic Selector会提及)。
5. 生成的Service Broker Control有一个default的Http-url,说明默认的Service Broker Control调用此Url标识的Target JPD
Process A中只要调用配置好的Service Broker Control,即可调用http-url中指定的JPD资源。
6. Service Broker是一个Dynamic Control,可以通过wliconsole来设置selector,达到依照用户输入来分发请求到不同的Target JPD的目的。具体实施如下:
² 屏蔽default的Http-Url,即在Service Broker Control的Property Editor中消去默认的Http-url。这一点非常重要,因为默认的http-url中指定的JPD资源可以屏蔽在wliconsole中Dynamic Selector指定的资源。
² 进入wliconsole->Process Configuration->View Dynamic Controls,定位您当前需要设置Dynamic Selector的process
² 选择Add Selector来添加选择条件
例如筛选条件为:若Selector Value为‘liangyi’时,调用URI为
http://10.130.2.139:7001/SBprocess/processes/paticipant.jpd的Target JPD,修改后显示如下:
经过上述设置,只有当clientRequest中的XmlDocument经过Xquery查询后的字段值为‘liangyi’(此例中字段为Customer_Name)时才会调用End Point表明的Target JPD,其他的请求不能调用此Target JPD。
5. 通过HTTP,HTTPS方式直接访问一个JPD所对应的URL进行调用
如上图所示,我们在WORKSHOP中开发测试JPD的时候,从WORKSHOP的测试页面中的”test soap”页,可以看到SOAP格式的Service Client Request和Service 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);
}
只要是支持HTTP,HTTPS的客户端都可以通过该方式调用JPD。如可以在C,C++环境中通过该方式调用一个JPD。
6. 通过JPD Proxy方式进行调用
该方式WLI81SP2中提供,WLI81SP1中支持不完善。可以实现非Workshop J2EE客户端或独立java客户端调用WLI81上的JPD,Java Proxy是为任何普通Java Client端与JPD通信设计的。通过JPD Proxy的调用是Java RMI调用,当Client端通过JPD Proxy调用工作流时,其事务上下文将通过JPD Proxy传递给Target JPD,即Target JPD与Client端处于同一个事务中。示例实施步骤:
² 在Workshop中运行需要调用Target JPD,得到Target JPD的JPD Proxy(jar文件)
² 将上述jar文件引入client端所在的工程,以供程序调用。示例中是在与Target JPD相同的Application中设计Java Client端,所以把jar包引入到Application的APP-INF的lib中即可。
² 在Application中建立一个Java Project,编写Java Client
² 运行Java Client端,可以成功调用Target JPD。
需要特别说明的是:JPD Proxy调用方式虽然适用于所有的Java Client端,但是它有一个局限-JPD Proxy不能接收Target JPD的Callback,即若Client使用JPD Proxy启动一个包含Client Callback的JPD,会在该流程尝试发出Callback给JPD Proxy时产生Runtime failure。