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")//返回值的名称为address
String 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();
}
}
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的地址中发布webservice
Endpoint.publish("http://localhost:9090/mpc", new MpcServiceImpl());
System.out.println("服务启动...");
Thread.sleep(100 * 60 * 1000);//随意设个时间,不要立马退出程序,最好长一点
System.exit(0);
}
}
有name 和 address 两个string类型的变量;有两个消息,分别是createMpc和createMpcResponse,两者都是用来和activiti交互的消息,前者接受参数,后者返回信息; 还有MpcService中的creatreMpc方法,供activiti调用。
在activiti5中访问webservice
方式一 直接的、纯粹的webservice
JAR包:
流程图:
该流程对应的xml
nameVar
name
address
addVar
createMpcMsg
createMpcResponseMsg
测试方法:
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 vars = new HashMap();
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
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;
}
@Override
public void execute(DelegateExecution execution) throws Exception {
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
// 使用wsdl数据创建Client
Client 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:
测试类:
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);
}
}
测试结果如下:
啊,所有的测试案例中的activiti.cfg.xml都是如下定义的: