跳到导航
dev2dev.bea.com.cn
首页 资源中心 dev2dev学堂 在线技术论坛 专家Blog User Group CodeShare
dev2dev 首页 > 资源中心 > 技术文章
客户端调用WLI81 JPD的方法总结 第二部分

时间:2006-04-05
作者:徐春金
浏览次数:
本文关键字:WebLogic Integration流程ProcessWSDLControlSOAPWeb Services异步流程Proxybroker
文章工具
推荐给朋友 推荐给朋友
打印文章 打印文章

目录

直接通过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文件)
  2. 在Workshop中运行需要调用Target JPD

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

本文第一部分:http://dev2dev.bea.com.cn/techdoc/20060405759.html

 作者简介
dev2dev ID: xcjing,BEA 资深技术顾问,加入BEA中国多年,在门户技术、RFID解决方案上有着丰富的经验。
dot dot dot

dot
  作者其它文章
您对本文的评价
您对这篇文章的看法如何?
太棒了!5分 不错啊 4分 一般般 3分 有待提高 2分 不好 1分