BPM之工作流

目前公司在进行网站重构,需要将工作流系统整合到新开发的系统中,在项目的开始阶段,宏天的BPMX3和普元的BPS业务流程管理系统在评估计划中,因此我对这两个系统有了一个浅显的研究,在这里做一个小小的总结。

首先,给出一些常用语的解释:

SOA(面向服务的架构)
面向服务架构是一个组件,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。SOA是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。SOA可以看作是B/S模型、XML(标准通用标记语言的子集)/Web Service技术之后的自然延伸。

WSDL
WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。WSDL指网络服务描述语言;WSDL使用XML编写;WSDL是一种XML文档;WSDL用于描述网络服务;WSDL也可用于定位网络服务。

UDDI
UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册(注:注册是核心,用户可以通过UDDI来查找分布在互联网上的Web Service,并采用合适的格式请求相应的服务)和搜索。UDDI,英文为 “Universal Description, Discovery and Integration”,可译为“通用描述、发现与集成服务”。(分布式互联网服务注册机制

SOAP
SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。或者更简单地说:SOAP 是用于访问网络服务的协议。SOAP指简易对象访问协议,是一种通信协议,用于应用程序之间的通信,是一种用于发送消息的格式,设计用于通过互联网进行通信,独立于平台,独立于语言,基于XML,很简单并可扩展,允许您绕过防火墙,将被作为W3C标准发展。

工作流引擎
所谓工作流引擎是指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。工作流引擎包括了,流程的节点管理、流向管理、流程样例管理等重要功能。

注:以上概念来源于网络,仅供参考


上面的概念都是在研究工作流引擎中所了解到的,下面通过一个简单的例子来说明工作流和业务系统之前的交互(当然了,本地测试时,自己写了一个简单的web应用来充当业务系统)。业务流程管理系统采用的是宏天的BPMX3。(注:你用的是什么流程管理系统这不重要,你只需要明白,这个玩意可以简化你的业务系统的开发,并且能够快速响应你的业务系统的变动)

好了,下面就用一个简单的请假流程(真是一个梗,流程总是用请假流程来演示)来演示流程系统做哪些事,并且流程系统怎样和业务系统之前的交互。

定义一个流程:
请假流程图

请假流程说明:上面定义的是一个最简单的请假流程图,首先用户填写请假单,然后对用户的身份进行判断。如果用户是经理,则由总裁进行审核,如果用户不是经理,则由经理审核,然后结束。

定义一个表:
请假过程中的数据需要填入表单中,因此,需要定义一张表用于存储请假过程中的数据。(表直接可以通过BPMX3生成)

这里写图片描述

定义请假表单
请假表单也可以理解为前端页面,请假表单需要和定义的请假表进行关联。这样在请假表单上填写的数据就可以写入对应的表中。(表单可以通过BPMX3生成)

这里写图片描述

嗯。。既然表单、表和流程图都实现了,接下来就需要对流程图进行细节的配置了,比如将流程图和表单进行关联、对流程图节点人员的配置等。

下面给出一个简单的图,来看看怎么对流程图节点进行配置(我使用的BPMX3,所以就针对这个软件进行说了,但强调的重点并不是这个软件,而是对流程图节点进行配置。

这里写图片描述
这里写图片描述

针对每个人所使用的流程管理系统,肯定配置的方法是不一样的,各位具体情况具体分析吧。。

嗯。。经过上面的配置后,其实直接使用BPMX3的web端就可以直接运行了。应该大部分业务系统都提供了这一个功能。但是呢,我们的重点并不是这里,而是我们的业务系统。我们开发的流程就在那放着,需要业务系统通过Web service方式调用接口来驱动流程。

接下来主要涉及到两个方面:流程管理系统提供的接口和通过业务系统的开发来调用这些接口。

流程系统提供接口
在说流程提供的接口签,咱们先来看看如何通过Java实现基于Soap协议接口。
下面给出我的测试用例,直接使用Java中自带的包来实现Soap接口。

服务端代码:

package com.jcw.test2;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;

@WebService(serviceName="MyService", targetNamespace="http://www.test.jcw.com")
public class HelloService {

    @WebMethod(operationName ="AliassayHello")
    @WebResult(name="myReturn")
    public String sayHello(@WebParam(name="name") String name) {
        return "hello: " + name;
    }

    public String sayGoodBye(String name) {
        return "goodbye: " + name;
    }

    @WebMethod(exclude=true)
    public String sayHello2(String name) {
        return "hello: " + name;
    }

    public static void main(String[] args) {
        Endpoint.publish("http://localhost:8082/", new HelloService());
        System.out.println("Server reader...");
    }

}

根据上面提供的代码,当启动后,我们就能够访问这些Soap协议的接口,强烈建议使用Soap UI工具进行测试(如何测试请google),当启动上面的类后,就可以通过“http://localhost:8082/helloService?wsdl”访问对应的接口描述。(注:WSDL是用来描述WebService的,它用XML的格式描述了WebService有哪些方法、参数类型、访问路径等等)。访问时返回的接口如下:

<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --><!-- Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --><definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.test.jcw.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://www.test.jcw.com" name="MyService">
<types>
<xsd:schema>
<xsd:import namespace="http://www.test.jcw.com" schemaLocation="http://localhost:8082/?xsd=1"></xsd:import>
</xsd:schema>
</types>
<message name="AliassayHello">
<part name="parameters" element="tns:AliassayHello"></part>
</message>
<message name="AliassayHelloResponse">
<part name="parameters" element="tns:AliassayHelloResponse"></part>
</message>
<message name="sayGoodBye">
<part name="parameters" element="tns:sayGoodBye"></part>
</message>
<message name="sayGoodByeResponse">
<part name="parameters" element="tns:sayGoodByeResponse"></part>
</message>
<portType name="HelloService">
<operation name="AliassayHello">
<input wsam:Action="http://www.test.jcw.com/HelloService/AliassayHelloRequest" message="tns:AliassayHello"></input>
<output wsam:Action="http://www.test.jcw.com/HelloService/AliassayHelloResponse" message="tns:AliassayHelloResponse"></output>
</operation>
<operation name="sayGoodBye">
<input wsam:Action="http://www.test.jcw.com/HelloService/sayGoodByeRequest" message="tns:sayGoodBye"></input>
<output wsam:Action="http://www.test.jcw.com/HelloService/sayGoodByeResponse" message="tns:sayGoodByeResponse"></output>
</operation>
</portType>
<binding name="HelloServicePortBinding" type="tns:HelloService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding>
<operation name="AliassayHello">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal"></soap:body>
</input>
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
<operation name="sayGoodBye">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal"></soap:body>
</input>
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
</binding>
<service name="MyService">
<port name="HelloServicePort" binding="tns:HelloServicePortBinding">
<soap:address location="http://localhost:8082/"></soap:address>
</port>
</service>
</definitions>

关于如何访问Soap接口,参见http://www.cnblogs.com/siqi/archive/2013/12/15/3475222.html的描述。

为什么说上面怎样定义Soap接口和访问Soap接口呢?因为很多人接触最多的是RESTful风格的接口,有时会混淆Soap协议和Rest格式的接口。

好了,闲话少说,下面来测试请假流程,BPMX3已经提供了足够的接口供我们使用,我们直接知道路径,并且调用的格式就行,下面通过Soap UI进行简单的测试。
这里写图片描述
上图就是通过Soap UI进行测试的一个接口,它很方便的将所以的方法都列出来,我们仅仅需要修改传递的参数就行。

业务系统调用接口
其实通过上面的讲解,关于怎样在业务系统中调用接口,也能很方便的实现了。其中最简单和推荐的方法是:使用jdk中自带的wsimport命令(wsimport -d generated http://example.com/yourClass?wsdl),将wsdl文件的描述生成一些类,然后通过这些类调用接口(可以将生成的类构建为一个单独的jar包进行使用)。

首先根据BPMX3提供的一个Soap协议的接口来生成一些类,然后构建为一个jar包,通过这些类来调用接口。

wsimport -d generated/target -s generated/source http://localhost:8081/bpmx/service/FlowService?wsdl

wsimport -d generated/target -s generated/source http://192.168.2.205:8081/bpmx/service/FormService?wsdl

wsimport -d generated/target -s generated/source http://192.168.2.205:8081/bpmx/service/ProcessService?wsdl

关于wsimport的使用请直接输入 wsimport –help进行查看。

关于调用接口的方法,下面给一个简单的例子。

package com.jcw.test;


import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.hotent.platform.webservice.impl.ProcessService;
import com.hotent.platform.webservice.impl.ProcessServiceImplService;

public class Main {
    public static void main(String[] args) throws Exception {
        //这个类是通过wsimport生成的
        ProcessServiceImplService processServiceImplService = new ProcessServiceImplService();
        //这个类是通过wsimport生成的
        ProcessService processService = processServiceImplService.getProcessServiceImplPort();
        //定义一个请求参数
        String xml = "<req flowKey=\"askforleave\" account=\"jiangcw\">" +
         "<data><![CDATA[{\"main\": {\"fields\": {\"applicant\": \"jiangcw\",\"leavetype\": \"事假\", " +
                 "\"reason\":\"balabala\",\"begintime\":\"2017-7-11\",\"endtime\":\"2017-7-20\"," +
                        "\"ismanager\":\"true\"}}," +
                        "\"sub\": [],\"opinion\": []}]]>" +
                        "</data></req>";
        //start就是生成类中的一个方法,相当于调用一个接口
        String result =processService.start(xml);
        //下面的东西仅仅是解析返回的xml文档,不太重要
        Document document = DocumentHelper.parseText(result);
        Element root = document.getRootElement();
        String value = root.attributeValue("businessKey");
        System.out.println(value);
    }

}

嗯。。感觉通过上面的基本流程,通过接口的方式实现系统之间的交互,大家有个基本的认识。当然了,对于一个刚接触这些东西的人来说,肯定会遇到一些小坑,解决方法还是三种:自己摸索、google和请教别人。

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值