OSWorkflow是opensymphony组织开发的一个工作流引擎,目前的版本是2.8。
OSWorkflow用纯Java语言编写,并且开放源代码。
它最大的特点就是极其的灵活。
它面向的人群是具有技术背景的软件开发人员。
OSWorkflow不提倡用可视化工具定义流程。
用户可以根据自己的实际需求,来设计出完全符合自身业务逻辑的系统,而并不需要使用复杂的代码去实现。
换句话说OSWorkflow让我们真正解放了,使得我们从底层的代码堆中爬了出来,轻松地用一套通用的引擎机制去实现各种业务流程。
OSWorkflow提供我们所有工作流OSWorkflow开发指南Version1.0October15,2007Somanyopensourceprojects.WhynotOpenyourDocuments?中可能用到的元素例如:步骤(step)、条件(conditions)、循环(loops)、分支(spilts)、合并(joins)、角色(roles)、函数(function)等等。
首先我们来谈谈步骤:步骤是工作流中很重要的概念。
如果我们把工作流比喻成一条从起点站驶向终点站的公共汽车路线,那么步骤就相当于汽车站台。
而汽车有的正在排队等候进站,有的还没有进站,有的刚出站,这样就形成了所谓的“已完成”、“正在处理”、“已添加至处理队列”、“未处理”等状态。
另外一个重要的概念就是动作,动作就是工作流中每一步骤中"需要处理的事情",每一个动作执行完毕以后都有一个结果。
公共汽车停站下客就好比一个动作,动作完成以后,开向下一站,或者加油,或者返程等等就是一个结果。
当然,实际上的工作流远比这辆汽车来的复杂,它涉及到的结果还包括原地踏步停留在同一步骤,或者是流转到另外的步骤中去,或者是流转到一个分支中去,或者汇集到一个合并中等。
如果动作被设置成为auto,那么只要触发器满足条件或者有来自外部的事件工作流便可自动执行。
在许多流程中,如果遇到并行处理某些事情,这就是分支。
分支一般是指并行处理多件事情而没有先后顺序。
若有一条分支进行了回退处理,整个流程都将回退。
与之相对的,合并就是把几条符合条件的分支聚合起来,使得事情变成"殊途同归"。
这也是非常常见的流程,同时也是最复杂的一种流程。
在步骤、动作和结果中都提供了函数功能,函数按执行的先后时机可分为pre-functions和post-functions。
顾名思义,pre-functions就是在事情发生之前执行的,而post-functions就是在事情发生以后执行的。
验证器是用来验证用户输入的数据是否合法的。
它也可以被应用在步骤,动作或结果中。
动作的执行结果可以是有条件的(conditional)也可以是无条件的(unconditional)。
对于有条件结果,可以允许有多个条件。
引擎将首先检查是否有满足的条件,它会逐一进行检查,直到符合的条件被找到才能执行。
如果没有一个条件被满足,那么最终引擎将产生无条件结果。
在每个步骤中调用工作流的人被称之为调用者(caller),而每个步骤都也会有一个所有者(owner),以代表在当前步骤中负责执行动作的角色或用户。
当前用户在执行当前步骤的时候,这些步骤被保留在当前表中(current),而一旦步骤被执行完毕,引擎会马上将这个当前步骤从当前表中移到历史表中(history)。
5OSWorkfow的高级特性有发送邮件,注册器功能,通用动作和全局动作,触发器和定时器等等,以下会一一讲解。
2023/8/8 23:12:50 624KB OSWorkflow-开发指南
1
appid:="************" apikey:="***********88" curtime:=strconv.FormatInt(time.Now().Unix(),10) param:=make(map[string]string) param["engine_type"]="sms16k" param["aue"]="raw" tt,_:=json.Marshal(param) base64_param:=base64.StdEncoding.EncodeToString(tt) w:=md5.New() io.WriteString(w,apikey+curtime+base64_param) checksum:=fmt.Sprintf("%x",w.Sum(nil)) body,_:=ioutil.ReadFile("./ceshi.pcm") base64_audio:=base64.StdEncoding.EncodeToString(body) data:=url.Values{} data.Add("audio",string(base64_audio)) res_body:=data.Encode() client:=&http.Client{} req,_:=http.NewRequest("POST","http://api.xfyun.cn/v1/service/v1/iat",strings.NewReader(res_body)) req.Header.Set("X-Appid",appid) req.Header.Set("Content-Type","application/x-www-form-urlencoded") req.Header.Set("X-Param",base64_param) req.Header.Set("X-CheckSum",checksum) req.Header.Set("X-Curtime",curtime) response,_:=client.Do(req) deferresponse.Body.Close() resp_body,_:=ioutil.ReadAll(response.Body) fmt.Print(string(resp_body))
2023/8/8 21:12:27 1KB 科大讯飞 go语言 语音转写
1
详情请看https://bbs.deepin.org/zh/post/210040下载链接:蓝奏云:https://gfdgdxi.lanzous.com/b01nxu1sh提取码:aser迅雷网盘:https://pan.xunlei.com/s/VMRC_xp80zcxSqFxUD1BkCtmA1,提取码:65sv百度网盘:https://pan.baidu.com/s/1Ww9L_vi2Xh4qmkJYr7eQhA提取码:6t8f(已经投稿到星火商店了,可以在星火商店下载)
2023/8/4 21:36:16 9.51MB linux windows
1
httpclient4.3的二次封装,解决了代理问题、多线程问题、SSL问题、通用的get、post请求
2023/7/28 0:08:58 7KB httpclient
1
java用servlet实现文件上传到数据库2009-03-1914:26index.jsp文件上传web.xmluploadservletUploadupload/servletUploadindex.jsplib:jspupload.jarjava:importjava.io.*;importjava.sql.*;importjavax.servlet.*;importjavax.servlet.http.*;importcom.jspsmart.upload.*;publicclassservletUploadextendsHttpServlet{privateServletConfigconfig;/***初始化Servlet*/finalpublicvoidinit(ServletConfigconfig)throwsServletException{this.config=config;}/***处理GET请求*/publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{PrintWriterout=response.getWriter();out.println("");out.println("");out.println("jspSmartUpload:ServletSample");out.println("");out.println("ThemethodoftheHTMLformmustbePOST.");out.println("");out.println("");}/***响应POST请求*/protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{PrintWriterout=response.getWriter();out.println("");out.pr
1
C#httpGet/POST请求封装类
2023/7/22 0:13:45 5KB http GET POST
1
ER図用户数柱子类型选项ID昵称细绳null:假电子邮件细绳null:false,uniqure:truecreated_at约会时间null:假Updated_at约会时间null:假协会has_many:评论has_many:post_reviews,外键::reviewer_id,class_name::Reviewhas_many:receive_reviews,外键::reviewed_id,class_name::Reviewhas_one:个人资料has_one:卡has_many:buyed_deals,foreign_key::buyer_id,class_name::Dealhas_many:selling_deals,->{where(“buyer_id为NULL”)},has_many:sold
2023/7/16 22:35:38 4.64MB Ruby
1
用户使用发布表单,就像是一次旅行。
旅行的目的是否能达到?过程是否让人满意?这些都决定了用户会否再来这里。
作为设计师,你是否遇到过这种情况:作为用户填表单时,你是否这样想?以上的情境可能有些夸张,但是不可否认的是,有时候我们做表单设计的时候,并没有从用户的角度出发,看他们想要的是什么,而是从我们所在的产品端的角度,让用户去做我们想要他们做的事情。
现在我们把之前的旅行的步骤放到post表单设计中,我们可以得到如下思路:从中我们可以发现,似乎发布前和发布后这两个流程,比较容易被忽略。
而过程中的设计点具体应该如何做呢?作为用户出发看看吧。
思路已经有了,那让我们作为用户出发探索一下post表单吧。
发布前
2023/7/16 11:27:19 754KB 以用户视角出发的表单之旅
1
节点一机器人将机器人部署为独立的服务,通过http或ws与外部通信基于的QQ机器人Http-Api协议的实现当前主分支的下一个版本基本不会再有变化,及时更新依赖即可获得新特性和已知的bug的修复。
使用方法:下载安装下载此原始包(建议用gitclone)执行npmup--no-save安装依赖(已集成自动安装)重命名config.sample.js为config.js并配置运行nodemain123456789(数字是登陆账号)即将启动只需最后一步只有首次登陆时需要交互(密码,验证码,设备锁),之后推荐使用pm2或forever等部署工具。
通信HTTP和正向WS服务器POST上报(多点)反向WS连接(多点)API()已实现(文档中已列出)名称备注get_friend_listget_group_listget_group_infoget_group_member_listget_group_member_infoget_stranger_infosend_private_msgmessage_id是字
2023/7/14 6:53:27 15KB nodejs android bot npm
1
通过POST请求和GET请求的方式实现服务端,客户端的服务调用操作
2023/7/5 2:12:45 12.52MB WCF接口
1
共 192 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡