dev2dev 首页 > 资源中心 > 技术文章
客户端调用WLI81 JPD的方法总结 第二部分
目录
直接通过SOAP方式调用。
该方式直接拼一个SOAP包,比较麻烦,不如上面采用HTTP方式来的简单,高效。所以不建议使用。



如上图所示,我们在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。
比较复杂的报文例子:
ToPostOrderForm myform = (ToPostOrderForm)request.getAttribute("toPostOrderForm");
String order_id = ""+myform.getOrder_id();
String cust_id = ""+myform.getCust_id();
String order_text = myform.getOrder_text();
String ini_province = myform.getIni_province();
String exe_province = myform.getExe_province();
String time_limit = ""+myform.getTime_limit();
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:Header><StartHeader xmlns=\"http://www.openuri.org/2002/04/soap/conversation/\">");
soapRequest.append("<callbackLocation>http://TESTUI</callbackLocation></StartHeader></SOAP-ENV:Header><SOAP-ENV:Body>");
soapRequest.append("<clientRequest xmlns=\"http://www.openuri.org/\">\r\n<BBOSS xmlns=\"\">\r\n<code>2</code>\r\n<order>\r\n");
soapRequest.append("<order_id>").append(order_id).append("</order_id>\r\n");
soapRequest.append("<cust_id>").append(cust_id).append("</cust_id>\r\n");
soapRequest.append("<create_t>20030620120000</create_t>\r\n");
soapRequest.append("<modify_t>20030620120000</modify_t>\r\n");
soapRequest.append("<complete_t></complete_t>\r\n");
soapRequest.append("<order_text>").append(order_text).append("</order_text>\r\n");
soapRequest.append("<ini_province>").append(ini_province).append("</ini_province>\r\n");
soapRequest.append("<exe_province>").append(exe_province).append("</exe_province>\r\n");
soapRequest.append("<order_status>0</order_status>\r\n");
soapRequest.append("<time_limit>" + time_limit + "</time_limit>\r\n");
soapRequest.append("<timeout>0</timeout>\r\n");
soapRequest.append("</order>\r\n</BBOSS>\r\n</clientRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>\r\n");
System.out.println("SOAP request:\r\n" + soapRequest);
URL url = new URL("http://127.0.0.1:7001/portal/Usecase3/OrderMGMT.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);
}
System.out.println("SOAP response: " + soapResponse);
通过Web Service Proxy方式

点击上面的Web Service Proxy, WS Proxy Support jar两个按钮,下载两个JAR 包到应用的APP-INF目录下,然后通过如下方式调用该JPD:
通过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端处于同一个事务中。
该种方式,CLIENT和该JPD可以不在同一个DOMAIN中。或一个单独的JAVA文件也可以调用。
示例实施步骤: - 在Workshop中运行需要调用Target JPD,得到Target JPD的JPD Proxy(jar文件)
 - 将上述jar文件引入client端所在的工程,以供程序调用。示例中是在与Target JPD相同的Application中设计Java Client端,所以把jar包引入到Application的APP-INF的lib中即可。
- 如果要在其他地方如:startup class中通过JAVA PROXY方式调用该JPD,需要把该JAR文件放到系统的CLASSPATH中。
- 在Application中建立一个Java Project,编写Java Client
import com.bea.wli.bpm.proxy.JpdProxy;
import java.net.URL;
import javax.naming.Context;
import javax.naming.NamingException;
import weblogic.jndi.Environment;
import weblogic.wli.jpdproxy.JmsProcess;

public class javaClient
{
public static void main(String[] args)
{
JmsProcess p;
try{
p = (JmsProcess)JpdProxy.create(
JmsProcess.class,
JmsProcess.SERVICE_URI,
new JpdProxy.ContextHandler()
{
public Context getContext() throws NamingException
{
Environment env = new Environment();
env.setProviderUrl("t3://localhost:7001");
env.setSecurityPrincipal("weblogic");
env.setSecurityCredentials("weblogic");
return env.getInitialContext();
}
});
for(int i=0;i<100;i++)
{
String ss= p.clientRequestwithReturn1("sfsdfds");
System.out.println("ss=" +ss);
}
- 运行Java Client端,可以成功调用Target JPD。
在一个JSP中调用该JPD:
先把把该JAVA PROXY对应的JAR文件导入到该APPLICATION的APP-INF目录下。代码如下。
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ page import="com.bea.wli.bpm.proxy.JpdProxy"%>
<%@ page import="java.net.URL"%>
<%@ page import="javax.naming.Context"%>
<%@ page import="javax.naming.NamingException"%>
<%@ page import="weblogic.jndi.Environment"%>
<%@ page import="weblogic.wli.jpdproxy.JmsProcess"%>
<%!
JmsProcess p;
%>
<%!
public void jspInit()
{
try{
p = (JmsProcess)JpdProxy.create(
JmsProcess.class,
JmsProcess.SERVICE_URI,
new JpdProxy.ContextHandler()
{
public Context getContext() throws NamingException
{
Environment env = new Environment();
env.setProviderUrl("t3://localhost:7001");
env.setSecurityPrincipal("weblogic");
env.setSecurityCredentials("weblogic");
return env.getInitialContext();
}
});
}
catch(Exception e)
{
e.printStackTrace();
}
}
%>
<%
try
{
for(int i=0;i<100;i++)
{
String ss= p.clientRequestwithReturn1("sfsdfds");
System.out.println("ss=" +ss);
}
}
catch (Exception e) {
e.printStackTrace();
}
%>
参数传递:可以通过HASH TABLE来传递参数。 HashMap ht, htcall; 。。。。。 htcall=p.clientRequest(ht);
需要特别说明的是:JPD Proxy调用方式虽然适用于所有的Java Client端,但是它有一个局限-JPD Proxy不能接收Target JPD的Callback,即若Client使用JPD Proxy启动一个包含Client Callback的JPD,会在该流程尝试发出Callback给JPD Proxy时产生Runtime failure。
直接在WORKSHOP 的测试CLIENT端中调用JPD
在DEVELOP MODE下,可以

在PRODUCT MODE下,不可以。在PRODUCT MODE下访问该JPD对应的URL时,显示如下的页面。

在测试性能时,一定不要通过该客户端直接调用JPD,这样性能会很慢。
通过Message Broker 方式启动JPD
通过JMS,FILE,TIMER,等EVENT 方式启动一个JPD。并且还可以通过配置MESSAGE BRIDGE,让JMS EVENT听一个远程的JMS QUEUE,当该QUEUE中有消息时,启动本地的JPD。
8.1 SP4中同步CLIENT通过sync/async 调用异步流程
The sync/async SOAP servlet enables synchronous clients to invoke an asynchronous business process using HTTP and SOAP. The business process must comply with specific constraints.
具体见:http://e-docs.bea.com/workshop/docs81/doc/en/integration/wfguide/wfguideSync.html


PB 等通过HTTP调用异步流程
PB CLIENT通过HTTP调用 SERVLET PROXY,SERVLET 调用JPD,并返回结果给PB CLIENT JPD 把处理结果发送到JMS Q中。 PB CLIENT通过HTTP调用 SERVLET PROXY,SERVLET查询JMS Q,并把结果返回给PB CLIENT。
PB CLIENT通过HTTP调用 SERVLET PROXY,SERVLET通过MESSAGE PUBLICH CONTROL PUBLISH消息到CHANNEL中,调用前面启动的流程实例。
整个流程由PB CLIENT控制,

本文第一部分:http://dev2dev.bea.com.cn/techdoc/20060405759.html
| 作者简介 |
|
dev2dev ID: xcjing,BEA 资深技术顾问,加入BEA中国多年,在门户技术、RFID解决方案上有着丰富的经验。 |
作者其它文章
|