activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask

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

首先是JAR包:

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第1张图片

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第2张图片

编写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();
	}
}

实体类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的地址中发布webservice
        Endpoint.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文档结构中,我们可以得到如下信息:

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


在activiti5中访问webservice

方式一 直接的、纯粹的webservice

JAR包:

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第3张图片activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第4张图片


流程图:

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第5张图片

该流程对应的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端的输出为:

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第6张图片

在测试端的输出为:

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第7张图片

 
  

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

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

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

流程图:

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第8张图片

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

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第9张图片

当然也可以用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的输出:(有上次的测试输出,所以是两条)

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第10张图片

测试端的输出:

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第11张图片




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

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

流程图:

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第12张图片

流程图对应的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);
	}

}

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

测试结果如下:

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask_第13张图片


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





	
		
		
		
		
		
		
		
		
		
	




你可能感兴趣的:(activiti,activiti5流程引擎学习)