BSTEK Development Framework2(BDF2) : 5.5.任务到达提醒

bdf2-jbpm4模块不再维护更新

2013年10月01日起,BDF2中集成的jBPM4模块将不再做任何更新,今后将主推锐道自己的流程引擎UFLO,项目地址为bsdn.org/projects/uflo ,UFLO文档教程地址为UFLO Home

        在之前配置任务节点时,我们提到,在配置窗口当中有四块内容可供配置,其中最后两块是任务提醒与任务过期。我们先来看看任务提醒配置页,如下图所示。

      提醒基本可分为两大类,既提醒一次及周期性提醒,因为都是可视化配置,比较简单,这里就不再赘述了。这里需要重点提出的是提醒时采用的消息模版及发送提供消息的方法,对于消息模版的选择,我们需要在ORM模块中提供的消息模版维护中定义,如下图所示:

      可以看到,在定义消息模版时,我们需要选择类型,比如上图中的jBPM4消息模版 这个类型,一旦选择好类型后,在模版的名称及内容定义两个地方我们就可以使用这个模版提供的相关变量,比如上图中的jBPM4消息模版的相关变量,实际上,消息模版类型及相关变量定义,都是通过一个接口的实现类定义的,这个接口名叫IMessageVariableRegister,下面是其源码 :

IMessageVariableRegister接口源码
package com.bstek.bdf2.core.business;
import java.util.Collection;
import com.bstek.bdf2.core.model.MessageVariable;
/**
 * @author Jacky.gao
 * @since 2013-3-24
 */
public interface IMessageVariableRegister {
	String getTypeId();
	String getTypeName();
	Collection<MessageVariable> getMessageVariables();
}

      我们来看看jBPM4消息模版这个类型的接口实现类源码 :

实现类示例
package com.bstek.bdf2.jbpm4.context;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jbpm.api.TaskService;
import org.jbpm.api.task.Task;
import com.bstek.bdf2.core.model.MessageVariable;
import com.bstek.bdf2.jbpm4.service.IBpmService;
/**
 * @author Jacky.gao
 * @since 2013-3-25
 */
public class DefaultJbpm4MessageVariableRegister extends AbstractJbpm4MessageVariableRegister{
	private IBpmService bpmService;
	private String taskName="taskName";
	private String principal="principal";	
	private String taskCreateDate="taskCreateDate";	
	
	public Collection<MessageVariable> getMessageVariables() {
		List<MessageVariable> result=new ArrayList<MessageVariable>();
		MessageVariable var=new MessageVariable();
		var.setName(IBpmService.BUSINESS_ID);
		var.setDesc("业务数据ID");
		result.add(var);
		
		var=new MessageVariable();
		var.setName(taskCreateDate);
		var.setDesc("任务创建时间");
		result.add(var);
		var=new MessageVariable();
		var.setName(principal);
		var.setDesc("任务处理人");
		result.add(var);
		
		var=new MessageVariable();
		var.setName(taskName);
		var.setDesc("任务名称");
		result.add(var);
		
		var=new MessageVariable();
		var.setName(IBpmService.PROCESS_INSTANCE_PROMOTER);
		var.setDesc("流程实例发起人");
		result.add(var);
		return result;
	}
	public Map<String, String> fetchMessages(Task task,String assignee) {
		SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		TaskService taskService=bpmService.getTaskService();
		Map<String, String> map=new HashMap<String,String>();
		map.put(principal, assignee);
		map.put(taskName, task.getName());
		map.put(taskCreateDate, sd.format(task.getCreateTime()));
		map.put(IBpmService.BUSINESS_ID,(String)taskService.getVariable(task.getId(), IBpmService.BUSINESS_ID));
		map.put(IBpmService.PROCESS_INSTANCE_PROMOTER,(String)taskService.getVariable(task.getId(), IBpmService.PROCESS_INSTANCE_PROMOTER));
		return map;
	}
	public IBpmService getBpmService() {
		return bpmService;
	}
	public void setBpmService(IBpmService bpmService) {
		this.bpmService = bpmService;
	}
}

      上面这个实现类是扩展自AbstractJbpm4MessageVariableRegister类的,下面是这个类源码:

AbstractJbpm4MessageVariableRegister类源码
public abstract class AbstractJbpm4MessageVariableRegister implements IJbpm4MessageVariableRegister {
	public String getTypeId() {
		return TYPE;
	}
	public String getTypeName() {
		return "jBPM4消息模版";
	}
}

      到这里,您应该明白了如果添加自己的消息模版类型以及如何为jBPM4消息模版添加新的变量。

      介绍完消息模版,接下来我们来看看发送提醒消息方法,点击配置按钮,可以看到如下图所示的消息发送器列表:

      从上图当中可以看到,默认采用的是系统提供的email及站内消息两种消息发送器,我们可以选择一个,也可以两个都选择。如果我们有自己的消息发送方法,比如发送手机短信,那么我们只需要编写一个IMessageSender接口的实现类,并将其配置到spring当中即可,实际上系统默认提供的email及站内消息两种消息发送器就是通过实现该接口定义的,该接口源码如下:

IMessageSender接口源码
package com.bstek.bdf2.core.message;
/**
 * @author Jacky.gao
 * @since 2013-3-28
 */
public interface IMessageSender {
	String getSenderId();
	String getSenderName();
	void send(MessagePacket message);
	boolean isDisabled();
}

      接口比较简单,这里就不再解释了,如果您实在不理解,可以参考系统默认提供的email及站内消息两种消息发送器实现类(EmailMessageSender及InternalMessageSender)。

      值得注意的是,一旦我们配置了任务提醒功能,那么在完成任务时,我们一定要记得调用IBpmService接口中的cancelTaskReminder,不然任务虽然完成了,但任务提醒还会继续运行。

Attachments:

reminder.png (image/png)
msg-template.png (image/png)
sender.png (image/png)