xyz20003

www.mossle.com
随笔 - 34, 文章 - 0, 评论 - 124, 引用 - 0
数据加载中……

2009年11月6日

spring security权限管理手册升级至spring security-3.1.3

费了半天劲,终于把原来基于spring security 2.0.5的权限管理手册升级到3.1.3。

除了官方已经不再支持ntlm和portal两个例子之外,其他的实例都已经通过了测试。下一步计划是对整体内容进行整理,再加上3.1.3提供的新功能。

 

目录索引链接如下:

 

序言
I. 基础篇

1. 一个简单的HelloWorld

1.1. 配置过滤器
1.2. 使用命名空间
1.3. 完善整个项目
1.4. 运行示例
2. 使用数据库管理用户权限

2.1. 修改配置文件
2.2. 数据库表结构
3. 自定义数据库表结构

3.1. 自定义表结构
3.2. 初始化数据
3.3. 获得自定义用户权限信息

3.3.1. 处理用户登陆
3.3.2. 检验用户权限
4. 自定义登陆页面

4.1. 实现自定义登陆页面
4.2. 修改配置文件
4.3. 登陆页面中的参数配置
4.4. 测试一下
5. 使用数据库管理资源

5.1. 数据库表结构
5.2. 初始化数据
5.3. 实现从数据库中读取资源信息

5.3.1. 需要何种数据格式
5.3.2. 替换原有功能的切入点
6. 控制用户信息

6.1. MD5加密
6.2. 盐值加密
6.3. 用户信息缓存
6.4. 获取当前用户信息
7. 自定义访问拒绝页面
8. 动态管理资源结合自定义登录页面
9. 中文用户名
10. 判断用户是否登录
II. 保护web篇

11. 图解过滤器

11.1. HttpSessionContextIntegrationFilter
11.2. LogoutFilter
11.3. AuthenticationProcessingFilter
11.4. DefaultLoginPageGeneratingFilter
11.5. BasicProcessingFilter
11.6. SecurityContextHolderAwareRequestFilter
11.7. RememberMeProcessingFilter
11.8. AnonymousProcessingFilter
11.9. ExceptionTranslationFilter
11.10. SessionFixationProtectionFilter
11.11. FilterSecurityInterceptor
12. 管理会话

12.1. 添加监听器
12.2. 添加过滤器
12.3. 控制策略

12.3.1. 后面的用户禁止登陆
12.3.2. 后登陆的将先登录的踢出系统
13. 单点登录

13.1. 配置JA-SIG
13.2. 配置Spring Security

13.2.1. 添加依赖
13.2.2. 修改applicationContext.xml
13.3. 运行配置了cas的子系统
13.4. 为cas配置SSL

13.4.1. 生成密钥
13.4.2. 为jetty配置SSL
13.4.3. 为tomcat配置SSL
14. basic认证

14.1. 配置basic验证
14.2. 编程实现basic客户端
15. 标签库

15.1. 配置taglib
15.2. authenticaiton
15.3. authorize
15.4. acl/accesscontrollist
15.5. 为不同用户显示各自的登陆成功页面
16. 自动登录

16.1. 默认策略
16.2. 持久化策略
17. 匿名登录

17.1. 配置文件
17.2. 修改默认用户名
17.3. 匿名用户的限制
18. 防御会话伪造

18.1. 攻击场景
18.2. 解决会话伪造
19. 预先认证

19.1. 为jetty配置Realm
19.2. 配置Spring Security
20. 切换用户

20.1. 配置方式
20.2. 实例演示
21. 信道安全

21.1. 设置信道安全
21.2. 指定http和https的端口
22. digest认证

22.1. 配置digest验证
22.2. 使用ajax实现digest认证
22.3. 编程实现digest客户端
23. 通过LDAP获取用户信息
24. 通过OpenID进行登录

24.1. 配置
24.2. 系统时间问题
24.3. openid4java的处理流程
25. 使用X509登录

25.1. 生成证书
25.2. 配置服务器使用双向加密
25.3. 配置X509认证
26. 使用NTLM登录
27. 使用JAAS机制
28. 使用HttpInvoker
29. 使用rmi
30. 控制portal的权限
31. 保存登录之前的请求
32. 记录操作日志
III. 内部机制篇

33. 保护方法调用

33.1. 控制全局范围的方法权限
33.2. 控制某个bean内的方法权限
33.3. 使用annotation控制方法权限

33.3.1. 使用Secured
33.3.2. 使用jsr250
34. 权限管理的基本概念

34.1. 认证与验证
34.2. SecurityContext安全上下文
34.3. Authentication验证对象
35. Voter表决者

35.1. Voter表决者
35.2. RoleVoter
35.3. AuthenticatedVoter
35.4. AbstractAclVoter
36. 拦截器

36.1. 权限配置数据源
36.2. 权限管理器
36.3. 后置调用管理器
36.4. 临时分配额外权限
37. 用户信息

37.1. UserDetails
37.2. 使用角色继承
37.3. 为ACL添加角色继承
37.4. PasswordEncoder和SaltValue
38. 集成jcaptcha
39. 动态资源管理

39.1. 基本知识
39.2. 读取资源
39.3. URL资源扩展点
39.4. METHOD资源扩展点
40. 扩展UserDetails

40.1. 实现UserDetails接口
40.2. 实现UserDetailsService接口
40.3. 修改配置文件
40.4. 测试运行
41. 锁定用户
42. 设置过滤器链
43. 自定义过滤器
44. 使用用户组

44.1. 数据库结构
44.2. 修改配置文件
45. 在JSF中使用Spring Security

45.1. 修改过滤器支持forward
45.2. 自定义登录页面
45.3. 显示密码错误信息
46. 自定义会话管理

46.1. 默认策略的缺陷
46.2. 记录用户名与ip
46.3. 改造控制类
46.4. 修改配置文件
47. 匹配URL地址

47.1. AntPathRequestMatcher
47.2. RegexRequestMatcher
48. 配置过滤器

48.1. 标准过滤器
48.2. 在http中启用标准过滤器
48.3. 为自定义过滤器设置位置
49. 监控会话过期

49.1. 实现原理
49.2. 代码实现
49.3. 目前实现的缺陷
50. 多个登陆页面

50.1. 未登录自动跳转到对应的登录页面
50.2. 密码出错时返回对应页面
51. 角色继承

51.1. 使用RoleHierarchyVoter
51.2. 使用数据库实现RoleHierarchy
52. 设置方法拦截器
IV. ACL篇

53. ACL基本操作

53.1. 准备数据库和aclService

53.1.1. 为acl配置cache
53.1.2. 配置lookupStrategy
53.1.3. 配置aclService
53.2. 使用aclService管理acl信息
53.3. 使用acl控制delete操作
53.4. 控制用户可以看到哪些信息
54. 管理acl

54.1. 管理多个domain类
54.2. 动态授权与收回授权

54.2.1. 获得对象的acl权限
54.2.2. 添加授权
54.2.3. 收回授权
55. acl自动提醒

55.1. 自动创建acl
55.2. 自动删除acl
55.3. 根据id删除acl
V. 最佳实践篇

56. 最简控制台

56.1. 平台搭建
56.2. 用户登录
56.3. 用户信息列表
56.4. 添加用户
56.5. 修改用户信息
56.6. 修改自己的密码
57. 用户组控制台

57.1. 添加对用户组的支持
57.2. 浏览用户组
57.3. 创建用户组
57.4. 修改用户组
A. 修改日志
B. 常见问题解答
C. Spring Security-3.0.0.M1

C.1. Hello World
C.2. Spring-EL
C.3. RoleHierarchy
C.4. Success Handler
C.5. REST下的权限控制
C.6. 管理会话同步
D. 命名空间

D.1. http
D.2. authentication-provider
D.3. ldap-server
D.4. global-method-security
E. 数据库表结构

E.1. User
E.2. Group
E.3. RememberMe
E.4. ACL
F. 异常
G. 事件
H. RBAC模型(转载)

H.1. RBAC模型介绍
H.2. 有关概念

H.2.1. 什么是角色
H.2.2. 角色与用户组
H.3. 基本模型RBAC0

H.3.1. RBAC0 模型的形式定义如下
H.4. 角色分级模型RBAC1

H.4.1. 定义2:RBAC1 由以下内容确定
H.5. 限制模型RBAC2

H.5.1. 定义3:
H.6. 统一模型RBAC3
H.7. 定义4
H.8. 在ARBAC97中,包括三种组件
H.9. RBAC模型的特点
H.10. 基于party的模型
H.11. 有关operation
I. 认证流程

posted @ 2012-12-08 01:04 临远 阅读(6109) | 评论 (7)编辑 收藏

轻量级工作流引擎jBPM 4.4正式发布

jBPM-4.4于2010年7月19日正式发布。

jBPM是jBoss旗下的一款开源工作流引擎,它的特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。



jBPM 4是jBPM的最新一代产品,它提供的PVM(流程虚拟机)可以支持多种流程语言,默认支持的是jBPM自己的jPDL流程语言,从jBPM-4.3开 始,又提供了对BPMN-2.0的支持(不过还不完全)。jBPM的发布包中提供了一键式安装的ant脚本,可以将jBPM流程引擎以及配套的管理控制 台,流程设计器一次性安装到本机上运行使用。

安装配置的详细步骤可以参考官方的用户手册:http://www.family168.com/tutorial/jbpm4.0/html/installation.html

最新发布的jBPM-4.4中解决了108个issue,不过它距离上次发布也半年有余了,jBPM-4.3发布于2009年12月底。

jBPM-4.4是一个bug fix版本,并未对数据库有任何修改,使用之前版本的项目基本可以平滑升级。在进行升级时需要注意:

1.Activity和Transition两个接口从org.jbpm.pvm.internal.model包下移动到了 org.jbpm.api.model包下。
2.所有与el表达式相关的部分都替换为新加的org.jbpm.pvm.internal.el.Expression。

添加的几个重要功能:
1.for each支持动态的并发分支流程,会签和并发子流程都可以用它来实现了。
2.assign活动,可以对变量的值进行复制。
3.变量声明,可以在xml里声明变量。
4.修正了console在tomcat下找不到dataSource的问题(包括报表)。

详细的发布信息,请参考官方的JIRA:https://jira.jboss.org/secure/ReleaseNote.jspa?projectId=10052&version=12314183

用Alejandro的话说,This makes 4.4 the most cat-friendly jBPM yet!下个版本会对数据库结构进行修改了,以便完善流程历史库的功能。

相关的发布下载与文档资源如下:
Subversion tag: http://anonsvn.jboss.org/repos/jbpm/jbpm4/tags/jbpm-4.4/
Maven artifact: http://repository.jboss.org/nexus/content/repositories/releases/org/jbpm/jbpm4/jbpm/4.4/
SourceForge file: https://downloads.sourceforge.net/project/jbpm/jBPM%204/jbpm-4.4/jbpm-4.4.zip

User Guide: http://docs.jboss.com/jbpm/v4/userguide/html_single/
Developer Guide: http://docs.jboss.com/jbpm/v4/devguide/html_single/
Maven Artifact: http://repository.jboss.org/nexus/content/repositories/releases/org/jbpm/jbpm4/jbpm/4.4/

另附我们翻译的用户手册和开发指南:
用户手册:http://www.family168.com/tutorial/jbpm4.0/html/index.html
开发指南:http://www.family168.com/tutorial/jbpm4devguide/html/index.html

posted @ 2010-07-20 16:20 临远 阅读(2371) | 评论 (3)编辑 收藏

拖延一个多月后,jBPM-4.4发布CR1候选版

Alejandro太谨慎了,发布jBPM-4.4之前还搞了一个CR1候选版,被jBPM-4.3里那些bug困扰的同志可以直接下载这个版本使用了, 这个候选版和jBPM-4.4最终发布版基本不会有太大区别,下载地址如下:

http://sourceforge.net/projects/jbpm/files/jBPM%204/jbpm-4.4/jbpm-4.4.CR1.zip/download

在之前的帖子jBPM 4.4发布日期暂定于2010年6月4日里提到的几个新特性都有了结果:

1.支持foreach,这个是真正的动态分支功能,想玩会签吗?想玩动态分支吗?想实现动态子流程吗?用foreach就对了。

2.支持在jpdl的xml中声明变量,可以声明实例级全局变量,也可以声明活动级的局部变量。

现在这两个重量级的功能都可以使用了。

对于BPMN2的支持也加强了一部分,包括m选n的inclusive gate way和可以定时启动的TimerStartEventActivity。不过BPMN2新增的功能都是joraz走之前实现的,以后jBPM 4的BPMN2能走多远还是未知数。

jBPM 4.4目前解决了100多个issue,详细的issue列表可以参考这里:

https://jira.jboss.org/secure/ReleaseNote.jspa?projectId=10052&version=12314183

最后双手合十,诚信祷告jBPM-4.4早日发布。这样我们才能集中精力开始下一阶段的开发。

posted @ 2010-07-15 22:18 临远 阅读(1451) | 评论 (2)编辑 收藏

jBPM 4.4发布日期暂定于2010年6月4日

jbpm官方终于传来好消息,jBPM 4.4可能在下月初发布。以下是当前project leader的声明:

We are down to 9 unresolved issues left before releasing 4.4. Given the current progress, it should be possible to release jBPM 4.4 on June 4th; the date is of course tentative and subject to change. Right now the only blocker issue is JBPM-2872: fix hudson db job. All others are deferrable if not completed on time.

If you feel like there is an issue that should not be left out, the time to bring it up is now. Visit the developers forum if you want to do so.


声明地址:http://community.jboss.org/thread/152282?tstart=0

简单来说,就是还剩下9个未处理事务,按当前进度应该可以在6月4日发布jBPM 4.4,其中最重要的问题是修正hudson下的db任务。最后向社区征集意见,如果谁感觉有啥issue应该在jbpm 4.4里解决的话,就赶快提出来撒。

jBPM 4.4的详细发布信息可以参考这里https://jira.jboss.org/secure/ReleaseNote.jspa?projectId=10052&version=12314183, 一共是75个issue,目前已解决66个。这个版本主要是进行bug fix,也提供了几个重量级的新功能。

1.解决嵌套fork/join每次嵌套会出现多余execution的问题。
2.任务超时或者手工执行signal后,自动删除过期task。
3.让sub-process的id和key都支持表达式。
4.支持在xml中声明变量。(还在讨论中)
5.在fork中使用assignmentHandler会抛出NullPointerException。

另外还有for-each动态fork分支这个功能,还在研究是不是要放在jbpm-4.4里,感兴趣的同志可以来官方论坛提出意见。
http://community.jboss.org/thread/152243?tstart=0

posted @ 2010-05-24 09:57 临远 阅读(1750) | 评论 (0)编辑 收藏

jBPM创始人发布BPMN原生引擎Activiti-5.0-alpha1

Tom Baeyens也就是jBPM的原作者,离开了Red Hat之后,另起炉灶搞了一个Activiti的项目,这个项目是基于BPMN的原生流程引擎。

那么这个activiti到底有啥好处呢?让咱们一一道来:

它基于的Apache 2.0开源协议,比jBPM的LGPL更加宽松。

它是基于BPMN2.0标准规范的,最大的好处就是可以用oryz这个web流程设计器直接在web浏览器上设计流程了。(注:别高兴太早,oryz是用svg写的,IE一律不支持。)

它是基于ibatis的,数据库层不再对hibernate有依赖。(注:alpha1只支持h2database,后面的版本会对mysql, oracle,postegl进行支持)

选用BPMN作为标准流程语言,也意味着原来的jBPM里的jPDL流程语言将不会被继续支持,也不知道PVM流程虚拟机是否会继续下去,如果Tom不想 玩虚拟机了,activiti很可能就是一个只支持一种流程语言的引擎了。这点确实让人感到有点儿遗憾。

从www.activiti.org这个网站上可以下载到alpha1的发布包,其中包含了源代码,草草看了一下,核心库只有200多K,其中把原来自行实现的IoC自动注入的代码都删掉了。以后的IoC工作可能统一交给spring去管理,这对使用spring的同志来说,无疑是一个天大的好消息。

api部分对外部接口进行了简化,ExternalActivityBehaviour不见了,换成了EventActivityBehaviour,这一点让我感觉很舒服,毕竟signal其实也只是事件的一种特例,换成eventActivityBehaviour之后,也就意味着我们可以让活动节点支持更多事件处理操作了。

持久化部分换成了ibatis,这部分暂时还只支持h2database,脚本什么的也只有h2database的,虽然因为alpha1版本,功能不多情有可原,但是我还是担心使用ibatis会否大幅度增加数据库存储部分的维护量。希望后续发展不要因为这部分的问题遇到障碍。

表结构似乎和原来的jbpm4差不多,有些表名发生了变化。表的数目又少了很多,但是我情愿认为这不是为了优化,而是因为这个版本不成熟,因为看不到log和history相关的表,所以,现在这个版本应该是没有历史留痕功能的。也没有看到变量表,也许都是用二进制的方式来保存的吧?

对BPMN2支持的部分,目前支持StartEvent, EndEvent, Task和UserTask,其他的都不支持,所以还是需要时间完善的。

实际上Tom和Joram的编码能力还是相当惊人的,从他们俩离开Red Hat到现在才不过两个月,就立刻搞出这么一个东西,而且网站也搞得有模有样的,真心希望他们能延续RoadMap,把这个项目完善起来。

项目首页:http://www.activiti.org/

posted @ 2010-05-20 09:25 临远 阅读(2160) | 评论 (1)编辑 收藏

请把acegi替换成Spring Security(内附视频)

在对web项目进行权限管理时,采用的方法无非是写一大堆JSP或者干脆一个Filter搞定。写完简单的权限功能后,又开始考虑如何自动记忆上次用户信 息,限制每台机器只能有一个用户登录,把用户密码进行加密。接着更上一层楼,尝试实现单点登录,使用HTTPS保护传输数据,防御会话伪造攻击等等。

于是好几年前出现了名叫acegi的东西,它建立在spring的基础上,提供了可以丰盛的权限功能集合,同时也以极为变态的复杂配置给了我们这 些初试权限的人闷头一棍。甚至网上已经有人流传“every time you use acegi, a fairy die”——每当有人使用acegi时,就会有一个精灵死去。

正因为如此,acegi在加入spring阵营时,不但改头换面改名成为Spring Security,而且在配置方面进行了极大的简化,形象的来说就是:“现在只需要20行的配置文件就可以完成之前几百行才能实现的功能”。

遗憾的是,现在依然可以看到还有人在使用acegi,甚至还有人在学习acegi,这种情况无疑让我们感到痛心疾首。

为了世界上不会再有精灵无谓牺牲,也为了大家的身心健康,我在此大声疾呼:“请把acegi替换成Spring Security。”尤其对那些希望学习acegi的同志,请直接学习Spring Security。

下面是《请把acegi替换成Spring Security》的附带视频,希望大家了解Spring Security的简洁。
http://code.google.com/p/family168/downloads/detail?name=springsecurity.zip

posted @ 2010-03-22 09:59 临远 阅读(2866) | 评论 (4)编辑 收藏

跟我学工作流——jBPM4视频教程(免费)

新的一年,为了让工作流方面的初学者更快上手开发,我们录制了jBPM 4视频教程,这套教程基于最新发布的jBPM 4.3,覆盖了开发环境的搭建,jBPM 4与WEB工程的集成,请假流程的完整实例,jBPM 4的组织机构,事件监听,以及流程图的跟踪等功能。

我们的网站提供了相关视频和实例的免费下载,对工作流以及jBPM 4有兴趣的朋友可以关注一下,也希望更多朋友在工作流方面给我们提出建议。jBPM 4视频教程首页:http://www.family168.com/jbpm4/video.html

《jBPM 4视频教程》:基于jBPM 4.3,发布日期2010-3-5。
NO. 分级 标题  
01 《配置开发环境》:下载jBPM 4和eclipse,安装GPD流程设计器,设计简单流程。 下载   提意见
02 《管理流程定义》:将流程定义发布到流程引擎中,实现查看和删除流程定义的功能。 下载   提意见
03 《管理流程实例》:发起新流程,使暂停的流程继续运行,实现终止和删除流程实例。 下载   提意见
04 《设计请假流程》:以请假审批流程为例,以web的方式发布新流程定义。 下载   提意见
05 《发起新流程》:在流程定义中设置任务分配,提供接收和完成任务的功能。 下载   提意见
06 《流程驳回》:实现流程驳回和重新提交申请的功能。 下载   提意见
07 《组织机构》:介绍jBPM 4中默认提供的组织机构。 下载   提意见
08 《监听事件》:为流程定义设置事件,监听流程执行时触发的事件。 下载   提意见
09 《跟踪流程图》:显示流程图,跟踪当前路程实例的状态。 下载   提意见
www.family168.com - Lingo


posted @ 2010-03-06 10:02 临远 阅读(5755) | 评论 (11)编辑 收藏

jBPM-4.x常见问题解决方案FAQ

     摘要: 这段时间整理的jBPM-4.x常见问题以及解决方案,希望帮助对jBPM-4.x感兴趣的同学少走弯路,如果有没有覆盖到的问题,请及时和我们联系,我们会尽快更新这个FAQ,先说一句多谢了。:)  阅读全文

posted @ 2010-01-22 09:19 临远 阅读(2409) | 评论 (3)编辑 收藏

Spring Security-3.0.1中文官方文档(翻译版)

     摘要: 这次发布的Spring Security-3.0.1是一个bug fix版,主要是对3.0中存在的一些问题进行修正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行了修正,建议开发者以这一版本的文档为参考。

另:Spring Security从2010-01-01以后,版本控制从SVN换成了GIT,我们在翻译文档的时候,主要是根据SVN的变化来进行文档内容的比对,这次换成GIT后,感觉缺少了之前那种文本比对工具,如果有对GIT熟悉的朋友,还请推荐一下文本比对的工具,谢谢。  阅读全文

posted @ 2010-01-19 09:37 临远 阅读(5380) | 评论 (0)编辑 收藏

轻量级工作流jBPM-4.3官方“开发指南”中文版



jbpm4devguide

jBPM-4.3开发手册

1.0

2009-05-16 19:29:47


序言
1. 简介
1.1. 目标读者
1.2. 概述
1.3. 源代码和WIKI
1.4. Maven仓库
1.5. 依赖库
2. 孵化器
2.1. timer定时器
2.1.1. 持续时间表达式
2.1.2. 工作日历
2.1.3. 定时器流向
2.1.4. 定时器事件
2.1.5. 定时器工作时间
2.1.6. 定时器重复
2.2. group活动
2.2.1. 简单group
2.2.2. group定时器
2.2.3. group多入口
2.2.4. group同步
2.2.5. group秘密
2.3. 规则发布器
2.4. java 活动
2.5. rules-decision 活动
2.6. rules 活动
2.7. jms 活动
2.7.1. 为简化测试模拟JMS提供器
2.7.2. 文本消息
2.7.3. 对象消息
2.7.4. Map消息
2.8. 历史会话链
2.9. 创建认证组
2.10. 任务表单
2.10.1. 使用方法
2.10.2. 表单格式
2.11. 实例迁移
2.11.1. 简单迁移
2.11.2. 结束运行中的实例
2.11.3. 版本范围
2.11.4. 活动映射
2.11.5. 迁移处理器
2.12. 用户对象缓存
2.13. 事务
2.13.1. 独立事务
2.13.2. JTA事务
2.13.3. 用户事务
3. BPMN 2.0
3.1. BPMN 2.0是什么呢?
3.2. 历史和目标
3.3. JPDL vs BPMN 2.0
3.4. Bpmn 2.0 执行
3.5. 配置
3.6. 实例
3.7. 流程根元素
3.8. 基本结构
3.8.1. 事件
3.8.2. 事件:空启动事件
3.8.3. 事件:空结束事件
3.8.4. 事件:终止结束事件
3.8.5. 顺序流
3.8.6. 网关
3.8.7. 网关:唯一网关
3.8.8. 网关:并行网关
3.8.9. 任务
3.8.10. 任务:人工任务
3.8.11. 任务:Java服务任务
3.8.12. 任务:脚本任务
3.8.13. 任务:手工任务
3.8.14. 任务:java接收任务
3.9. 完全的实例(包括控制台任务表单)
4. 从jBPM3转换到jBPM4
4.1. jBPM 4的目标
4.2. 知识范围
4.3. 流程转换工具
4.3.1. 概述
4.3.2. 参数
4.3.3. 使用示例
4.3.4. 高级应用
4.4. 解释和修改
5. 流程虚拟机
6. 架构
6.1. APIs
6.2. 活动API
6.3. 事件监听API
6.4. 客户端API
6.5. 环境
6.6. 命令
6.7. 服务
7. 实现基本活动
7.1. ActivityBehaviour
7.2. ActivityBehaviour实例
7.3. ExternalActivityBehaviour
7.4. ExternalActivity实例
7.5. 基本流程执行
7.6. 事件
7.7. 事件传播
8. 流程剖析
9. 高级图形执行
9.1. 循环
9.2. 默认执行行为
9.3. 功能活动
9.4. 执行和线程
9.5. 流程同步
9.6. 异常处理器
9.7. 流程修改
9.8. 锁定和流程状态
10. 配置
10.1. 基本配置
10.2. 自定义工作日历
10.3. 自定义身份认证组件
11. 持久化
12. 计划执行器
12.1. 概述
12.2. 配置
13. 高级邮件支持
13.1. 生产者
13.1.1. 默认生产者
13.2. 模板
13.3. 服务器
13.3.1. 多服务器
13.4. 扩展点
13.4.1. 自定义生产者
13.4.1.1. 例子:自定义附件
14. 软件日志
14.1. 配置
14.2. 目录
14.3. JDK日志
14.4. 调试持久化
15. 历史
16. JBoss集成
16.1. 打包流程归档
16.2. 把流程归档发布成一个jBoss实例
16.3. 流程发布和版本管理
16.4. 流程引擎和J2EE/JEE编程模型
17. Spring集成
17.1. 概述
17.2. 配置
17.3. 使用
17.4. 测试
18. Signavio web建模器
18.1. 简介
18.2. 安装
18.3. 配置
A. 修改日志


posted @ 2009-12-30 11:19 临远 阅读(4341) | 评论 (2)编辑 收藏

轻量级工作流jBPM-4.3官方“用户手册”中文版



jBPM4.3用户指南

翻译官方文档

JBoss jBPM Teams

4.3

family168

2009年11月1日



1. 导言
1.1. 许可证与最终用户许可协议
1.2. 下载
1.3. 源码
1.4. 什么是jBPM
1.5. 文档内容
1.6. 从jBPM 3升级到jBPM 4
1.7. 报告问题
2. 安装配置
2.1. 发布
2.2. 必须安装的软件
2.3. 快速上手
2.4. 安装脚本
2.5. 依赖库和配置文件
2.6. JBoss
2.7. Tomcat
2.8. Signavio基于web的流程编辑器
2.9. 用户web应用
2.10. 数据库
2.10.1. 创建或删除表结构
2.10.2. 更新已存在的数据库
2.11. 流程设计器(GPD)
2.11.1. 获得eclipse
2.11.2. 在eclipse中安装GPD插件
2.11.3. 配置jBPM运行时
2.11.4. 定义jBPM用户库
2.11.5. 在目录中添加jPDL4模式
2.11.6. 导入示例
2.11.7. 使用ant添加部分文件
3. 流程设计器(GPD)
3.1. 创建一个新的流程文件
3.2. 编辑流程文件的源码
4. 部署业务归档
4.1. 部署流程文件和流程资源
4.2. 部署java类
5. 服务
5.1. 流程定义,流程实例和执行
5.2. ProcessEngine流程引擎
5.3. Deploying a process部署流程
5.4. 删除流程定义
5.5. 启动一个新的流程实例
5.5.1. 最新的流程实例
5.5.2. 指定流程版本
5.5.3. 使用key
5.5.4. 使用变量
5.6. 执行等待的流向
5.7. TaskService任务服务
5.8. HistoryService历史服务
5.9. ManagementService管理服务
5.10. 查询 API
6. jPDL
6.1. process流程处理
6.2. 控制流程Activities活动
6.2.1. start启动
6.2.2. State状态节点
6.2.2.1. 序列状态节点
6.2.2.2. 可选择的状态节点
6.2.3. decision决定节点
6.2.3.1. decision决定条件
6.2.3.2. decision expression唯一性表达式
6.2.3.3. Decision handler决定处理器
6.2.4. concurrency并发
6.2.5. end结束
6.2.5.1. end process instance结束流程处理实例
6.2.5.2. end execution结束流向
6.2.5.3. end multiple多个结束
6.2.5.4. end State结束状态
6.2.6. task
6.2.6.1. 任务分配者
6.2.6.2. task候选人
6.2.6.3. 任务分配处理器
6.2.6.4. 任务泳道
6.2.6.5. 任务变量
6.2.6.6. 在任务中支持e-mail
6.2.7. sub-process子流程
6.2.7.1. sub-process变量
6.2.7.2. sub-process外出值
6.2.7.3. sub-process外向活动
6.2.8. custom
6.3. 原子活动
6.3.1. java
6.3.2. script脚本
6.3.2.1. script expression脚本表达式
6.3.2.2. script 文本
6.3.3. hql
6.3.4. sql
6.3.5. mail
6.4. Common activity contents通用活动内容
6.5. Events事件
6.5.1. 事件监听器示例
6.5.2. 事件传播
6.6. 异步调用
6.6.1. 异步活动
6.6.2. 异步分支
6.7. 用户代码
6.7.1. 用户代码配置
6.7.2. 用户代码类加载器
7. Variables变量
7.1. 变量作用域
7.2. 变量类型
7.3. 更新持久化流程变量
8. Scripting脚本
9. Configuration配置
9.1. 工作日历
9.2. Email
A. 修改日志


posted @ 2009-12-30 11:18 临远 阅读(2697) | 评论 (1)编辑 收藏

敬献Spring Security-3.x版官方文档中文版

     摘要: Spring Security-3.x新近发布,整体的项目结构和包名都出现了天翻地覆的变化,与此同时,Spring Security-3.x中也提供了session-management和SpEL的多种强大功能,family168第一时间提供官方文档的翻译版 本,希望同大家一起领略Spring Security-3.x的最新时髦风尚。 介于Spring Security官方文档本身倾向于技术...  阅读全文

posted @ 2009-12-29 11:39 临远 阅读(5762) | 评论 (9)编辑 收藏

让软件开发慢下来

你在做软件开发吗?

在启动项目前是否做好技术选型了呢?
在设计前是否已经理顺大体需求了呢?
在编码前是否已经反复思索过对应的设计呢?
在测试前是否已经准备好测试用例呢?
在部署交付前是否已经计划好具体的功能列表呢?

考虑过项目的性质吗?互联网应用,还是内部网应用。
弄清了项目规模大小吗?3人月可以搞定的小项目,还是需要几十人月的长期奋战?
确定团队的实力了吗?是全员光头新人,还是在某牛带领下的小马集团,还是经验丰富的水路两栖冲锋队?
如何与客户协同合作?瀑布式一次理清所有需求,还是需要分阶段迭代,或者直接进驻客户公司面对面开发?

是否要使用框架呢?还是选择最基本的jsp, jdbc应用。
编码与项目如何管理,使用版本控制工具?还是用U盘copy过来,copy过去?
如果选择版本控制工具,究竟哪一款才适合自己的情况?
系统如何划分层次?五层?三层?其他方式?
模块如何划分,按功能?按业务?混合分块?
开发如何分工,横向分工,各层之间接口对接?竖向划分每个人负责从前到后一整块。

如何测试?手工点点,还是使用自动化测试工具。
测试用例如何确定,如何提高测试的有效性。
测试的结果如何反馈给开发过程,需要使用excel还是issue跟踪系统?
测试过程中可以暴露并发,事务等隐性问题吗?
性能测试如何进行,压力指数应该保证到多少?

后期维护的方式的选择。
如何维护数据库表结构?每次exp整个数据库,到客户公司imp,还是找一个员工手工比对所有表结构,还是直接实现数据库版本化管理?
如何为系统打补丁?视图层的补丁,服务层的补丁,依赖库的补丁。如何管理,如何实施,如何测试?
系统是否拥有动态部署的能力?在系统升级的过程中是否可以减小出错的可能?

。。。。。。

还有很多,还有很多。有些问题可以通过技术解决,有些问题需要根据具体条件进行分析,有些需要尽力规避,有些需要硬着头皮强顶硬撑。

在考虑清楚这些问题可能带来的各种问题之前,让软件开发慢下来,至少慢一点点也是好的,进行下一步骤之前先了解如果出现了问题该如何应对,如何解决。

posted @ 2009-12-25 10:42 临远 阅读(1816) | 评论 (4)编辑 收藏

[译]Spring 3.0发布:基于Java 5开发,添加了新的表达式语言和对REST的支持

原文地址:http://www.infoq.com/news/2009/12/spring30

同志们,Spring框架的3.0版本终于在今天发布啦。InfoQ特别对话了Spring框架项目的技术头领Juergen Hoeller,从他口中了解到不少关于这次发布对Spring集团带来的改变。

Hoeller详细罗列了Spring 3.0中的各项新特性:

* 基于Java 5 - 目前核心API已经使用了Java 5的特性,诸如泛型、注解等等,因此现在Spring 3.0必须使用Java 5和以后版本才能跑起来。

* Spring表达式语言(SpEL) - 这个和JSF中的统一EL类似,我们可以很容易在Spring 3.0中使用复杂表达式了。

* 提升对基于注解组件的支持 - Spring JavaConfig其中的一些功能已经被迁移到核心框架中,比如@Configuration,@Bean和@DependsOn。

* 可以使用约束注解声明对模型的校验方式 - 提供了对JSR 303的支持,我们可以使用注解为bean添加诸如@NotNull和@Max(23)的校验规则。

* Spring MVC中提供对REST的综合支持 - 添加了在服务器端和客户端使用RESTful应用的功能。

* 提供对Java EE 6的支持 - 支持了许多Java EE 6中的功能,比如JPA 2.0和JSF 2.0,让它们可以运行在非EE 6的容器下,比如Tomcat和J2EE 1.4应用服务器。

* 提供对JSR 330的支持 - 现在Spring已经支持了JSR 330中介绍的javax.inject注解。

* 基于注解进行格式化 - bean的属性可以使用注解来自动进行格式化和类型转换,比如@DateFimeFormat(iso=ISO.DATE)和@NumberFormat(style=Style.CURRENCY)。

Spring还提供了完整的修改日志参考文档。(译者注:文档方面Spring做的确实太好了,也再次感谢满江红团队的辛勤劳动。)

Hoeller在提到SpEL时,多说了那么几句:

SpEL是一种功能强大的表达式语言,语法基于统一表达式(Unified EL),实际上它与JSF中使用的表达式非常类似。我们特别为SpEL开发了自己的表达式解析器以提供特定的功能,无论是在使用bean定义配置还是使用 Spring Integration这类项目时都可以带来不少好处。其实在Spring核心中已经有很多地方都应用了像"#{...}"这样的表达式,可以在XML的 bean定义中看到许多这样的例子。还有@Value这个注解,它可以通过名称动态引用其他的bean,并且可以非常简单就获取这些bean的属性。

举个例子,下面这段XML配置(来自3.0参考文档)使用了SpEL来配置bean的属性,属性值来自于JVM系统参数:

<bean class="mycompany.RewardsTestDatabase">
    
<property name="databaseName"
        value
="#{systemProperties.databaseName}"/>

    
<property name="keyGenerator"
        value
="#{strategyBean.databaseKeyGenerator}"/>
</bean>

Hoeller也着重介绍了Spring 3.0中对REST的支持:

我们面对的挑战是在Spring MVC的世界中加入对REST的支持,把这种强大的新功能交到MVC用户的手中。我们决定从底层为MVC支持路径变量的提取 - 这部分内容协商的方向是正确的 - 考虑到Spring MVC的实力,并把它们拉升到另一种层次,同时又不会破坏基本架构。工作进展的非常顺利,可以在已有的Spring MVC应用中使用REST的特性。

我们的重点聚焦在web用户接口在REST下的转换方式上。下一步呢,在Spring MVC的基础上实现基于REST的网络服务(Web Service)也是很有意思的一件事情,特别是OXM(Object/XML Mapping)现在已经成为了Spring核心模块之一,OXM可以和Spring MVC联合应用。最后,我们提供了RestTemplate类,这是一个Spring式的模板类,它作为客户端提供了与面向REST终端服务器进行交互的 更易用的编程方式。

对于那些工作在Spring 2.5之上,并且已经在代码中使用了基于注解样式的同志们,这次升级的路线将是非常平滑的 - 新功能可以在升级到3.0之后任意选择使用,不需要对基础架构进行任何修改。对于那些还在使用老版本,比如继承了表单控制器,这些功能在3.0中还是可以 继续使用的,只是这些功能都已经被标记为“被废弃了”(deprecated)。如果想使用3.0中的新特性,就必须先使用基于注解的@MVC样式。对于 Spring 2.0用户,99%的代码依然可以正常运行,但是对一些老组件的支持,比如Apache Commons Attributes, WebLogic 8.1 和 WebSphere 5.1,都已经被删除了。

当提起Spring框架的未来计划时,Hoeller提到开发会受到Spring集团中的其他项目的很大影响,比如Spring Integration, Spring Web Flow, Spring Source dm ServerSpring Roo等 等。在3.1的发布的新特性就会被Spring Integration 2.0和Spring Web Flow所影响,比如计划中的第一类会话管理(first-class conversation management),扩充作用域(scope)和细化基于注解的组件模型。2010年中旬中的3.1发布之后,会进入3.2版本,对于3.2版本的具 体计划还没有最终完成。

posted @ 2009-12-18 07:49 临远 阅读(1771) | 评论 (0)编辑 收藏

“富客户端Ext JS与系统模块切分”话题PDF下载

     摘要: 上周六去Beijing OpenParty准备的话题,可惜自己能力有限,拉票没有进入前九名(实际上是倒数第一,只有十个人愿意听这个话题),无缘在活动的正式会议室讲这个话题了。

下来把PDF中存在的一些问题修改了一下,有兴趣的同志可以下载看一下。也再次感谢一下最后在小会议室听我讲这个话题的三个同志。  阅读全文

posted @ 2009-12-14 09:20 临远 阅读(1429) | 评论 (0)编辑 收藏

“业务比技术重要”一条企业开发中经典的谬论

做企业开发,是业务重要还是技术重要?似乎大多数的声音都在朝向着同一个方面:“业务比技术重要”,“理解客户业务需求更加重要”,“我们要帮助客户梳理需求,项目做到一半的时候,我们已经比客户都懂业务了”。

作为一个搞技术的,我完全搞不清楚这种说法的起源,为什么作为本职工作的“技术”反而不如“业务”重要了呢?这里所说的“重要”是否是说我们只需要抓抓牢最重要的部分就可以解决一切问题了呢?既然所有人都认为业务比技术重要,那为什么公司不直接招聘几个“精通业务的人员”过来培训几天技术就行了呢?为什么反而要招聘原本不重要的“技术人员”,再去临时培训如此重要的“业务”呢?或者说,既然业务比技术重要那么多,为什么我们还要做技术呢?所有人都去搞业务岂不是可以把所有力量都集中在最重要的部分,进而获得更大的效益呢?

听到这种说法,人们又开始议论纷纷:“你这样太极端了,怎么可能完全放弃技术呢?没有技术怎么行呢?”这种说法再正常不过,因为我们的本职工作就是“软件开发人员”,开发人员立足的根本就在于技术能力,所谓的业务问题如果不建立在技术基础之上,就是完全无用的空对空瞎吹而已。对于一个开发人员来说,技术能力是必不可少的,再多“业务”也是无法弥补“技术”上的鸿沟的。

可为什么大多数人还是认为“业务比技术重要的”,首先公司的行为在于盈利,公司只有通过交易行为才能实现盈利,如果我们制作的产品无法满足客户的需求,客户是绝对不会买账的。怎么才能满足客户需求的,首先就要熟悉客户的业务,因此公司就需要一些了解特定方面业务的开发者来实现这些功能,这些公司对技术没有太多要求,只要达到基本水平就可以,所以筛选员工的标准就变成了对业务的熟练程度。

换句话说,大多数公司所需的员工是:“技术水平达到基本要求,对某一行业业务越熟练越好。”所有人对此都不会抱有怀疑,只是在信息不断传递过程中,有意无意中人们隐去了前提部分,只剩下后面的“业务很重要”。

对于一个公司来说,需要的永远不是:“技术最强者。”最有用的人是那些可以使用一定程度的技术,最好满足本行业业务需求的人们。公司不可能为了个人技术方面的渴求去牺牲业务方面的钻研,这已经是生存问题了。双向选择上,如果一个人技术不达标,是没办法通过面试的,如果一个人业务不达标,有可能先进入公司熟悉业务。如果一个人技术太强了,公司留不住也只能放任员工去选择更适合的发展环境,如果业务太强了,结果应该也是一致的。

对于个人来说,如果是一个技术狂热者,也不应该在公司中被技术左右,明辨技术和业务两个方面,结合起来帮助公司创造更大效益的同时才能为自己提供一个有发展的环境。双向选择上,如果自身无法满足公司的要求,是很难进入公司的,如果感觉公司限制了自身发展,也可以考虑是否拥有更多的选择机会。

最后来研究一下技术和业务之间的融合问题,我们可以肯定一点,纯粹的技术是没办法存活的,公司行为必然要涉及到解决哪些问题,纯粹的业务也不是技术人员可以达到的,所以我们期望了解的就是业务和技术如何分配的问题,是五五吗?是三七吗?是六四吗?现在只能说这个问题很难讲清楚,根据不同行业需求的不同,毕竟大多数公司都停留在简单的增删查改阶段,只要开发人员会用jsp的公司也比比皆是,相比专业的软件公司,这些公司的入门门槛低,待遇也低,如果希望在这些公司走得更远,唯一的方法就是在技术之外开辟出新疆界来。你可以搞业务,搞管理,搞客户关系,等等等等。大多数人都是可以适应平滑转型的,但是也有期望在技术上更进一步的同志会进入其他对技术要求更高的公司中。这类公司业务和技术比重大致在7:3到5:5之间,基本属于平常不会遇到解决不了的问题,只要根据客户的需求进行实现即可,不过一但遇到技术上无法实现的功能,便无法自行解决,只能求助于更高级的软件公司。

在大部分公司都与最终用户进行交互时,还是存在着不少公司进行着产品化行为,一方面基于以往项目积累的经验抽象出可复用的组件,另一方面对市场的调研总结,设计出更易用,更成熟的体系结构,这些公司有实力,并且有需求在技术上更进一步。这时也会出现对技术和业务职责上的分化。因为产品化已经深入的某一个特定的行业,对业务的需求分析细化整理都已经十分完善,为了实现更精进的业务,也就需要更精进的技术来作为支持。这些公司需要专精某些技术的员工,可以基于整理后的需求完成业务,同时也需要更加专业的业务分析人员,在业务上进行细化分析,提供给后续论证实现。只不过对于这种业务分析人员,大多也是从原软件开发人员转移过来的,他们拥有十分丰富的项目经验,同时拥有强力的设计能力可以为下面的实现人员提供规划蓝图。归根结底,无论是开发人员或是需求分析人员都是以技术为基础的,没办法,毕竟我们的本职工作是开发。

最后的最后,到底是技术重要还是业务重要呢?我想作为一个技术人员的大家,应该心中有数了吧?


posted @ 2009-12-07 13:02 临远 阅读(2544) | 评论 (19)编辑 收藏

OpenSourceCamp归来有感

上周六去参加了OpenSourceCamp活动,玩了整整一天时间,感触颇丰啊。

首先是上午到达Intel,来到会议室先找了件合适尺寸的T恤装起来(感谢活动赠送的礼品,谢谢),人不是特别多,所以在中间找到了几个空位坐下。

活动开始前,大屏幕上一直在播放着OpenSource的宣传视频,英语原声中文字幕的,几个老外不断出来讲这个OpenSource到底是如何如何,看到了Linus,接下来又出现了GNU的创始人,讲到OpenSource的出现,它的意义等等,不过留下最深印象的还是,当其中提到了MicroSoft和Bill Gates时,视频的背景音乐突然变成了“鬼子进村”的那种气氛,然后就伴着这种感觉听了几分钟的bill Gates写给开源社区的公开信,信的内容主要是强调软件的知识产权。。。感觉OpenSource和MicroSoft的隔阂还是年代久远啊。

随着视频的戛然而止,活动进入正题,首先由活动的发起人Peter介绍了OpenSourceCamp的历史和未来的发展,然后依次是IBM谈标准规范,intalio对自身的介绍,天使投资人介绍通过开源如何开展商业活动,中间还有一个“中文马马虎虎”的芬兰女士介绍去芬兰留学的。

上午日程中记忆最深刻的是Xiao-Feng Li介绍的,如何在jvm中应用向量运算来提升性能。主要就是说,如果我们对一批数据进行相同操作,比如将10个数依次累加5这样的操作,如果使用循环就需要使用10次加法计算,而向量计算可以通过一个加法操作就实现对初始10个数的累加操作,这样就以内存的代价换取的操作效率的提升。

说真的,一开始还以为这是一个很偏门的技术,可是听到后来Xiao-Feng Li讲到将这一项技术应用于JVM的时候,并拿出了单线程下运行速度提升30%的测试数据时,我立刻就傻眼了。总是说理解业务最重要的同志们估计也没想到完全是在钻研技术也会产生这种意向不到的效果吧?业务应用遇到底层技术一般就是这种结果了,应用的反复研究造就了的结果是满足特定需求,而底层技术的推出直接在数量级层次发生了颠覆的作用,这种底层的研发阶段是枯燥的,而成果又是巨大的。借用演讲人的一句话:“你可以把它研究出来,然后卖给SUN,ORACLE这些公司嘛。”先不说这话是认真还是开玩笑,先回过头来考虑一下之前我们是否对技术进行过如此的钻研探究,也能够明白为何现在很多技术上的问题还是会成为我们前进道路上的瓶颈了。

再想想,为什么这种底层技术会直接出现在OpenSource中呢,更多时候它只会被公司内部作为机密控制起来,OpenSource不是商业行为,它仅仅是一种distribution和development的形态,开放式的开发形式,调动更多人的力量来催生创新的形成,反正个人从OpenSourceCamp上看到的OpenSource就是这样的了。

所以要放平心态,国内的技术积累尚未实现某种丰富的水平,所以建立在技术地基之上的OpenSource必定需要时间慢慢培养,如果真是要做开放开源,低下头做事情就对了。

posted @ 2009-11-30 08:58 临远 阅读(1559) | 评论 (3)编辑 收藏

谁应该用流程设计器

谁应该用流程设计器

在业务的梳理和设计阶段都有可能用到流程设计器,这里提到的流程设计器是指有图形界面,可以通过拖拽图形设计流程图的设计器,而不是说一个开发者专用的XML编辑器。

既然涉及了图形化,就可以实现通过流程图与最终用户进行交互,对实际业务进行梳理和重组。图形比文字更容易让双方理解,这一点应该不会有什么反对意见吧?

下面就引出我们这次讨论的问题:“那么这个流程设计器到底是应该面向程序开发人员使用,还是面向最终用户使用呢?”

这个问题会衍生出多种不同的推断,讨论的焦点基本是围绕在:“是否要放权给客户进行设计工作呢?”

对 于这个问题大部分程序员都能及时给予否定的答案:“怎么能让不懂技术的人去负责设计工作呢?他们设计出来的东西要是用程序无法实现该怎么办?”社区中力挺 这种观点的人不在少数,比如OSWorkFlow就建议开发者通过直接编辑流程定义XML的方式设计流程,它们认为流程设计完全属于开发范畴,不需要也不 应该由最终用户介入。

但是,从最终客户方面又常常传来:“需要对业务进行定制调整”的声音,于是迫于市场和客户方面的压力,开发设计人员又开始研究如何让最终用户可以在应用层面对业务实现进行干预,于是出现了关于自动建表,定制表字段,自动生成表单等等相关的技术。

面对如此浪潮蜂拥,诸如MDA体系架构也开始蠢蠢欲动,想当初多少人怒吼着:“让开发人员失业,零编码实现业务系统。”那时的开发人员真是岌岌可危啊,总是担心害怕自己哪一天就被某个程序给替代了。可实际上过了这些年,也没看到开发人员集体失业的情况。

难 道是客户方面定制业务的需求减少了吗?好像不是因为这个原因,还是有很多客户抱怨市场瞬息万变,应用系统不好支持多边的市场风向。既然不是客户的需求减 少,而实际开发人员又没有被诸多的业务定制系统挤掉工作,那只能说明之前烽火连天的业务定制系统还无法完全满足客户的需求,客户依然需要通过开发人员才能 实现自身特定的业务需求。

现在我们依然需要面对的问题是:“客户需要随着市场的变动对业务作出调整和变化。”这个需求是现实存在的,既然市场提出了需求,势必会导致我们联想到是否可以将图形化的流程设计器直接提供给最终用户实现,以便用户对业务进行修改呢?

必须事先了解一点:“最终客户不是开发人员”, 他们不可能像程序开发设计人员那样信手拈来的编写代码,对业务模块进行调用,这一点就决定了我们最终提供给业务人员的设计器必定是功能受限的,不能把所有 功能都对其开发,而是应该限制他们的操作范围,让他们的操作保持在可控范围内,避免出现业务人员设计出一个完全不可能运行的流程图来,同时又要加强用户交 互的易用性,从这些方面来看,不论对设计和开发方面对我们提出了不小的挑战——如何帮助用户在不犯错的情况下,很容易设计出一个业务流程呢?

我们可以看到,如果要满足客户定制的需求,就需要提供两套流程设计器,开发版流程设计器需要提供各种接口方便开发扩展调试,最好还能和实际开发的环境集成。业务版流程设计器就要更加强调易用性,在功能方面进行限制,丰富校验和提示方面的信息。

posted @ 2009-11-23 12:44 临远 阅读(1070) | 评论 (1)编辑 收藏

数据建模与业务建模

数据建模与业务建模

无论是企业信息系统还是web网站,各种大小程序的原始功能都是对数据的操作,可以看做是某一群体对一些数据的各种需求造就了一个又一个的程序,或者说是软件系统。

回头想想,第一刻起我们就开始和数据打交道了,新项目开始的时候我们先要做什么呢?用第三方依赖搭个框架,设计目录结构吗?不对,这些都是技术储备,应该是在项目启动之前就完成的了。项目启动的一刻我们在做的工作总是对数据的分析。

我们要分析数据结构,理清数据关系,确定数据类型,还要兼顾数据量的大小,现在至少不用考虑数据的存储媒介了,因为十有八九都要用数据库,除了极少数情况应该不会有人选择自己编写文件系统进行数据的存储了吧?

上 面的这些步骤就叫做数据建模,搞程序的同志们肯定相当轻车熟路了,从拿到用户的第一个表单开始,在ER图中拖出第一个Table,我们就开始进行数据模型 的设计,设计好的数据模型将固化在某一种媒介中(基本都是数据库),应用系统的用途就是为用户提供一个界面,让他们对固化在媒介中(一般都是数据库)的数 据进行操作。

怎 么才算是良好的数据模型呢?首先它要满足数据固化的基本要求,所有必须的数据都必须能够保存在数据库里,其次这些数据的结构应该是容易被应用程序操作的, 无论是增删查改、数据校验、数据安全、搜索查询、统计汇总、数据导出等等功能都是可以实现的,而且效率不能太低。如果能够实现以上两条,基本就可以算是一 个良好的数据模型了,这样用户就可以借助应用程序对数据库中自己所需的数据进行管理、操作。

但 是还有一个问题,是否只要提供了这些功能就足以满足用户的要求了呢?从上面列出的功能中我们就可以了解到,无论是CRUD增删查改,还是查询统计,无非是 “更新(update)”,“查询(Read)”,“校验(Check)”三个基本操作的实现,这些操作都是基于静态数据的单步操作,应用程序只是在数据 外面简单包装了薄薄的一层,用户面对的和要操作管理的依然是后面整个数据模型。

这个问题可以归结到:我们解决了用户想要什么(What),但是并没有了解用户需要怎么做(How)。

数 据建模解决了数据如何存储,存储的格式,以及怎么获得已经存储的数据的问题,数据建模完成了数据固化和检索的任务,数据建模归根结底是对静态数据的建模, 给你一张ER图,你很容易就可以了解到数据的类型、数据的关系,但是你无法从这些数据格式数据关系中弄明白客户到底需要利用这些数据完成什么样的任务。不 清楚这些数据从何而来,到何处去,也就决定了你编写的应用系统只能包含一个录入界面,一个查询界面,无法再为最终用户提供更多的功能,因为你手中只有静止 不动的数据而已。

因此,为了让应用系统可以肩负起更多的功能,我们需要在业务模型的基础之上进行业务建模,比如一个文章发布系统中的表结构如下所示:

从 表结构中可以看到一个文章包含主键(ID),作者(author),内容(content),状态(status),创建时间(create_time) 和修改时间(update_time)。状态(status)字段类型为整形,可能的值为0, 1, 2, 3四种。单单从数值上来说,除了建表的人谁也搞不清楚这四个状态到底有什么作用,但是只要配合下面的流程图这个问题就可以迎刃而解了。

业 务建模的目标是在数据模型的基础上,让应用程序帮助最终用户解决实际业务中出现的问题,它所感兴趣的方面数据的流向和状态的变迁,从上面的流程图我们就可 以看到,虽然status拥有4个状态,但是这4个状态并不是可以随意转换的,“文章起草”(status=0)只能转变为“提交待审批” (status=1),而“审批完成”(status=2)作为一个终止状态是不能再发生改变的。这些功能需求都是数据建模阶段无法解决的,只有通过对业 务逻辑,业务流程的梳理分析才能在应用程序中为最终用户提供这些功能。

业务建模让数据模型变得有血有肉,结合了业务的数据不再是单薄的骨架,而是变成了鲜活的生灵。

我 们借助一个最简单的发文审批流程向大家介绍了数据建模与业务建模的关系,希望大家能够借此了解软件开发中业务流程与数据模型之间的关系,别小看文章表结构 中的status状态位,它已经初具了有限状态机(FSM, Finite State Machine)的雏形,很多简易的工作流引擎都是基于FSM来实现的,所以请切实体会一下实际开发中流程的作用,你可能没有使用工作流,但是我们所面对 的问题和解决的方式却是大同小异的。

posted @ 2009-11-20 09:41 临远 阅读(2329) | 评论 (3)编辑 收藏

我们为什么选择工作流

我们为什么选择工作流。

一直感觉很难对那些从未接触过工作流的同学们解释清楚。

还记得有一个活动中,有人提问:“工作流到底是做什么的?”回答的同志希望根据具体的实例解释一下,就反问他:“你们公司的报销流程是怎么走的?”结果提问的同志直接说:“直接找财务啊。”引得下面一阵喧哗:“不用领导签字就可以随便报销啊。”

那个提供的同志心里一定感觉很无辜:“我也不知道公司的请假流程应该找谁啊,大家每次都直接给财务了。”其实对于小公司来说,里边工作的人本来不多,可能都是报销这种事情都是这样两步完成了,可实际上真实的流程应该是这样:

大家对图中的环节估计不会有什么异议,只是对于直接拿发票找财务报销的人来说,中间的核实部分变成了完美的黑盒,他不了解,也没有必要去了解报销的整个过程,站在当事人的角度,他只要最后知道这次报销能拿到多少钱就可以了。

对 于一个公司的内部事务来说,这样就最好的,员工没有必要去了解每个环节是如何进行的,但是在为这种公司进行软件开发时无疑要面临着掉进陷阱的危险。假设你 只对员工进行需求调研,他会只给你发票的单据,告诉你报销流程就是找财务。如果再去找财务进行需求调研,他会告诉你只要看一下没问题就可以报销了,最有可 能略过,也可能是最关键的特别情况需要经过老板审核的步骤,这个步骤可能是5000元以上必须经老板过目,也可能是特殊事项需要老板签字,但是因为公司日 常不会出现很多这种情况而被人们无意识的忽略掉,有可能到程序开发到中段时才突然想起来,然后就需要把流程重改。

说到这里,那么使用了工作流就可以避免出现这类需求变更问题吗?

答 案是否定的,软件开发时的需求变更常常是因为客户对本身业务要求和业务流程的不熟悉所导致的,软件开发的过程常常伴随着流程的梳理和细化,这也是为什么很 多程序员都说:“这个项目做完了,我比他们公司里的人都懂业务了。”其实不是你比他们还懂业务,真正办公的时候你还是会被各种情况冲的头昏脑胀,但是因为 你在软件开发的过程中对各个部门之间的依赖和关联进行了完全的梳理,所以对各个部门之间的数据流和业务流了解的更为通透。

话 说回来,工作流虽然不能解决因为客户对本身业务的深化而造成的需求变更问题,但是它确实可以把这个风险提前,我们知道,风险总是越早解决越有利,因为当我 们一张张单据化为流程图时,客户也能够更好的参与到流程的解读中来,通过流程图可以加快业务的深化,提早暴露出之前没有考虑到的问题,便于我们尽快的尽早 的解决。

那么我们直接用visio不就可以了?何必使用工作流呢?

答案是 visio也可以,只要可以限制图形中的语义,不要让客户任意发挥,就完全可以实现工作流的效果。为什么要限制语义呢?因为只有流程图可以直接映射为开发 完成的程序,对流程图的细化才是真正有意义的,否则客户画了一张完全无法用程序实现的图形,我们该怎么办呢?工作流一般都提供了自己定义的一套语义,大多 都是以XML格式保存的,只要以此为基础画出的流程图都是可以转换为实际程序的,再加上与客户的沟通,让客户和程序员对流程中每个环节的理解保持一致,就 可以尽量避免理解上的偏差,减少修改和返工现象。

但是工作流的学习曲线太高了,原本程序中我只需要设置几个状态位就可以解决问题,值得兴师动众的配上工作流吗?

对 这个问题的回答还需要对实际情况进行分析,小型系统中,你只需要制作一个CMS,不同的管理员负责不同版块内容的审批,这种逻辑简单,流程固定的需求确实 没有必要使用工作流,使用了工作流反而会加大开发和维护的复杂度,使用状态位模拟FSM有限状态机也完全可以实现。但是在复杂的业务情况中可能存在着同步 并行,多路决策,循环遍历等情况,这种情况下使用状态位就无法满足客户的业务需求,因此随着业务需求复杂度的上升,我们必然需要选择功能更强大的武器来解 决这一系列的问题。




posted @ 2009-11-18 10:07 临远 阅读(1945) | 评论 (7)编辑 收藏

jBPM-4.2发布,比预期延迟了4天

jBPM-4.2终于在2009年11月5日发布,从jBPM-4.0开始,jBPM的版本发布已经朝向正规发展,每次发布都要经过JIRA冻结,代码冻结,测试周,然后才会发布正式版本,这次的发布是被gwt-console-1.2拖了后腿,10月30日的时候,JIRA和代码准备都接近完成,只剩下一个gwt-console-1.2升级的issue,结果一直拖了一周的时间,最终延迟到了11月5日才正式发布。

现在我们可以从jBPM的官方网站下载jBPM-4.2的发布包了。
下载地址:
http://sourceforge.net/projects/jbpm/files/a%29%20jBPM%204/
现在jBPM的发布包都有100M+,其中包含了所有的源代码,第三方依赖库,报表引擎,控制台和web设计器,jBPM从4.0开始一直致力于提供完善的安装,升级脚本,寄希望于让用户通过官方提供的ant脚本实现jBPM的各种安装调试工作。

这次jBPM-4.2发布,除了支持Process ClassLoader之外,并没有提供更多的新功能,目前jBPM的开发还是着重于对安装脚本,数据迁移功能进行增补,比如这次jBPM中对jpdl-4.2.xsd的扩充就包括了在xml中定义processInstance的迁移策略,以后的某个时间里,我们有可能直接通过processDefintion中的定义就可以实现让原有流程定义对应的流程实例直接迁移到最新发布的流程下。

jBPM-4.2中继续强化了版本间数据库表结构的升级功能,提供了4.1到4.2的数据表结构升级脚本,虽然支持的数据库还是只有那么几个,但是已经可以避免因为数据库表结构的不同而造成的升级问题了。

有关jBPM-4.2的详细更新列表可以参考官方提供的release note,地址如下所示:
https://jira.jboss.org/jira/secure/ReleaseNote.jspa?projectId=10052&styleName=Html&version=12313768

我们也提供了jBPM-4.2此次发布的用户手册与开发指南的翻译版本,地址如下:
http://www.family168.com/tutorial/jbpm4.0/html/
http://www.family168.com/tutorial/jbpm4devguide/html/

不过,在我们自身进行版本升级的过程中,还是遇到了一些郁闷的地方,比如4.2中将所有自增主键都替换成用户指定的方式,使用了idgenerator组件,通过数据库中主键表统一管理各个数据表的主键生成。这个过程中使用的事务控制方式,要调用名称为newTxRequiredCommandService的CommandService组件,但是对应spring的整合配置文件中并没有对这个变动进行同步,造成的问题是如果像我们一样使用spring与jbpm整合的方式运行jbpm4,就会直接抛出异常,这时候还需要根据官方的配置改动spring配置文件才行。在spring整合的方向,jbpm确实没有付出多少关注啊。


posted @ 2009-11-06 00:49 临远 阅读(1406) | 评论 (1)编辑 收藏