workflow engine Ruote初体验之一(概念)
由于最近自己写点小东西,需要有工作流程管理方面的应用,所有的环境为Ruby on rails,所有在选择流程引擎的时候选择了ruote,但是对于ruote是完全陌生的,所以在这里记下点滴,如果理解的不正确,还请大家批评指正。
Ruote:用Ruby写的一个工作流引擎。
开始了解Ruote先要了解几个很重要的概念:
- storage 是ruote的核心,保存这所有的持续流程。Storage实现线程安全,多个工作可以同时使用。
- worker 围绕在Storage周围的流程本省。
- engine(dashboard) 包含一些图标和按钮,是所有进程实例的控制面板,能够对进程实例就行运行,暂停,取消操作。
下面是一个Ruote的配置:
require 'ruote'
require 'ruote/storage/fs_storage' engine = Ruote::Engine.new(Ruote::Worker.new(Ruote::FsStorage.new('work')))
这是一个最简单的配置,将engin,worker和storate包装在一起。
Engine的配置选项实际上是在初始化的时候传递给存储的,比如:
require 'ruote'
require 'ruote/storage/fs_storage' engine = Ruote::Engine.new(
Ruote::Worker.new(
Ruote::FsStorage.new(
'work',
'remote_definition_allowed' => true, 'ruby_eval_allowed' => true)))
也可以向下面这样定义:
engine = Ruote::Engine.new(
Ruote::Worker.new(
Ruote::FsStorage.new('work'))) engine.configure('remote_definition_allowed', true)
engine.configure('ruby_eval_allowed', true)
Engin的配置项:
participant_threads_enabled(自从ruote2.3.0版本开始,默认情况是true)
默认情况下, 从work中调度一个流程给参与者的时候都用一个新的Ruby线程。这样在默认情况下不会阻塞worker。
remote_definition_allowed(默认情况下是false)
Remote definitions 是通过Http协议过程定义。因为过程定义是代码,默认情况下用如下方法是不允许的:
Ruote.process_definition :name => 'main process' do
sequence do
subprocess 'http://example.com/definitions/head_process.rb'
subprocess 'http://example.com/definitions/tail_process.rb'
end
end # or engine.variables['head'] = 'http://example.com/definitions/head_process.rb'
engine.variables['tail'] = 'http://example.com/definitions/tail_process.rb' Ruote.process_definition :name => 'main process' do
sequence do
head
tail
end
end # or simply engine.launch('http://example.com/definitions/main.xml')
如果要使用如上的定义,那么应该将‘remote_definition_allowed的选项设置为"true"。
ruby_eval_allowed:(默认是false)
wait_logger_max:(默认是147)
这个设置只是在开发测试环境中一个worker的情况,在其他环境下不用管这个配置。WaitLogger是ruote的一个组件,追踪147个最近的本地工作流程的处理信息。 preserve_configuration:(默认是false)
当这个配置设置为true的时候,engine,worker,storage将不向存储后面持续工作流程写配置。适用于多个工作流程一起运行的情境下。
restless_worker:(默认是false)
更像是一个工作流程的配置,当设置为true的时候,工作流程在提取信息和定时调度执行期间就不会sleep。
worker_state_enabled:(默认是false)
当设置为true的时候,将Ruote::Dashboard中的worker_state解锁,可能的状态包括running,paused,stopped.工作流读取状态执行相应的running,paused,stop操作。
engine on_error / on_terminate:
engine在发生错误和终止的时候触发的事件或者参与者,如下定义:
# you can pass a participant name
engine.on_error = 'administrator' # or a subprocess name
engine.on_error = 'error_procedure' # or directly a subprocess definition
engine.on_error = Ruote.define do
concurrence do
administrator :msg => 'something went wrong'
supervisor :msg => 'something went wrong'
end
end
worker:
目前为止,没有为worker的配置。
storage:
工作流、业务处理被人调用,持续好长时间,数据的持久性是必须的,storage用来保存数据。因为所有的工作流程共享storage,所以不仅要提供可靠的持久数据,而且可以避免工作流之间的冲突。
下面这个表中是实现的storage类型:
multiple workers:storage是否支持多个工作流程。
remote worker:现实工作流程是不是和storage在一个主机上
speed :显示storage的速度排行。

Ruote::HashStorage:
一个字内存中临时的storage,不能够在多个工作流程中共享,大多数用于测试或者临时的工作流程。
Ruote::FsStorage:
以json的格式将ruote的信息保存成文件,可以在多个工作流程中共享数据。
Ruote::Redis::Storage:
基于redis的storage,很快,在多个工作流程的情况下使用。
Ruote::Sequel::Storage:
通用的持久storage,使用Mysql或者PostgreSQL,在多个工作流程的情况下使用。
Ruote::Dm::Storage:
一个 DataMapper storage 实现。
Ruote::Couch::Storage:
一个基于 CouchDB 的Storage实现。
Ruote::Mon::Storage:
MongoDB storage 实现。
Ruote::Beanstalk::BsStorage:
提供一种技术,使FsStorage可以被远程的工作流程可以使用。
十分想找对ruote熟悉的朋友共同学习。
workflow engine Ruote初体验之一(概念)的更多相关文章
- workflow engine Ruote初体验之三(条件与美元符号)
条件 我们可以用:if和:unless公共属性来进行条件判断,或者使用if,given,once或者equals(已经过时)关键字. 使用:if属性: 1 cursor do 2 participan ...
- workflow engine Ruote初体验之二(通用属性)
罗列一下表达式所支持的属性: :timeout :if/ unless :forget :lose :flank :on_error :on_cancel :on_timeout :tag :filt ...
- workflow engine Ruote 安装
今天在安装gem安装Ruote的过程中遇到问题,改用bundle安装: steven@steven-Latitude-D630:/usr$ sudo mkdir bundel [sudo] passw ...
- RPC框架基础概念理解以及使用初体验
RPC:Remote Procedure Call(远程服务调用) RPC是做什么的 通过RPC框架机器A某个进程可以通过网络调用机器B上的进程方法,就像在本地上调用一样. RPC可以基于HTTP或者 ...
- django初体验 学习笔记
django环境搭建 1.安装Python 2.ipython sudo apt-get install ipython sudo pip instal ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- protobuf初体验
概念介绍 Protocol buffers 是google公司的与语言无关.与平台无关的.可扩张的为序列化话结构数据,就像xml一样,办事更加的小巧.快速.简单.Protocol buffers 目前 ...
- Knockout.js初体验
前不久在网上看到一个轻量级MVVM js类库叫Knockout.js,觉得很好奇,搜了一下Knockout.js相关资料,也初体验了一下,顿时感觉这个类库的设计很有意思.接下来就搞清楚什么是Knock ...
随机推荐
- Django之session验证的三种姿势
一.什么是session session是保存在服务端的键值对,Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中. 二.FVB中 ...
- Asp.net自定义控件开发任我行(7)-注册自定义事件
摘要 前面我们已经把嵌入资源讲完了,不知道大家有没有得到收益,本章主要讲自定义事件,也就是给TextBox注册一个点击事件. 引言 不知道道上的朋友有没有注意到TextBox控件没有点击事件,就连网上 ...
- MSSQL将多行单列变一行一列并用指定分隔符分隔,模拟Mysql中的group_concat
-- 将多行记录(只能一个列)用指定分隔符分隔 IF(OBJECT_ID('sp_RowsChangeClosBySplit',N'P') IS NOT NULL) DROP PROC sp_Rows ...
- Leetcode 623.在二叉树中增加一行
在二叉树中增加一行 给定一个二叉树,根节点为第1层,深度为 1.在其第 d 层追加一行值为 v 的节点. 添加规则:给定一个深度值 d (正整数),针对深度为 d-1 层的每一非空节点 N,为 N 创 ...
- Leetcode 576.出界的路劲数
出界的路径数 给定一个 m × n 的网格和一个球.球的起始坐标为 (i,j) ,你可以将球移到相邻的单元格内,或者往上.下.左.右四个方向上移动使球穿过网格边界.但是,你最多可以移动 N 次.找出可 ...
- nodejs、yarn编译安装
yarn和npm一样,是nodejs的一个依赖管理工具 1.安装nodejs 如果缺少c++ compiler 会报错 yum install -y gcc gcc-c++ 安装nodejs V8 ...
- arp_ignore和arp_announce内核参数
arp_announce : INTEGER 对网络接口上本地IP地址发出的ARP报文作出相应级别的限制. 0:本机所有IP地址都向任何一个接口通告ARP报文. 1:尽量仅向该网卡回应与该网段匹配的A ...
- HDU 3333 Turing Tree(离线树状数组)
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- ZOJ 3874 Permutation Graph ——分治 NTT
发现每一块一定是按照一定的顺序的. 然后与标号无关,并且相同大小的对答案的影响相同. 然后列出递推式,上NTT+分治就可以了. 然后就可以与输入同阶处理答案了. #include <map> ...
- vue项目上传文件以及进度条
最近做项目的时候,需要上传自定义镜像.并且附带进度条,上网查询一下资料,经过一番折磨,也总算做出来了,把自己写项目的内容给大家分享一下. 先直接贴代码吧 1.首先声明一个formData对象. 2.把 ...