activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask

web service task是BPMN2.0中的一种任务类型,在activiti5中它并没有专门的标签表示,而是使用了service task 来表示。而且有很多要配置的内容是无法用图形化工具来完成的。要使用web service task,当然要先有web service。所以首先要编写一个web service。

首先是JAR包:

编写webservice的接口:

package org.mpc.activiti.webservice;import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;@WebService
public interface MpcService {@WebMethod@WebResult(name = "address")//返回值的名称为addressString createMpc(@WebParam(name = "name") String name);//定义了一个名称为name的String类型的参数
}
编写webservice的实现类:

package org.mpc.activiti.webservice;import javax.jws.WebService;@WebService(endpointInterface = "org.mpc.activiti.webservice.MpcService", serviceName = "MpcService")
public class MpcServiceImpl implements MpcService {public String createMpc(String name) {System.out.println("创建人:" + name);Mpc mpc = new Mpc();mpc.setAdd("香格里拉");return mpc.getAdd();}
}

实体类Mpc

package org.mpc.activiti.webservice;public class Mpc {private String name;private String add;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAdd() {return add;}public void setAdd(String add) {this.add = add;}
}

在主程序中发布web service:

package org.mpc.activiti.webservice;import javax.xml.ws.Endpoint;public class Main {public static void main(String args[]) throws Exception {//实例化一个MpcServiceImpl的对象,并在http://localhost:9090/mpc的地址中发布webserviceEndpoint.publish("http://localhost:9090/mpc", new MpcServiceImpl());System.out.println("服务启动...");Thread.sleep(100 * 60 * 1000);//随意设个时间,不要立马退出程序,最好长一点System.exit(0);}}

运行main以后在浏览器中输入http://localhost:9090/mpc?wsdl会看到如下内容:

<wsdl:definitions xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webservice.activiti.mpc.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="MpcService" targetNamespace="http://webservice.activiti.mpc.org/">
<wsdl:types>
<xs:schema xmlns:tns="http://webservice.activiti.mpc.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" targetNamespace="http://webservice.activiti.mpc.org/" version="1.0">
<xs:element name="createMpc" type="tns:createMpc"/>
<xs:element name="createMpcResponse" type="tns:createMpcResponse"/>
<xs:complexType name="createMpc">
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="createMpcResponse">
<xs:sequence>
<xs:element minOccurs="0" name="address" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="createMpcResponse">
<wsdl:part element="tns:createMpcResponse" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:message name="createMpc">
<wsdl:part element="tns:createMpc" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:portType name="MpcService">
<wsdl:operation name="createMpc">
<wsdl:input message="tns:createMpc" name="createMpc"></wsdl:input>
<wsdl:output message="tns:createMpcResponse" name="createMpcResponse"></wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="MpcServiceSoapBinding" type="tns:MpcService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="createMpc">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="createMpc">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="createMpcResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="MpcService">
<wsdl:port binding="tns:MpcServiceSoapBinding" name="MpcServiceImplPort">
<soap:address location="http://localhost:9090/mpc"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

在这份wsdl文档结构中,我们可以得到如下信息:

有name 和 address 两个string类型的变量;有两个消息,分别是createMpc和createMpcResponse,两者都是用来和activiti交互的消息,前者接受参数,后者返回信息; 还有MpcService中的creatreMpc方法,供activiti调用。


在activiti5中访问webservice

方式一 直接的、纯粹的webservice

JAR包:



流程图:

该流程对应的xml

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn"xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema"expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"xmlns:mpc="http://webservice.activiti.mpc.org/"><!-- 这里的namespace是对应于wsdl中的namespace的,在这里定义一下方便后面使用 --><!--引入外部的wsdl文件中存储的数据,也就是我们的webservice生成的wsdl数据 --><import importType="http://schemas.xmlsoap.org/wsdl/" location="http://localhost:9090/mpc?wsdl"namespace="http://webservice.activiti.mpc.org/" /><process id="service1" name="service1"><startEvent id="startevent1" name="Start"></startEvent><userTask id="usertask1" name="Ready Task"></userTask><serviceTask id="servicetask1" name="Web service invocation"implementation="##WebService" operationRef="createMpcOper"><!-- 这里的 implementation="##WebService" 表明这是一个webservice任务 operationRef="createPostOper"指明了这个webservice要执行的操作 --><dataInputAssociation><!-- 要输入的参数 ,可以有多个 --><sourceRef>nameVar</sourceRef><!--输入变量在流程中名称 --><targetRef>name</targetRef><!--输入变量在wsdl中的名称 --></dataInputAssociation><dataOutputAssociation><!--输出的参数,只可以有一个 --><sourceRef>address</sourceRef><!-- 输出变量在wsdl中名称 --><targetRef>addVar</targetRef><!-- 输出变量在流程中的名称 --></dataOutputAssociation><!-- sourceRef就是变量在来源中的名称 targetRef就是变量在目标中的名称 --></serviceTask><userTask id="usertask2" name="EndTask"></userTask><endEvent id="endevent1" name="End"></endEvent><sequenceFlow id="flow1" name="" sourceRef="startevent1"targetRef="usertask1"></sequenceFlow><sequenceFlow id="flow2" name="" sourceRef="usertask1"targetRef="servicetask1"></sequenceFlow><sequenceFlow id="flow3" name="" sourceRef="servicetask1"targetRef="usertask2"></sequenceFlow><sequenceFlow id="flow4" name="" sourceRef="usertask2"targetRef="endevent1"></sequenceFlow></process><!-- 所谓的message 就是activiti 和 webservice 之间的数据交流的信息 --><message id="createMpcMsg" itemRef="createMpcItem"></message><message id="createMpcResponseMsg" itemRef="createMpcResponseItem"></message><!-- 这里定义了消息,itemRef="createMpcResponseItem" 定义了这个消息的类型 --><itemDefinition id="createMpcItem" structureRef="mpc:createMpc" /><itemDefinition id="createMpcResponseItem" structureRef="mpc:createMpcResponse" /><!-- 类型对应于wsdl中的文档结构 --><!--start --><itemDefinition id="nameVar" structureRef="string" /><itemDefinition id="name" structureRef="string" /><itemDefinition id="address" structureRef="string" /><itemDefinition id="addVar" structureRef="string" /><!-- end --><!-- 指定每个变量的类型 --><interface name="Mpc Service" implementationRef="MpcService"><operation id="createMpcOper" name="Create Mpc Operation"implementationRef="mpc:createMpc"><inMessageRef>createMpcMsg</inMessageRef><outMessageRef>createMpcResponseMsg</outMessageRef></operation></interface><bpmndi:BPMNDiagram id="BPMNDiagram_process1"><bpmndi:BPMNPlane bpmnElement="process1" id="BPMNPlane_process1"><bpmndi:BPMNShape bpmnElement="startevent1"id="BPMNShape_startevent1"><omgdc:Bounds height="35" width="35" x="190" y="210"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"><omgdc:Bounds height="55" width="105" x="280" y="200"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="servicetask1"id="BPMNShape_servicetask1"><omgdc:Bounds height="55" width="105" x="440" y="200"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2"><omgdc:Bounds height="55" width="105" x="610" y="200"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"><omgdc:Bounds height="35" width="35" x="770" y="210"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"><omgdi:waypoint x="225" y="227"></omgdi:waypoint><omgdi:waypoint x="280" y="227"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"><omgdi:waypoint x="385" y="227"></omgdi:waypoint><omgdi:waypoint x="440" y="227"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"><omgdi:waypoint x="545" y="227"></omgdi:waypoint><omgdi:waypoint x="610" y="227"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"><omgdi:waypoint x="715" y="227"></omgdi:waypoint><omgdi:waypoint x="770" y="227"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>


测试方法:

package bpmn;import java.util.HashMap;
import java.util.Map;import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
import org.junit.Test;public class WebServiceTest extends PluggableActivitiTestCase {@Test@Deployment(resources = "bpmn/WebService1.bpmn")public void test() {// 初始化参数Map<String, Object> vars = new HashMap<String, Object>();vars.put("nameVar", "mpc_test");ProcessInstance pi = runtimeService.startProcessInstanceByKey("service1", vars);// 完成第一个任务Task task = taskService.createTaskQuery().singleResult();taskService.complete(task.getId());// 输出调用Web Service后的参数String add = (String) runtimeService.getVariable(pi.getId(), "addVar");System.out.println("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");System.out.println();System.out.println();System.out.println("mpc_test现在居住的地点是—————————————————————————>" + add);System.out.println();System.out.println();System.out.println("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");}}

测试的结果是绿条,输出结果如下:

在webservice端的输出为:

在测试端的输出为:


 

方式二 使用 java delegate来实现web service任务

上面的方式太复杂,而且没有图形化的设计界面,容易出错,下面这种就好多了。

使用的jar包和方式一是一样的。

流程图:

然后可以利用图形化的工具来编辑我们的service task

当然也可以用xml的方式编辑,这是完成后的xml

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"><process id="delegate" name="process1" isExecutable="true"><startEvent id="startevent1" name="Start"></startEvent><serviceTask id="servicetask1" name="Service Task" activiti:class="bpmn.WebServiceDelegate"><extensionElements><activiti:field name="wsdl"><activiti:string><![CDATA[http://localhost:9090/mpc?wsdl]]></activiti:string></activiti:field><activiti:field name="operation"><activiti:string><![CDATA[createMpc]]></activiti:string></activiti:field><activiti:field name="name"><activiti:string><![CDATA[mpc_test]]></activiti:string></activiti:field></extensionElements></serviceTask><endEvent id="endevent1" name="End"></endEvent><sequenceFlow id="flow1" sourceRef="startevent1" targetRef="servicetask1"></sequenceFlow><sequenceFlow id="flow2" sourceRef="servicetask1" targetRef="endevent1"></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_delegate"><bpmndi:BPMNPlane bpmnElement="delegate" id="BPMNPlane_delegate"><bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"><omgdc:Bounds height="35.0" width="35.0" x="250.0" y="210.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="servicetask1" id="BPMNShape_servicetask1"><omgdc:Bounds height="55.0" width="105.0" x="330.0" y="200.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"><omgdc:Bounds height="35.0" width="35.0" x="490.0" y="210.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"><omgdi:waypoint x="285.0" y="227.0"></omgdi:waypoint><omgdi:waypoint x="330.0" y="227.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"><omgdi:waypoint x="435.0" y="227.0"></omgdi:waypoint><omgdi:waypoint x="490.0" y="227.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

代理类:

package bpmn;import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.JavaDelegate;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;public class WebServiceDelegate implements JavaDelegate {/**  这些变量我们都在流程中进行了定义,* 也就是说通过流程注入到了这个代理类中,当然要用activiti流程注入,* 就要使用activiti的数据类型Expression* */private Expression wsdl;private Expression operation;private Expression name;// 要注入当然要有set方法public void setWsdl(Expression wsdl) {this.wsdl = wsdl;}public void setOperation(Expression operation) {this.operation = operation;}public void setName(Expression name) {this.name = name;}@Overridepublic void execute(DelegateExecution execution) throws Exception {JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();// 使用wsdl数据创建ClientClient client = dcf.createClient((String) wsdl.getValue(execution));//创建请求的参数Object [] vars = new Object[] {name.getValue(execution)};//发出请求Object [] results = client.invoke((String)operation.getValue(execution), vars);String result=(String)results[0];System.out.println("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");System.out.println();System.out.println();System.out.println("mpc_test现在居住的地点是—————————————————————————>" + result);System.out.println();System.out.println();System.out.println("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");}}

测试类:

package bpmn;import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.test.Deployment;
import org.junit.Test;public class JavaDelegateWebServiceTest extends PluggableActivitiTestCase {@Test@Deployment(resources = "bpmn/JavaDelegateWebService1.bpmn")public void test() {runtimeService.startProcessInstanceByKey("delegate");}}


测试结果:

绿条没问题

web service的输出:(有上次的测试输出,所以是两条)


测试端的输出:





下面是service task 的另一种变化 shell service

和以上两个测试在同一个工程下,所以JAR包们是没有变化的。

流程图:


流程图对应的xml:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"targetNamespace="http://www.activiti.org/test"><process id="shellservice" name="shellservice" isExecutable="true"><startEvent id="startevent1" name="Start"></startEvent><serviceTask id="servicetask1" name="Service Task"activiti:type="shell"><!-- 这里要制定这个servicetask是 activiti:type="shell" --><extensionElements><!-- 这些属性可以在图形化界面中添加,也可以在xml模式下添加,这些属性是要注入给ActivitiBehaviour类的,有该类实现shell任务 --><activiti:field name="command"><activiti:string><![CDATA[cmd]]></activiti:string></activiti:field><activiti:field name="arg1"><activiti:string><![CDATA[/c]]></activiti:string></activiti:field><activiti:field name="arg2"><activiti:string><![CDATA[echo]]></activiti:string></activiti:field><activiti:field name="arg3"><activiti:string><![CDATA[%TEMP%]]></activiti:string></activiti:field><activiti:field name="outputVariable"><activiti:string><![CDATA[TEMP]]></activiti:string></activiti:field></extensionElements></serviceTask><sequenceFlow id="flow1" sourceRef="startevent1"targetRef="servicetask1"></sequenceFlow><userTask id="usertask1" name="User Task"></userTask><sequenceFlow id="flow2" sourceRef="servicetask1"targetRef="usertask1"></sequenceFlow><endEvent id="endevent1" name="End"></endEvent><sequenceFlow id="flow3" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_shellservice"><bpmndi:BPMNPlane bpmnElement="shellservice"id="BPMNPlane_shellservice"><bpmndi:BPMNShape bpmnElement="startevent1"id="BPMNShape_startevent1"><omgdc:Bounds height="35.0" width="35.0" x="250.0" y="160.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="servicetask1"id="BPMNShape_servicetask1"><omgdc:Bounds height="55.0" width="105.0" x="330.0" y="150.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"><omgdc:Bounds height="55.0" width="105.0" x="480.0" y="150.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"><omgdc:Bounds height="35.0" width="35.0" x="630.0" y="160.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"><omgdi:waypoint x="285.0" y="177.0"></omgdi:waypoint><omgdi:waypoint x="330.0" y="177.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"><omgdi:waypoint x="435.0" y="177.0"></omgdi:waypoint><omgdi:waypoint x="480.0" y="177.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"><omgdi:waypoint x="585.0" y="177.0"></omgdi:waypoint><omgdi:waypoint x="630.0" y="177.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>


测试类:

package bpmn;import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.test.Deployment;
import org.junit.Test;public class ShellTaskTest extends PluggableActivitiTestCase {@Test@Deployment(resources = "bpmn/shellTask.bpmn")public void test() {ProcessInstance pi = runtimeService.startProcessInstanceByKey("shellservice");String result = (String) runtimeService.getVariable(pi.getId(), "TEMP");System.out.println(result);}}

这里我在测试类中通过shell命令获得了我的计算机的TEMP变量的值并输出了

测试结果如下:



啊,所有的测试案例中的activiti.cfg.xml都是如下定义的:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd"><beanclass="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration"id="processEngineConfiguration"><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activi" /><property name="jdbcDriver" value="com.mysql.jdbc.Driver" /><property name="jdbcUsername" value="root" /><property name="jdbcPassword" value="root" /><property name="databaseSchemaUpdate" value="true" /><property name="jobExecutorActivate" value="true" /><property name="mailServerHost" value="mail.my-corp.com" /><property name="mailServerPort" value="5025" /><property name="history" value="full"></property></bean></beans>


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

activiti5第六弹 手动任务、接收任务、邮件任务

手动任务和接收任务几乎不在程序中做什么事情---只是在流程的历史中留下一点痕迹&#xff0c;表明流程是走过某些节点的。。。而且这两个任务是无法用taskservice查询到的 但是接收任务比手动任务多一个功能&#xff0c;就是确认功能。。。 activiti.cfg.xml配置 <?xml v…

手把手教你用原始方式上传项目至GitHub

小编GitHub&#xff1a;https://github.com/ds1889 首先你得注册一个自己的GitHub账号&#xff0c;注册网址&#xff1a;https://github.com/join 有了自己的账号以后&#xff0c;就可以进行登录&#xff0c;开始创建一个新的项目 创建一个新的项目&#xff0c;填写项目名称&am…

office如何快速删除重复数据

1、首先打开如下文档&#xff0c;在A列删除重复日期星期一&#xff0c;星期二&#xff1b; 2、选中编号栏&#xff0c;&#xff21;1-&#xff21;10&#xff0c;如下图: 3、点击数据——删除重复项&#xff1b;如下图红色剪头所指: 4、删除后&#xff0c;重复项就被删除成功。…

SQL中and和or的区别是?

今天有这样得一个需求&#xff0c;如果登陆人是客服的话&#xff0c;会查询订单是’该客服’以及还没有匹配客服的&#xff0c;刚开始想的是直接在sql语句上拼写 or assigned_id is null 的&#xff0c;测试了一下发现这样的话&#xff0c;前面的其他条件都没有用了 这样的话…

Java编程设计---数组Arrays

数组的的定义 数组是存放在连续存储空间的元素集合 数组定义的格式&#xff1a; int[] arrnew int[5]; int&#xff1a;数组元素的数据类型&#xff0c;可以是基本数据类型&#xff0c;也可以是引用 arr&#xff1a;数组名称 5&#xff1a;数组中元素个数 第一步&#xff1a;定…

SpringBoot整合升级Spring Security 报错 【The request was rejected because the URL was not normalized】...

前言 最近LZ给项目框架升级&#xff0c; 从Spring1.x升级到Spring2.x, 在这里就不多赘述两个版本之间的区别以及升级的原因。 关于升级过程中踩的坑&#xff0c;在其他博文中会做比较详细的记录&#xff0c;以便给读者参考&#xff0c;不要掉进同样的坑里。 这里我们讨论一个关…

个人测试作业

作业所属课程&#xff1a;https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业地址&#xff1a;https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3340 作业目标&#xff1a;测试其他同学项目 姓名&#xff1a;潘云峰201731062423 所…

Activiti5第十一弹,流程监听器与任务监听器

首先创建流程监听器和任务监听器的实体类&#xff0c;个人比较喜欢使用Delegate Expression方式&#xff0c;其他两种方式也可以 流程监听器 package org.mpc.final_activiti;import java.io.Serializable;import org.activiti.engine.delegate.DelegateExecution; import org.…

ASCII码对照表

1、字母转换成ASCII码 1 string str "hello";2 byte[] array new byte[1]; 3 array System.Text.Encoding.ASCII.GetBytes(str); //把str的每个字符转换成ascii码4 5 int asciicode1 (short)(array[0]);//h 的…

平行四边形的特殊性质

定义平行四边形内角平分线围城的四边形为$\lambda$四边形$\lambda$四边形是矩形 $\lambda$四边形的中线为平行四边形中心$\lambda$四边形的对角线和平行四边形的边平行转载于:https://www.cnblogs.com/guoshaoyang/p/11011612.html

对象的深度复制

首先什么是深度复制&#xff1f;什么又是浅复制&#xff1f; 百度告诉我---------------> 浅复制&#xff1a;将一个对象复制后&#xff0c;基本类型都会重新创建&#xff0c;而引用类型指向的还是原对象所指的引用&#xff1b; 深复制&#xff1a;讲一个对象复制后&…

如何在idea中使用Mybatis-generator插件快速生成代码

代码下载地址&#xff1a;https://download.csdn.net/download/hua_faded/10671547 一、配置Maven pom.xml 文件 在pom.xml增加以下插件&#xff1a; <build><finalName>zsxt</finalName> <plugins> <plugin> <groupId>org.mybatis.genera…

django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

CBV加装饰器 第一种  method_decorator(装饰器&#xff09;  加在get上 第二种  method_decorator(login_auth,nameget)  加在类上 第三种  method_decorator(login_auth)  加在dispatch上  3.7的要return super().dispatch def login(request):if request.metho…

Dubbo理论知识

本文是作者根据官方文档以及自己平时的使用情况&#xff0c;对 Dubbo 所做的一个总结。如果不懂 Dubbo 的使用的话&#xff0c;可以参考我的这篇文章《超详细&#xff0c;新手都能看懂 &#xff01;使用SpringBootDubbo 搭建一个简单的分布式服务》 Dubbo 官网&#xff1a;http…

外观模式(facade)

外观模式是为了解决类与类之间的依赖关系的&#xff0c;像spring一样&#xff0c;可以将类和类之间的关系配置到配置文件中&#xff0c;而外观模式就是将他们的关系放在一个Facade类中&#xff0c;降低了类类之间的耦合度&#xff0c;该模式中没有涉及到接口&#xff0c;看下类…

widows下nignx的使用

nignx在Linux环境下可以大展身手&#xff0c;在widows环境下也可以启动一定的效果&#xff0c;但是没有linux用的好。 Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。 什么是反向代理&#xff1f; 反向代…

享元模式(Flyweight)

享元模式的主要目的是实现对象的共享&#xff0c;即共享池&#xff0c;当系统中对象多的时候可以减少内存的开销&#xff0c;通常与工厂模式一起使用。 FlyWeightFactory负责创建和管理享元单元&#xff0c;当一个客户端请求时&#xff0c;工厂需要检查当前对象池中是否有符合条…

redo

在innodb存储引擎中&#xff0c;事务日志通过重做(redo)日志文件和InnoDB存储引擎的日志缓冲(InnoDB Log Buffer)来实现。当开始一个事务时&#xff0c;会记录该事务的一个LSN(Log Sequence Number&#xff0c;日志序列号)&#xff1b;当事务执行时&#xff0c;会往InnoDB存储引…

迭代子模式(Iterator)

顾名思义&#xff0c;迭代器模式就是顺序访问聚集中的对象&#xff0c;一般来说&#xff0c;集合中非常常见&#xff0c;如果对集合类比较熟悉的话&#xff0c;理解本模式会十分轻松。这句话包含两层意思&#xff1a;一是需要遍历的对象&#xff0c;即聚集对象&#xff0c;二是…

oracle查看执行计划入门

基于Oracle的应用系统很多的性能问题都是由应用系统的SQL性能低劣引起的&#xff0c;因此SQL的性能优化非常重要。要分析与优化SQL的性能&#xff0c;一般是通过查看该SQL的执行计划&#xff0c;然后通过执行计划有针对性地对SQL进行相应的优化。 什么是执行计划&#xff08;Ex…