最近在学习Snaker工作流,在Git上(下载地址)下载了一份代码,跑通后简单用了一下功能,(建议使用IE浏览器,其他浏览器会出现页面显示不完整的情况)对时间相关的几个属性一头雾水,调试了代码,感觉这份代码里没有实现这几个功能,于是在网上找了些相关资料,自己在项目中添加了该功能(不知道作者是不是这样的实现思路)

图中标记的几处,我的理解是 ,第一张图里设置的期望完成时间是总流程的期望完成时间,即系统时间超过该时间这个流程就更改状态为已结束,第二张图里设置的期望完成时间是该节点的结束时间,如果“是否自动执行”为“是”,超过该时间流程就自动走到下一节点,反之则停留在该节点,直至整个流程结束。

思考一下,此处设置的时间何时生效?是在保存流程时生效还是启动流程时生效?应该是在启动流程的时候吧。通过F12找到启动时调用的接口为http://localhost:8080/config/form/submit,在项目中找到该方法,在该方法中加上设置的时间即可,这是我的思路,接下来就想办法实现代码吧!

首先引入需要的jar包,如果你不是maven工程,需要下载jar包,下载地址https://mvnrepository.com/artifact/com.github.snakerflow/snaker-quartz/2.5.1,点击jar即可,将下载jar包导入项目中。

其次在snaker.xml中配置时限控制的拦截器、定时调度的实现类

<bean class="org.snaker.engine.impl.SchedulerInterceptor"/>
<bean class="org.snaker.engine.scheduling.quartz.QuartzScheduler"/>

以上两步已经完成了时限的配置工作,下面就可以针对提醒、超时自动执行做自定义扩展了。

接下来编写自定义的提醒类,实现IRminder接口,并在snaker.xml中配置

<bean class="com.snakerflow.framework.flow.service.SnakerReminder"/>

package com.snakerflow.framework.flow.service;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.snaker.engine.entity.Process;
import org.snaker.engine.model.NodeModel;
import org.snaker.engine.scheduling.IReminder;import java.util.Map;/*** @author Lebron* @ClassName SnakerReminder* @Description 提醒类 TODO* @Date 2020/4/22 15:45* @Version 1.0*/
public class SnakerReminder implements IReminder {private static Log logger = LogFactory.getLog(SnakerReminder.class);@Overridepublic void remind(Process process, String orderId, String taskId, NodeModel nodeModel, Map<String, Object> data) {logger.info("orderId:" + orderId);logger.info("taskId:" + taskId);logger.info("process:" + process.getDisplayName());logger.info("nodeModel:" + nodeModel.getDisplayName());for (String key : data.keySet()) {logger.info(key + ":" + data.get(key));}}
}

回调类代码,回调类的路径也需要配置在工作流中!

<bean class="com.snakerflow.framework.flow.service.SnakerJobCallback"/>
package com.snakerflow.framework.flow.service;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.snaker.engine.entity.Task;
import org.snaker.engine.scheduling.JobCallback;import java.util.List;/*** @author Lebron* @ClassName SnakerJobCallback* @Description 回调类 TODO* @Date 2020/4/22 15:47* @Version 1.0*/
public class SnakerJobCallback implements JobCallback {private static Log logger = LogFactory.getLog(SnakerReminder.class);@Overridepublic void callback(String taskId, List<Task> newTasks) {logger.info("taskId:" + taskId);}
}

最后在启动流程方法中加入配置时间的代码即可,将submit方法修改为

@RequestMapping(value = "submit", method = RequestMethod.POST)public String submit(HttpServletRequest request, long formId) {String processId = request.getParameter(PARA_PROCESSID);String orderId = request.getParameter(PARA_ORDERID);String taskId = request.getParameter(PARA_TASKID);List<Field> fields = dynamicFormManager.getFields(formId);Map<String, Object> params = new HashMap<String, Object>();for (Field field : fields) {if (Field.FLOW.equals(field.getFlow())) {String name = field.getName();String type = field.getType();String paraValue = request.getParameter(name);Object value = null;if ("text".equalsIgnoreCase(type)) {value = paraValue;} else if ("int".equalsIgnoreCase(type)) {if (paraValue == null || "".equals(paraValue)) {value = 0;} else {try {value = Integer.parseInt(request.getParameter(name));} catch (Exception e) {value = 0;}}} else if ("float".equalsIgnoreCase(type)) {if (paraValue == null || "".equals(paraValue)) {value = 0.0;} else {try {value = Double.parseDouble(request.getParameter(name));} catch (Exception e) {value = 0.0;}}} else {value = paraValue;}params.put(name, value);}}Map<String, String[]> paraMap = request.getParameterMap();if (!orderId.equals("") || !taskId.equals("")) {dynamicFormManager.submit(formId, fields, params, request, processId, orderId, taskId);} else {Map<String, Object> args = new HashMap<String, Object>();args.put("time.expireTime", new DateTime(2020, 4, 27, 19, 00).toDate());args.put("time1.reminderTime", new Date());args.put("time1.expireTime", new Date());args.put("time2.reminderTime", new DateTime(2020, 4, 27, 14, 05).toDate());args.put("time2.expireTime", new DateTime(2020, 4, 27, 14, 10).toDate());engine.startInstanceById(processId, "admin", args);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}if (StringUtils.isNotEmpty(processId)) {return "redirect:/snaker/task/active";} else {return "redirect:/config/form";}}

这段代码的属性值根据自己的流程图文件定义,这里我在流程图里定义了变量,下面是我的流程文件,另外如果需要多次提醒的话,需要在snaker.properties中配置snaker.properties,是一个数字,表示提醒的次数。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<process name="test_time" displayName="时间测试" expireTime="time.expireTime" instanceUrl="/snaker/flow/all" >
<start layout="-20,117,50,50" name="start" >
<transition offset="0,-10" to="rect2" name="path5" />
</start>
<task layout="88,115,100,50" name="rect2" displayName="发起审批" form="/config/form/use/1" taskType="Major" performType="ANY" reminderTime="time1.reminderTime" reminderRepeat="2" expireTime="time1.expireTime" autoExecute="Y" >
<transition offset="0,-10" to="rect3" name="path6" />
</task>
<task layout="307,116,100,50" name="rect3" displayName="主管审批" form="/config/form/use/1" assignee="lebron" assigneeDisplay="lebron" taskType="Major" performType="ANY" reminderTime="time2.reminderTime" reminderRepeat="2" expireTime="time2.expireTime" autoExecute="Y" >
<transition offset="0,-10" to="end" name="path7" />
</task>
<end layout="533,115,50,50" name="end" >
</end>
</process> 

从代码中可以看出,我希望这个流程在19:00结束,第一个节点在流程启动的同时执行,第二个节点在14:05提醒,提醒间隔为2分钟,并且在14:10到达期望完成时间,如果到达14:10没有执行,则自动执行,即整个流程走完。通过打断点可以测试出,提醒方式是查询到的流程信息打印在控制台,大家可以根据需求自行编写代码。

Snaker如何配置期望完成时间、提醒时间、重复提醒间隔相关推荐

  1. Windows电脑桌面云便签敬业签怎么预设提醒时间?

    一.打开Windows电脑桌面云便签敬业签并登录账号,点击左上方用户头像,或按下默认快捷键Alt+Z,也可以在云便签主界面右上方找到"设置">"设置",进 ...

  2. qt 文件 时间 倒序排列_win7电脑敬业签便签软件分类标签里的内容如何按提醒时间排列?...

    敬业签是一款功能比较全面的桌面便签软件,主要功能包括:云储存.多端同步.提醒待办事项.时间管理.已完成.时间轴和分类标签等.在分类标签里面记录的内容,如果想要按照提醒时间的先后顺序进行排列,应该如何操 ...

  3. vsftp配置日志及其启用本地时间

    vsftp配置日志及其启用本地时间 1. 启用vsftp日志 xferlog_enable=YES xferlog_std_format=YES xferlog_file=/var/log/xferl ...

  4. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了.可能是电脑出了别的问题了,来看看教程的说法. 正在准备配置w ...

  5. jira字段配置(域配置)_到期日、时间跟踪等根据需要自行配置

    最近,使用jira进行项目管理,出现一些问题,对于其中一些配置,做下记录,后续方便查看,也给需要的人一个参考,传送门: jira使用文档 jira权限设置-各个项目组查看不同项目 jira字段配置(域 ...

  6. 服务器怎么看系统安装时间,配置本地tomcat服务器时间查看时间

    配置本地tomcat服务器时间查看时间 内容精选 换一换 弹性云服务器显示的Windows操作系统时间与本地标准时间不一致.系统时间由于受到网络或一些进程驱动的影响可能会出现和标准时间不一致的情况.手 ...

  7. 定时提醒软件如何设置提醒时间

    1:选择一个分类,然后点击"+新增"(如果是待办分类点击"+新增待办"). 2:输入文本描述内容之后,点击时钟图标开始设置提醒时间.重复周期.重要事项,然后保存 ...

  8. iOS9中如何在日历App中创建一个任意时间之前开始的提醒(三)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 四.创建任意时间之前开始的提醒 现在我们找到了指定源中的指定日 ...

  9. 【Hadoop配置】用最短的时间配置伪分布式Hbase(亲身经历)

    [Hadoop配置]用最短的时间配置伪分布式Hbase(亲身经历) 目录 [Hadoop配置]用最短的时间配置伪分布式Hbase(亲身经历) 一.鸣谢 二.前言 三.从头配置Hbase (一)下载hb ...

最新文章

  1. 【沟通的艺术】故事大王
  2. 计算机图形软件---OpenGL简介
  3. SPARK RDD JAVA API 用法指南
  4. OpenGL基础29:深度测试
  5. 线程池作用及Executors方法讲解
  6. JSONObject依赖包
  7. qt bianyishiliechengxu cube
  8. 服务器上qq邮件不能打开方式,qq邮箱打不开解决方法汇总
  9. tushare复权数据使用
  10. 立创EDA能代替传统的PCB设计软件么?比如AD、protel等?可以
  11. Windows主机加固
  12. 按键精灵---大漠鼠标真实移动轨迹
  13. element-ui upload 组件附带额外参数进行上传(一个或多个参数)
  14. NB-IoT应用3年,揭秘它为何被称 “为抄表而生”
  15. 深度学习笔记(一)了解深度学习
  16. u盘启动计算机看不到硬盘,解决办法:从U盘启动时找不到硬盘的解决方法
  17. 浅析嵌入式系统之uboot详解(5.3)—PWM定时器(番外)
  18. 读书笔记_009 《与神对话》
  19. 移动端区分安卓系统和ios系统
  20. [Nginx] – 安全优化 – 配置文件优化 [二]

热门文章

  1. C语言栈顺序存储的数据结构
  2. 双主动桥隔离双向DC-DC变换器(六)DAB-IBDC在HFLPCS中的应用
  3. 在vscode配置node并调试
  4. 1D/2D/3D卷积详解
  5. js本地存储函数封装基于localStorage本地存储
  6. abb机器人负载配置设定_ABB机器人【 配置设定】大全 , 人手一份,建议永久收藏!...
  7. 面向对象的设计原则(七大原则)
  8. 多媒体计算机辅助教学与课件制作,多媒体计算机辅助教学与课件制作
  9. NumberFormatException:null异常
  10. Autoware入门学习(三)——Autoware软件功能使用介绍(1/3)及demo演示