一、webservice的服务端简单实现
@WebService public interface Calculator { @WebMethod @WebResult(name = "num3") public int plus(@WebParam(name = "num1") int num1, @WebParam(name = "num2") int num2); } @WebService(endpointInterface = "com.first.service.Calculator", serviceName = "calculator") public class CalculatorImpl implements Calculator{ @Override public int plus(int num1, int num2) { return num1+num2; } } public static void main(String[] args) { Calculator calculator; Server server; calculator = new CalculatorImpl(); JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean(); svrFactory.setServiceClass(Calculator.class); svrFactory.setAddress("http://localhost:63081/calculator"); svrFactory.setServiceBean(calculator); svrFactory.getInInterceptors().add(new LoggingInInterceptor()); svrFactory.getOutInterceptors().add(new LoggingOutInterceptor()); server = svrFactory.create(); server.start(); }
java实现一个简单的webservice服务端,并且为调用方法的传入传出参数指定名称,方便activiti中引用
二、activiti
流程定义文件
<?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="com.first.service" xmlns:tns="com.first.service" xmlns:calculator="http://webservice.activiti.org/"> <import importType="http://schemas.xmlsoap.org/wsdl/" location="http://localhost:63081/calculator?wsdl" namespace="http://webservice.activiti.org/" /> <process id="process1" name="process1"> <startEvent id="startevent1" name="Start"></startEvent> <endEvent id="endevent1" name="End"></endEvent> <userTask id="usertask1" name="hello"></userTask> <serviceTask id="servicetask1" name="calculator" implementation="##WebService" operationRef="tns:plusOperation"> <!-- activiti流程变量和webservice的输入输出参数的转换 --> <dataInputAssociation> <sourceRef>input1</sourceRef><!-- name of an Activiti variable --> <targetRef>num1</targetRef><!-- name of an element of the input message --> </dataInputAssociation> <dataInputAssociation> <sourceRef>input2</sourceRef><!-- name of an Activiti variable --> <targetRef>num2</targetRef><!-- name of an element of the input message --> </dataInputAssociation> <dataOutputAssociation> <sourceRef>num3</sourceRef><!-- name of an element of the output message --> <targetRef>output3</targetRef><!-- name of an Activiti variable --> </dataOutputAssociation> </serviceTask> <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="endevent1"></sequenceFlow> </process> <!-- webservice的传入传出参数(webservice服务端明确指出),以及activiti执行代码中传入的参数引用 --> <itemDefinition id="num1" structureRef="int" /> <itemDefinition id="num2" structureRef="int" /> <itemDefinition id="num3" structureRef="int" /> <itemDefinition id="input1" structureRef="int" /> <itemDefinition id="input2" structureRef="int" /> <itemDefinition id="output3" structureRef="int" /> <!-- 一个webservice方法操作调用的定义 implementationRef="calculator:Calculator" 中 Calculator 即 portType的引用 --> <interface name="Calculator Interface" implementationRef="calculator:Calculator"> <!-- Operation: implementationRef = QName of WSDL Operation --> <operation id="plusOperation" name="plusOperation Operation" implementationRef="calculator:plus"> <inMessageRef>tns:plusRequestMessage</inMessageRef> <outMessageRef>tns:plusResponseMessage</outMessageRef> </operation> </interface> <message id="plusRequestMessage" itemRef="tns:plusRequestItem" /> <message id="plusResponseMessage" itemRef="tns:plusResponseItem" /> <itemDefinition id="plusRequestItem" structureRef="calculator:plus" /> <itemDefinition id="plusResponseItem" structureRef="calculator:plusResponse" /> <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="60" y="160"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> <omgdc:Bounds height="35" width="35" x="590" y="160"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"> <omgdc:Bounds height="55" width="105" x="170" y="150"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="servicetask1" id="BPMNShape_servicetask1"> <omgdc:Bounds height="55" width="105" x="370" y="150"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> <omgdi:waypoint x="95" y="177"></omgdi:waypoint> <omgdi:waypoint x="170" y="177"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> <omgdi:waypoint x="275" y="177"></omgdi:waypoint> <omgdi:waypoint x="370" y="177"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> <omgdi:waypoint x="475" y="177"></omgdi:waypoint> <omgdi:waypoint x="590" y="177"></omgdi:waypoint> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
流程执行代码
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("acitiviti.cfg.xml"); RepositoryService repositoryService=(RepositoryService) applicationContext.getBean("repositoryService"); RuntimeService runtimeService = (RuntimeService) applicationContext.getBean("runtimeService"); IdentityService identityService=(IdentityService) applicationContext.getBean("identityService"); repositoryService.createDeployment().addClasspathResource("calculator.bpmn20.xml").deploy(); Map<String,Object> map=new HashMap<String,Object>(); map.put("input1", 2); map.put("input2", 3); ProcessInstance pi=runtimeService.startProcessInstanceByKey("process1", map); System.out.println(pi.getId()); TaskService taskService = (TaskService) applicationContext.getBean("taskService"); taskService.claim("12", "yuyong"); taskService.complete("12"); int output = (Integer) runtimeService.getVariable("5", "output3"); System.out.println(output);
map中传入的参数即开启一个流程实例传入的流程变量。也是 流程定义文件中定义的项目item。因为webservice task 无需人工驱动,流程执行到此task时,会自动执行。所以,执行完id为12的usertask后,自动执行了此webservice task。流程结束。