中国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 JPD的方法总结 第二部分
作者:徐春金 时间:2006-08-08 14:16 出处:bea.com.cn 责编:月夜寒箫
              摘要:客户端调用WLI81 JPD的方法总结 第二部分

直接通过SOAP方式调用。

  该方式直接拼一个SOAP包,比较麻烦,不如上面采用HTTP方式来的简单,高效。所以不建议使用。

直接通过SOAP方式调用。

直接通过SOAP方式调用。

直接通过SOAP方式调用。

  如上图所示,我们在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方式

  点击上面的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文件也可以调用。

  示例实施步骤:

  1. 在Workshop中运行需要调用Target JPD,得到Target JPD的JPD Proxy(jar文件)

    在Workshop中运行需要调用Target JPD

  2. 将上述jar文件引入client端所在的工程,以供程序调用。示例中是在与Target JPD相同的Application中设计Java Client端,所以把jar包引入到Application的APP-INF的lib中即可。
  3. 如果要在其他地方如:startup class中通过JAVA PROXY方式调用该JPD,需要把该JAR文件放到系统的CLASSPATH中。
  4. 在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;
        

    Java Client

    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);
        }
        
  5. 运行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下,可以

直接在WORKSHOP 的测试CLIENT端中调用JPD

  在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

8.1 SP4中同步CLIENT通过sync/async 调用异步流程

8.1 SP4中同步CLIENT通过sync/async 调用异步流程

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控制,

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有