`
SunSteven
  • 浏览: 48428 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

JBPM与设计模式之职责链模式

 
阅读更多
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职责链执行流程




分享到:
评论

相关推荐

    jbpm流程设计器

    4. **集成开发环境**:jbpm流程设计器可以与Eclipse等IDE集成,提供更丰富的开发辅助功能,如代码提示、自动完成、版本控制等,提高开发效率。 5. **元数据支持**:它允许用户为流程中的各个元素添加元数据,如任务...

    jbpm源码阅读之一

    压缩包中的文件 "Java23种设计模式(总结).doc" 显然是一个关于Java设计模式的文档,这与jbpm源码阅读紧密相关。设计模式是软件工程中的最佳实践,对于理解任何复杂系统的源码都是非常有帮助的。jbpm作为一个成熟的...

    JBPM4 web设计器实践--命令模式的使用

    【标题】"JBPM4 web设计器实践--命令模式的使用"揭示了在JBPM4中如何运用命令模式来提升流程设计的效率与可维护性。命令模式是一种设计模式,它将请求封装为一个对象,使得我们可以用不同的请求对客户进行参数化,对...

    JBPM设计器,纯JS

    6. **API集成**:为了与JBPM服务器进行交互,设计器需要使用RESTful API。这些API用于部署流程、获取流程实例信息、执行流程任务等操作。 7. **用户权限管理**:在企业环境中,权限管理是必不可少的。设计器应能...

    jbpm

    在描述中提到的博客链接指向了iteye上的一篇关于jbpm的博文,虽然具体内容无法直接展示,但可以推测博主可能分享了如何将jbpm与Struts2框架整合的实践经验和技巧。Struts2是一个流行的Java Web应用程序框架,它提供...

    jbpm 下载链接资源

    4. **监控与分析**:JBPM提供了丰富的监控和分析工具,允许用户实时查看流程执行状态,进行性能分析,从而不断优化流程设计。 ### 下载与安装 对于希望深入了解或使用JBPM的开发者而言,获取JBPM的安装包是第一步...

    extjs jbpm4流程设计器

    6. **调试与执行**:集成jBPM4的执行环境,允许用户在设计环境中直接启动和调试流程实例。 7. **集成API**:与后端服务交互,实现流程实例的创建、查询、终止等操作。 8. **权限管理**:对流程设计的访问和修改...

    MyEclipse6.0下Jbpm流程设计器

    【MyEclipse6.0下Jbpm流程设计器】是一个专为MyEclipse6.0集成的业务流程管理(Business Process Management,BPM)工具,主要用于设计和管理Jbpm流程。Jbpm是一个开源的工作流和业务流程管理平台,它提供了一套完整...

    jbpm简介\jbpm简介

    jBPM的核心设计理念是灵活性与可扩展性,其目标是在不同的业务环境中为用户提供高效、稳定的流程管理解决方案。 #### 二、选择jBPM的十大理由 1. **嵌入式的工作流引擎**:jBPM采用嵌入式设计,这意味着它可以作为...

    jbpm4jbpm5

    jbpm4jbpm5是关于jbpm流程管理框架的专题,涵盖了jbpm4和jbpm5两个主要版本。jbpm是一个开源的工作流管理系统,用于帮助开发者实现业务流程自动化。以下是基于给定文件的信息,深入解析jbpm4和jbpm5的知识点: 1. *...

    JBPM流程引擎设计 工作流资料

    JBPM流程引擎设计是IT领域中的一个重要知识点,尤其对于那些希望理解和实施企业级工作流管理系统的人员来说,它是不可或缺的。 1. **流程建模**:JBPM支持BPMN 2.0(Business Process Model and Notation)标准,这...

    jbpm4.4设计器文档

    jbpm4.4版本的设计器文档主要介绍了基于GEF(Graphical Editor Framework)实现的一个WEB版流程设计器,文档内容覆盖了设计器的设计理念、组成结构、工作流程以及定制化开发和扩展功能等多个方面。 GEF是一个图形...

    JBPM Web流程设计器

    【JBPM Web流程设计器】是一种基于Web的工具,它允许用户设计、管理和执行业务流程,类似于Eclipse中的jbpm插件。这个设计器采用JavaScript(js)和ExtJS库来构建,提供了一个直观的图形化界面,使得非技术人员也能...

    jbpm jbpm4.3.jar

    jbpm jbpm4.3.jar DDDDDDDD

    一个JBPM工作流例子,JBPM

    JBPM的强大之处在于其灵活性和可扩展性,它支持复杂流程的建模,可以与其他Java企业级应用无缝集成。在实际业务中,JBPM常用于人事管理、采购审批、客户服务等场景,帮助企业提高流程效率,降低运营成本。 总结,...

    jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍

    ### jBPM 知识点详解 #### 一、jBPM 概述 jBPM 是一款开源的、纯 Java 的、轻量级的工作流引擎,它支持多种可执行流程语言,为商业流程管理(BPM)提供了一个强大的平台。jBPM 可以在任何 JavaEE 应用服务器或配置...

    jbpm 数据库jbpm 数据库

    jbpm(Java Business Process Management)是一款开源的工作流和业务流程管理框架,主要用于设计、执行、监控和优化企业的业务流程。jbpm数据库是jbpm框架在运行时存储流程实例、任务、变量等信息的地方,它是jbpm...

    JBPM与Activity分析.doc

    ### JBPM与Activity实现原理与性能分析 #### 一、概述 随着企业信息化建设的深入,工作流管理系统作为实现业务自动化的重要工具,逐渐成为企业信息化不可或缺的一部分。JBPM与Activiti作为当前市场上主流的工作流...

    jbpm引擎设计思想

    至于胡长城(银狐999)在CSDN Blog中揭秘的jbpm流程引擎内核设计思想及构架,可能详细讨论了jbpm如何实现这些设计理念,包括流程实例的内存表示、任务调度算法、持久化策略以及与其他系统(如ESB、EJB、Spring等)的...

Global site tag (gtag.js) - Google Analytics