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

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

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

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

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

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

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

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

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

}
/**
 * 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);
}

具体观察者:

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

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

/**
 * 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为生成的目标角色注入。

如下:

<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>
时间: 02-29

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

查询流程状态不等于处理完成的人员ID

株洲二医院有一个满意度调查流程,流程图如下: 由于有很多人员一直未填写满意度,所以客户提出希望能添加一个催办的功能,要实现这一点,首先就得查询出来还未执行的人员ID以下就是查询流程状态不等于处理完成的sql代码: select wm_concat(oper_userid) 人员ID   from flow_user_thread  where thread_id =        (select id           from flow_thread          where flow_

使用Spring的JAVA Mail支持简化邮件发送(转)

闲来无事,翻看<Spring in Action>,发现Spring集成了对JAVA Mail的支持,有点小激动的看了一遍,嗯,话说真的简单了很多. Spring的邮件发送的核心是MailSender接口,在Spring3.0中提供了一个实现类JavaMailSenderImpl,这个类是发送邮件的核心类.可以通过在配置文件中配置使用,当然也可以自己硬编码到代码中(方便起见,下面的演示代码都是硬编码到代码中,省得配置麻烦). Spring提供的邮件发送不仅支持简单邮件的发送.添加附件,而且还可

spring各种邮件发送

参考地址一 参考地址二 Spring邮件抽象层的主要包为org.springframework.mail.它包括了发送电子邮件的主要接口MailSender,和值对象SimpleMailMessage,它封装了简单邮件的属性如from, to,cc,subject,text. 包里还包含一棵以MailException为根的checked Exception继承树,它们提供了对底层邮件系统异常的高级别抽象. 要获得关于邮件异常层次的更丰富的信息,请参考Javadocs. 为了使用JavaMail

SPRING IN ACTION 第4版笔记-第八章Advanced Spring MVC-003-Pizza例子的基本流程

一. 1. 2.pizza-flow.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <flow xmlns="http://www.springframework.org/schema/webflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="h

Spring 源码解读 推荐流程

Spring源代码解析(一):IOC容器:http://www.javaeye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的启动:http://www.javaeye.com/topic/86594 Spring源代码解析(三):Spring JDBC:http://www.javaeye.com/topic/87034 Spring源代码解析(四):Spring MVC:http://www.javaeye.com/topic/87692 Sprin

spring MVC 管理HttpClient---实现在java中直接向Controller发送请求

在spring MVC中,大多数时候是由客户端的页面通过ajax等方式向controller发送请求,但有时候需要在java代码中直接向controller发送请求,这时可以使用HttpCilent实现. 首先用到的包是httpclient-4.3.5.jar和httpcore-4.3.2.jar 先看下面代码: package module.system.common; import java.io.IOException; import java.util.ArrayList; import

C#实现对站点、程序池状态的监控,以及URL能正常返回的监控,状态异常,邮件预警

需求:自动化组提出需要,要对IIS上的站点进行监控,异常停止后报警 需求分析:这站点的运行正常需要多方面的监控,如站点,程序池,资源,所以针对这需求做了三方面的监控. 站点状态的监控 站点对应的程序池的监控 URL的监控,监控url能返回200的状态码 数据库设计: 页面展示: 配置list页 配置Detail页 预警邮件: 核心代码: 配置页面代码 index.cshtml @model IEnumerable<Ctrip.Hotel.QA.Platform.Data.Dao.EnvRunSt

流程任务-手工/接收/邮件任务

BPMN中支持send task/receive task/manual task和business rule task 任务.send task主要为email  task 和 mule task ,而business rule task 主要是JBoss的Drools规则引擎. 1.手工任务和接收任务 手工任务即不需要任何程序或流程引擎驱动,会自动执行的任务.流程到达该任务时,简单记录下流程历史数据,会自动离开. 接收任务需要等待外界通知后,流程才可以继续向前执行,通知需要使用Runtime

magento新闻邮件发送一直处于“正在发送”状态问题解决

今天在弄magento新闻邮件发送时候发现,单个邮件发送完全没有问题,但是新闻邮件订阅死活都不成功,国内国外的帖子都翻了一遍没有用,最后还是得靠自己了,于是开始慢慢找问题 首先想到是不是crontab的问题,因为magento是使用crontab来定期执行magento项目更目录下得cron.php文件来实现邮件的发送,于是使用命令 crontab -e 编辑crontab文件,添加 */1 * * * * /alidata/server/php-5.5.7/bin/php /alidata/w

CentOS搭建msmtp+mutt实现邮件发送

1:搭建配置msmtp 下载msmtp包: 官方地址:http://msmtp.sourceforge.net/download.html 编译,安装(官方下载的包为tar.xz格式): #xz -d msmtp-1.6.3.tar.xz #tar -xvf msmtp-1.6.3.tar #cd msmtp-1.6.3 #./configure --prefix /opt/apps/msmtp #make && make install 新建并配置msmtprc文件: #mkdir /o