JBPM与设计模式之职责链模式
上篇我们了解并学习了JBPM的长事务实现,其中用到了设计模式中的职责链模式和命令模式;这块还是很有厚重感的,我们可以从中学到很多的东西;今天我们先来学习一下职责链模式。
职责链模式定义
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系;将这些对象连成一条链,并沿这条链传递该请求,直到有一个对象处理该请求。
职责链模式的优点
1.客户提交一个请求,其沿着这条链传递直到得到处理;
2. 发送者和接受者都没有对方的明确信息信息;
3. 链中对象也不知道链的结构,简化了链中对象的链接关系,它仅需要维持其后继者的引
用,而不用持有它所有的候选者;
职责链模式UML图
JBPM职责链模式UML图
下面结合JBPM的拦截器代码简单介绍一下这个模式
Client:
客户端定制拦截器装配策略通过jbpm.tx.*.cfg.xml(本文结合hibernate讲解)中定义
解析配置策略形成职责链是在流程引擎初始化时完成,JBPM中定义了两种拦截器装配策略
同一个线程的命令嵌套调用的命令共用环境资源
View Code
1 <command-service name="txRequiredCommandService">
2 <skip-interceptor />
3 <retry-interceptor />
4 <environment-interceptor />
5 <standard-transaction-interceptor />
6 </command-service>
7 每个命令调用都新建环境资源
8 <command-service name="newTxRequiredCommandService">
9 <retry-interceptor />
10 <environment-interceptor policy="requiresNew" />
11 <standard-transaction-interceptor />
12 </command-service>
客户端的请求就是完成一定业务功能的脚本命令
View Code
1 public interface Command<T> extends Serializable {
2
3 T execute(Environment environment) throws Exception;
4 }
5
6 public class SaveTaskCmd extends AbstractCommand<String> {
7
8 private static final long serialVersionUID = 1L;
9
10 protected TaskImpl task;
11
12 public SaveTaskCmd(TaskImpl task) {
13 this.task = task;
14 }
15
16 public String execute(Environment environment) throws Exception {
17 DbSession dbSession = environment.get(DbSession.class);
18
19 if (task.isNew()) {
20 if (task.getSuperTaskDbid()!=null) {
21 TaskImpl parentTask = dbSession.get(TaskImpl.class, task.getSuperTaskDbid());
22 parentTask.addSubTask(task);
23 task.setSuperTaskDbid(null);
24 }
25
26 dbSession.save(task);
27
28 HistoryEvent.fire(new TaskCreated(task));
29
30 } else {
31 dbSession.update(task);
32
33 HistoryEvent.fire(new TaskUpdated(task));
34 }
35
36 return task.getId();
37 }
38 }
客户端调用
taskService. assignTask(task.getId(),userId);
ChainHandle:
JBPM并没用完全照搬职责链的定义, 虽然在每个拦截器中都可以处理请求,但是JBPM设计的只能在DefaultCommandService里处理请求,然后再拦截器中处理环境资源初始化和长事务的管理等。
根据以上分析,职责链ChainHandler实现如下
执行处理请求
View Code
1 public interface CommandService {
2
3 String NAME_TX_REQUIRED_COMMAND_SERVICE = "txRequiredCommandService";
4 String NAME_NEW_TX_REQUIRED_COMMAND_SERVICE = "newTxRequiredCommandService";
5
6 /**
7 * @throws JbpmException if command throws an exception.
8 */
9 <T> T execute(Command<T> command);
10 }
11
12 public class DefaultCommandService implements CommandService {
13
14 private static final Log log = Log.getLog(DefaultCommandService.class.getName());
15
16 public <T> T execute(Command<T> command) {
17 EnvironmentImpl environment = EnvironmentImpl.getCurrent();
18
19 try {
20 return command.execute(environment);
21
22 } catch (RuntimeException e) {
23 log.info("exception while executing command "+command, e);
24 throw e;
25
26 } catch (Exception e) {
27 log.info("exception while executing command "+command, e);
28 throw new JbpmException("exception while executing command "+command, e);
29 }
30 }
31 }
职责链流传控制
View Code
1 public abstract class Interceptor implements CommandService {
2
3 protected CommandService next;
4
5 public CommandService getNext() {
6 return next;
7 }
8 public void setNext(CommandService next) {
9 this.next = next;
10 }
11 }
12
13 public class SkipInterceptor extends Interceptor {
14
15 static DefaultCommandService defaultCommandService = new DefaultCommandService();
16
17 public <T> T execute(Command<T> command) {
18 EnvironmentImpl environment = EnvironmentImpl.getCurrent();
19 // if there is an environment active
20 if (environment!=null) {
21 // skip the rest of the interceptor stack and just execute the command
22 return defaultCommandService.execute(command);
23 }
24
25 return next.execute(command);
26 }
27
28 }
JBPM职责链执行流程
分享到:
相关推荐
4. **集成开发环境**:jbpm流程设计器可以与Eclipse等IDE集成,提供更丰富的开发辅助功能,如代码提示、自动完成、版本控制等,提高开发效率。 5. **元数据支持**:它允许用户为流程中的各个元素添加元数据,如任务...
压缩包中的文件 "Java23种设计模式(总结).doc" 显然是一个关于Java设计模式的文档,这与jbpm源码阅读紧密相关。设计模式是软件工程中的最佳实践,对于理解任何复杂系统的源码都是非常有帮助的。jbpm作为一个成熟的...
【标题】"JBPM4 web设计器实践--命令模式的使用"揭示了在JBPM4中如何运用命令模式来提升流程设计的效率与可维护性。命令模式是一种设计模式,它将请求封装为一个对象,使得我们可以用不同的请求对客户进行参数化,对...
6. **API集成**:为了与JBPM服务器进行交互,设计器需要使用RESTful API。这些API用于部署流程、获取流程实例信息、执行流程任务等操作。 7. **用户权限管理**:在企业环境中,权限管理是必不可少的。设计器应能...
总的来说,jbpm4设计器的Application化是将工作流管理与日常业务应用相结合的重要步骤,它将原本专业的工作流设计工具融入到日常的业务操作中,降低了使用门槛,提高了工作效率。通过深入研究这些js源文件,我们可以...
在描述中提到的博客链接指向了iteye上的一篇关于jbpm的博文,虽然具体内容无法直接展示,但可以推测博主可能分享了如何将jbpm与Struts2框架整合的实践经验和技巧。Struts2是一个流行的Java Web应用程序框架,它提供...
4. **监控与分析**:JBPM提供了丰富的监控和分析工具,允许用户实时查看流程执行状态,进行性能分析,从而不断优化流程设计。 ### 下载与安装 对于希望深入了解或使用JBPM的开发者而言,获取JBPM的安装包是第一步...
6. **调试与执行**:集成jBPM4的执行环境,允许用户在设计环境中直接启动和调试流程实例。 7. **集成API**:与后端服务交互,实现流程实例的创建、查询、终止等操作。 8. **权限管理**:对流程设计的访问和修改...
【MyEclipse6.0下Jbpm流程设计器】是一个专为MyEclipse6.0集成的业务流程管理(Business Process Management,BPM)工具,主要用于设计和管理Jbpm流程。Jbpm是一个开源的工作流和业务流程管理平台,它提供了一套完整...
jBPM的核心设计理念是灵活性与可扩展性,其目标是在不同的业务环境中为用户提供高效、稳定的流程管理解决方案。 #### 二、选择jBPM的十大理由 1. **嵌入式的工作流引擎**:jBPM采用嵌入式设计,这意味着它可以作为...
jbpm4jbpm5是关于jbpm流程管理框架的专题,涵盖了jbpm4和jbpm5两个主要版本。jbpm是一个开源的工作流管理系统,用于帮助开发者实现业务流程自动化。以下是基于给定文件的信息,深入解析jbpm4和jbpm5的知识点: 1. *...
JBPM流程引擎设计是IT领域中的一个重要知识点,尤其对于那些希望理解和实施企业级工作流管理系统的人员来说,它是不可或缺的。 1. **流程建模**:JBPM支持BPMN 2.0(Business Process Model and Notation)标准,这...
jbpm4.4版本的设计器文档主要介绍了基于GEF(Graphical Editor Framework)实现的一个WEB版流程设计器,文档内容覆盖了设计器的设计理念、组成结构、工作流程以及定制化开发和扩展功能等多个方面。 GEF是一个图形...
【JBPM Web流程设计器】是一种基于Web的工具,它允许用户设计、管理和执行业务流程,类似于Eclipse中的jbpm插件。这个设计器采用JavaScript(js)和ExtJS库来构建,提供了一个直观的图形化界面,使得非技术人员也能...
jbpm jbpm4.3.jar DDDDDDDD
JBPM的强大之处在于其灵活性和可扩展性,它支持复杂流程的建模,可以与其他Java企业级应用无缝集成。在实际业务中,JBPM常用于人事管理、采购审批、客户服务等场景,帮助企业提高流程效率,降低运营成本。 总结,...
### jBPM详细设计文档知识点解析 #### 一、引言 - **浏览器推荐**:文档建议使用Firefox浏览器浏览此教程,因为Internet Explorer可能存在显示问题。 - **许可证**:jBPM采用GNU Lesser General Public License ...
### JBPM与Activity实现原理与性能分析 #### 一、概述 随着企业信息化建设的深入,工作流管理系统作为实现业务自动化的重要工具,逐渐成为企业信息化不可或缺的一部分。JBPM与Activiti作为当前市场上主流的工作流...
至于胡长城(银狐999)在CSDN Blog中揭秘的jbpm流程引擎内核设计思想及构架,可能详细讨论了jbpm如何实现这些设计理念,包括流程实例的内存表示、任务调度算法、持久化策略以及与其他系统(如ESB、EJB、Spring等)的...
【jbpm与ssh框架整合】 jbpm4与SSH框架的整合是将jBPM(java Business Process Managerment)这一轻量级工作流引擎与Struts2、Spring和Hibernate(SSH)这三大主流Java开发框架结合的过程,以实现企业级应用中的...