生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的。

在性能告警模块开发过程中,创建一条告警规则需要执行阈值解析,中间表生成,流任务生成,规则入库,告警事件入库等诸多操作。如果把这些步骤糅合在一个类中,代码可读性及复杂度往往是灾难的,特别对于这么多步骤的事务性操作,更是力不从心。使用责任链模式,上述问题迎刃而解。

以告警规则创建为例子,简化流程如下

阈值解析 ---> 流任务生成 ---> 规则入库

回滚流程如下

1、 阈值解析失败:回滚阈值解析。

2、 流任务生产失败:回滚流任务生成,阈值解析。

3、 规则入库失败:回滚规则入库,流任务生成,阈值解析。

采用责任链模式编码,思路如下:

1、 编写阈值解析处理器,流任务生成处理器,规则入库处理器,每个处理器包含业务处理方法和回滚方法;

2、 一个处理器业务代码执行完成后主动调用下一个处理器业务方法;

3、 一个处理器业务代码执行失败主动调用本处理器回滚方法,本处理器回滚完成后主动调用上一个处理器回滚方法。

代码如下

1、 抽象处理器

package com.coshaho.learn.handler;

/**
*
* AbstractRuleHandler.java Create on 2017年5月5日 下午11:20:15
*
* 类功能说明: 告警规则责任链处理节点抽象类
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public abstract class AbstractRuleHandler
{
// 上一个处理器
private AbstractRuleHandler preHandler; // 下一个处理器
private AbstractRuleHandler nextHandler; /**
* 业务执行
*
* @author coshaho
* @param rule
*/
public void doHandle(AlarmRule rule)
{
try
{
doHandleReal(rule);
}
catch(Exception e)
{
// 业务代码执行失败主动回滚
rollBack(rule);
return;
} // 业务代码执行成功主动调用下一个处理器处理
if(null != nextHandler)
{
nextHandler.doHandle(rule);
}
} /**
* 事务回滚
*
* @author coshaho
* @param rule
*/
public void rollBack(AlarmRule rule)
{
rollBackReal(rule);
// 本处理器业务回滚完成,主动调用前一个处理器业务回滚
if(null != preHandler)
{
preHandler.rollBack(rule);
}
} /**
* 每个处理器特有的业务处理方法
*
* @author coshaho
* @param rule
* @throws Exception
*/
public abstract void doHandleReal(AlarmRule rule) throws Exception; /**
* 每个处理器特有的业务回滚方法
*
* @author coshaho
* @param rule
*/
public abstract void rollBackReal(AlarmRule rule); private AbstractRuleHandler setPreHandler(AbstractRuleHandler preHandler)
{
this.preHandler = preHandler;
return preHandler;
} public AbstractRuleHandler setNextHandler(AbstractRuleHandler nextHandler)
{
this.nextHandler = nextHandler;
nextHandler.setPreHandler(this);
return nextHandler;
} }

2、阈值解析处理器

package com.coshaho.learn.handler;

import org.apache.commons.lang.StringUtils;

/**
*
* ThresholdParseHandler.java Create on 2017年5月5日 下午11:41:20
*
* 类功能说明: 阈值解析
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public class ThresholdParseHandler extends AbstractRuleHandler
{ @Override
public void doHandleReal(AlarmRule rule) throws Exception
{
if(StringUtils.isEmpty(rule.getThreshold()))
{
throw new Exception("Threshold is empty.");
}
System.out.println("Parse threshold success. Threshold is " + rule.getThreshold());
} @Override
public void rollBackReal(AlarmRule rule)
{
System.out.println("Roll parse threshold. Threshold is " + rule.getThreshold());
} }

3、流任务生成处理器

package com.coshaho.learn.handler;

/**
*
* StreamGenerateHandler.java Create on 2017年5月5日 下午11:41:43
*
* 类功能说明: 告警流规则生成
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public class StreamGenerateHandler extends AbstractRuleHandler
{ @Override
public void doHandleReal(AlarmRule rule) throws Exception
{
System.out.println("Generate stream success.");
} @Override
public void rollBackReal(AlarmRule rule)
{
System.out.println("Roll Generate stream.");
} }

4、规则入库处理器

package com.coshaho.learn.handler;

import org.apache.commons.lang.StringUtils;

/**
*
* RulePesistHandler.java Create on 2017年5月5日 下午11:41:08
*
* 类功能说明: 告警规则持久化
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public class RulePesistHandler extends AbstractRuleHandler
{ @Override
public void doHandleReal(AlarmRule rule) throws Exception {
if(StringUtils.isEmpty(rule.getName()))
{
throw new Exception("Rule name is empty.");
}
System.out.println("Persist rule success. Rule name is " + rule.getName());
} @Override
public void rollBackReal(AlarmRule rule) {
System.out.println("Roll persist rule. Rule name is " + rule.getName()); } }

5、规则入库处理器

package com.coshaho.learn.handler;

import org.apache.commons.lang.StringUtils;

/**
*
* RulePesistHandler.java Create on 2017年5月5日 下午11:41:08
*
* 类功能说明: 告警规则持久化
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public class RulePesistHandler extends AbstractRuleHandler
{ @Override
public void doHandleReal(AlarmRule rule) throws Exception {
if(StringUtils.isEmpty(rule.getName()))
{
throw new Exception("Rule name is empty.");
}
System.out.println("Persist rule success. Rule name is " + rule.getName());
} @Override
public void rollBackReal(AlarmRule rule) {
System.out.println("Roll persist rule. Rule name is " + rule.getName()); } }

6、告警规则

package com.coshaho.learn.handler;

/**
*
* AlarmRule.java Create on 2017年5月5日 下午11:40:50
*
* 类功能说明: 告警规则
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public class AlarmRule
{
private String name; private String type; private String threshold; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getThreshold() {
return threshold;
}
public void setThreshold(String threshold) {
this.threshold = threshold;
}
}

7、规则创建责任链

package com.coshaho.learn.handler;

/**
*
* AlarmRuleCreator.java Create on 2017年5月5日 下午11:56:45
*
* 类功能说明: 告警规则创建
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public class AlarmRuleCreator
{
private AbstractRuleHandler alarmRuleHandler;
public AlarmRuleCreator()
{
alarmRuleHandler = new ThresholdParseHandler();
alarmRuleHandler.setNextHandler(new StreamGenerateHandler())
.setNextHandler(new RulePesistHandler());
} public void create(AlarmRule rule)
{
alarmRuleHandler.doHandle(rule);
}
public static void main(String[] args)
{
AlarmRule rule = new AlarmRule();
rule.setThreshold("cpuRate < 10");
rule.setName("Cpu Alarm"); AlarmRuleCreator ruleCreator = new AlarmRuleCreator();
ruleCreator.create(rule);
System.out.println(); rule.setName("");
ruleCreator.create(rule);
} }

测试结果

Parse threshold success. Threshold is cpuRate < 10
Generate stream success.
Persist rule success. Rule name is Cpu Alarm Parse threshold success. Threshold is cpuRate < 10
Generate stream success.
Roll persist rule. Rule name is
Roll Generate stream.
Roll parse threshold. Threshold is cpuRate < 10

Java设计模式应用——责任链模式的更多相关文章

  1. 详解java设计模式之责任链模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...

  2. Java设计模式之责任链模式、职责链模式

    本文继续介绍23种设计模式系列之职责链模式.   什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组.   职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...

  3. JAVA设计模式之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  4. Java设计模式之八 ----- 责任链模式和命令模式

    前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...

  5. java设计模式之责任链模式(Chain of Responsibility)

    转自:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样 ...

  6. java设计模式之责任链模式以及在java中作用

    责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...

  7. 击鼓传花联想到了Java设计模式:责任链模式

    目录 应用场景 简单示例 责任链模式 定义 意图 主要解决问题 何时使用 优缺点 击鼓传花的故事 应用场景 http web请求处理,请求过来后将经过转码.解析.参数封装.鉴权等一系列的处理(责任), ...

  8. Java设计模式---ChainOfResponsibility责任链模式

    参考于 : 大话设计模式 马士兵设计模式视频 代码参考于马士兵设计模式视频 写在开头:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系 图来自大话设计模式,下面我的代 ...

  9. 【java设计模式】责任链模式

    可以随时添加过滤器,并在主方法中添加删除: Main package com.tn.filter; public class Main { public static void main(String ...

随机推荐

  1. 【LOJ6254】最优卡组 堆(模拟搜索)

    [LOJ6254]最优卡组 题面 题解:常用的用堆模拟搜索套路(当然也可以二分).先将每个卡包里的卡从大到小排序,然后将所有卡包按(最大值-次大值)从小到大排序,并提前处理掉只有一张卡的卡包. 我们将 ...

  2. gnuplot生成gif动画

    最近有个任务需要生成一个动态变化的图,然后突然发现gnuplot竟然可以生成gif动画,当真是应正了博客Gnuplot surprising的子标题: I always tell myself: &q ...

  3. iOS - 原生的CIFilter生成二维码和条形码

    使用CIFilter可以不引入任何第三方库,就可以生成想要的二维码和条形码,今天简单的介绍一下使用CIFilter生成二维码和条形码.系统CIFilter生成的二维码和条形码的大小有时并不能满足需求, ...

  4. vue之指令系统

    所谓指令系统,大家可以联想咱们的cmd命令行工具,只要我输入一条正确的指令,系统就开始干活了. 在vue中,指令系统,设置一些命令之后,来操作我们的数据属性,并展示到我们的DOM上. OK,接下来我们 ...

  5. tomcat启动报错“Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: iZ25fsk1ifk: iZ25fsk1ifk”

    在启动了Tomcat的时候出现下面的错误,导致启动不了,卡在读日志的状态 Error: Exception thrown by the agent : java.net.MalformedURLExc ...

  6. html的base标签

    提示:请把 <base> 标签排在 <head> 元素中第一个元素的位置,这样 head 区域中其他元素就可以使用 <base> 元素中的信息了. 注释:如果使用了 ...

  7. poj2492 A Bug's Life【并查集】

    Background  Professor Hopper is researching the sexual behavior of a rare species of bugs. He assume ...

  8. PyCharm安装配置Qt Designer+PyUIC教程

    原文写的不错,拿来大家都可以看一下 原文地址:https://www.cnblogs.com/lsdb/p/9121903.html https://www.cnblogs.com/tiankong2 ...

  9. MyISAM存储引擎

    每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩展名为.MYD (MYData).索引文件的扩展名是.MYI (MYIn ...

  10. RSA原理说明

    长度,建议至少1024.模数n(常取默认65537)两边都要用. 指数e,和n一起就是公钥. 指数d,和n一起就是私钥. 质数p和q用于生成密钥对,然后就丢弃不公开. 一.密钥对的生成步骤 1.随机选 ...