使用Spring+观察者模式处理绩效评定流程状态变更及邮件发送

简介:



   绩效评定流程在每月所有员工绩效计划打分结束后,由系统自动按评定关系表(树状结构,父结点是子结点的评定人,各部门总监为最底层评定人)发起任务,将最底层评定人下属的信息组装为表插入审批表单中,平行的最底层评定人为并行的子任务。最后一个平行最底层评定人评定结束后,系统会自动将新建子任务给平行最底层评定人的评定关系上层,并将所有平行最底层评定人的评定信息汇总作为审批表单,由此迭代直至找到平台级最终评定关系为止,流程结束。由于该流程极其特殊,既不是普通的并行或串行,也不是普通的子任务或会签,除发起结点、结束结点外,只有一个评定结点,所有评定人的评定活动均被看作评定结点的子任务,jbpm认为所有子任务均是并行关系,在业务逻辑中使用评定关系表等基础信息标识不同子任务的层级关系。由于无法使用统一的流程流转,在设计好流程及表单后,单独设计引擎驱动该流程,并在流程运转过程中更新基础信息表并负责发送邮件。

  单独的流程引擎设置、员工绩效基础信息表更新及邮件的发送由不同程序员开发。其中流程引擎在驱动流程运转过程中,会根据需要通知相应逻辑更新表及发送邮件。在开发引擎时,我使用观察者模式对流程进行重构使更新员工绩效基础信息和邮件发送逻辑的开发均独立进行,使代码的耦合进一步降低。

    在系统中存在这样的情况:一个功能点触发的动作会引起相关一个或者多个功能点在业务上进行对应的数据处理。而到底有几个功能点要做出相应,要看客户实施了哪些需要作出响应的具体功能点。

      例如:A功能点的某项业务会触发B、C、D三功能点做出回应,而客户订阅了哪些功能点是个未知数,也许客户不需要C功能点,对A功能点业务操作作出响应的仅有B、D。

      根据上面的需求可以得出,设计上要尽量的松散耦合,保持各功能点的独立性。观察者模式责无旁贷的跳了出来。

       我们的系统在整体上采用Spring framework来进行Bean管理。利用Spring通过配置文件来加载具体的类的方式——相当于被包装了的工厂,使得代码更加灵活。同样,观察者模式的应用可以很好的借用Spring framework提供的平台,变得更加灵活。

        首先,我们定义一个抽象的观察者

1
2
3
4
5
6
7
8
9
/**
  * TODO(描述类的职责)
  * @author chao.gao
  * @date 2015年11月30日 上午8:50:59
  * @version <b>1.0.0</b>
  */
public  interface  BaseObserverHandler  extends  Observer {
 
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
  * A class can implement the <code>Observer</code> interface when it
  * wants to be informed of changes in observable objects.
  *
  * @author  Chris Warth
  * @version %I%, %G%
  * @see     java.util.Observable
  * @since   JDK1.0
  */
public  interface  Observer {
     /**
      * This method is called whenever the observed object is changed. An
      * application calls an <tt>Observable</tt> object's
      * <code>notifyObservers</code> method to have all the object's
      * observers notified of the change.
      *
      * @param   o     the observable object.
      * @param   arg   an argument passed to the <code>notifyObservers</code>
      *                 method.
      */
     void  update(Observable o, Object arg);
}

  具体观察者:

1
2
3
public  class  EndProcessMailSentHandler  implements  BaseObserverHandler{
//实际update方法,具体实现略
}

   在观察者模式中,目标角色是被客户程序调用,通过目标角色来通知具体观察者角色。在传统观察者模式中,目标角色中维护有一个观察者角色的列表,列表中的观察者角色通过其它程序进行添加维护——这就注定了观察者列表的改变会引起代码的修改。而通过Spring framework的配置方式注册观察者角色则避免了这种情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
  * TODO(描述类的职责)
  * @author chao.gao
  * @date 2015年11月27日 下午4:15:36
  * @version <b>1.0.0</b>
  */
public  abstract  class  BaseObservedHandler  extends  Observable {
 
     private  List<BaseObserverHandler> observerHanlers;
 
     /**
      * 被观察者进行操作
      * @author chao.gao
      * @date 2015年11月27日 下午4:18:56
      * @param context
      */
     public  void  obServedOpertion(EvaluationPorcessContext context) {
         if  (observerHanlers ==  null  || observerHanlers.isEmpty())
             return ;
         for  (BaseObserverHandler baseObserverHandler : observerHanlers) {
             super .addObserver(baseObserverHandler);
         }
         super .notifyObservers(context);
     }
 
     /**
      * 获得observerHanlers
      * @return List<BaseObserverHandler>
      */
     public  List<BaseObserverHandler> getObserverHanlers() {
         return  observerHanlers;
     }
 
     /**
      * 设置observerHanlers
      * @param observerHanlers
      */
     public  void  setObserverHanlers(List<BaseObserverHandler> observerHanlers) {
         this .observerHanlers = observerHanlers;
     }
 
}

  下面是Spring framework配置文件的一个片断——它应该出现在用到目标角色的具体客户程序对应的Spring配置文件中。它将具体观察者的别名存放在一个list里面,使用Spring为生成的目标角色注入。

  如下:

1
2
3
4
5
6
7
8
9
10
11
12
< bean  id = "endProcessService"
         class = "com.fx.oa.module.per.evaluation.workflow.server.service.impl.EndProcessService" >
         < property  name = "jbpmOperatorService"  ref = "jbpmOperatorService"  />
         < property  name = "evaluationProcessService"  ref = "evaluationProcessService"  />
         < property  name = "observerHanlers" >
             < list >
                 < ref  bean = "endProcessHandler" />
                 < ref  bean = "endProcessMailSentHandler"  />
                 < ref  bean = "endProcessSaveFormHandler" />
             </ list >
         </ property >
     </ bean >






     本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/1747203,如需转载请自行联系原作者

相关文章
|
前端开发 JavaScript Java
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
本文介绍了一个结合SpringBoot和Python的实用功能,旨在监控iPhone 15的库存状态并通过邮件提醒用户。系统采用SpringBoot监听苹果官网API,解析JSON数据判断是否有货,并展示最近的库存记录。此外,还能自动触发Selenium+Python脚本实现自动化购买。文中详细介绍了技术栈、接口分析、邮件配置及自动化脚本的设置方法。该项目不仅适用于熟悉后端开发的人员,也适合回顾Layui和Jquery等前端技术。
533 0
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
|
IDE Java 应用服务中间件
spring boot 启动流程
Spring Boot 启动流程简介: 在使用 Spring Boot 之前,启动 Java Web 应用需要配置 Web 容器(如 Tomcat),并将应用打包放入容器目录。而使用 Spring Boot,只需运行 main() 方法即可启动 Web 应用。Spring Boot 的核心启动方法是 SpringApplication.run(),它负责初始化和启动应用上下文。 主要步骤包括: 1. **应用启动计时**:使用 StopWatch 记录启动时间。 2. **打印 Banner**:显示 Spring Boot 的 LOGO。 3. **创建上下文实例**:通过反射创建
928 5
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
2846 26
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
消息中间件 缓存 监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
springboot的热部署、配置的宽松绑定和校验、任务、邮件、监控、springboot整合JdbcTemplate,h2等sql技术、整合redis,mongodb,es等nosql技术、整合redis,Memcached,jetcache,j2cache等缓存技术、整合ActiveMQ,RabbitMQ,RocketMQ,Kafka等消息的中间件的入门、整合缓存/任务/邮件/监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
|
JSON 前端开发 JavaScript
优雅!Spring Boot 3.3 实现职责链模式,轻松应对电商订单流程
本文介绍如何使用 Spring Boot 3.3 实现职责链模式,优化电商订单处理流程。通过将订单处理的各个环节(如库存校验、优惠券核验、支付处理等)封装为独立的处理器,并通过职责链将这些处理器串联起来,实现了代码的解耦和灵活扩展。具体实现包括订单请求类 `OrderRequest`、抽象处理器类 `OrderHandler`、具体处理器实现(如 `OrderValidationHandler`、`VerifyCouponHandler` 等)、以及初始化职责链的配置类 `OrderChainConfig`。
|
消息中间件 设计模式 缓存
spring源码设计模式分析(四)-观察者模式
spring源码设计模式分析(四)-观察者模式
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
2001 2
|
Java 持续交付 Maven
Spring Boot程序的打包与运行:构建高效部署流程
构建高效的Spring Boot部署流程对于保障应用的快速、稳定上线至关重要。通过采用上述策略,您可以确保部署过程的自动化、可靠性和高效性,从而将专注点放在开发上面。无论是通过Maven的生命周期命令进行打包,还是通过容器技术对部署过程进行优化,选择正确的工具与实践是成功实现这一目标的关键。
716 2
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的邮件过滤系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的邮件过滤系统的详细设计和实现(源码+lw+部署文档+讲解等)
168 2
|
安全 Java Maven
在 Spring Boot 中实现邮件发送功能可以通过集成 Spring Boot 提供的邮件发送支持来完成
在 Spring Boot 中实现邮件发送功能可以通过集成 Spring Boot 提供的邮件发送支持来完成
630 2