Java设计模式应用——过滤器模式
storm引擎计算出一批中间告警结果,会发送一条kafka消息给告警入库服务,告警入库服务接收到kafka消息后读取中间告警文件,经过一系列处理后把最终告警存入mysql中。
实际上,中间告警结果可能有重复告警、错误告警、无用告警,告警入库服务会过滤,压缩中间告警,把用户关心的告警存入数据库。过滤的步骤较多,并且客户关心的告警可能会随时变化,写死的告警过滤很快就无法满足应用场景,这种场景下使用过滤器模式则很好满足业务上的不确定性欲扩展性。
告警入库服务涉及消息过滤和告警过滤,下面我们以消息过滤器来讲一下过滤器模式。
1、消息过滤器接口
package com.coshaho.learn.filter; /**
*
* IMessageFilter.java Create on 2017年5月13日 上午12:43:56
*
* 类功能说明: 告警消息过滤器
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public abstract class IMessageFilter implements Comparable<IMessageFilter>
{
public int priority()
{
return 0;
} public abstract boolean doFilter(Message msg); public int compareTo(IMessageFilter arg0)
{
return priority() - arg0.priority();
} }
2、时间过滤器
package com.coshaho.learn.filter; import org.springframework.stereotype.Component; /**
*
* TimeFilter.java Create on 2017年5月13日 上午12:44:25
*
* 类功能说明: 时间过滤
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
@Component
public class TimeFilter extends IMessageFilter
{ public int priority()
{
return 1;
} public boolean doFilter(Message msg)
{
if(msg.getHour() < 8 || msg.getHour() > 17)
{
System.out.println("Time filter false, message is " + msg);
return false;
}
System.out.println("Time filter true, message is " + msg);
return true;
} }
3、级别过滤器
package com.coshaho.learn.filter; import org.springframework.stereotype.Component; /**
*
* ServerityFilter.java Create on 2017年5月13日 上午12:44:13
*
* 类功能说明: 级别过滤
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
@Component
public class ServerityFilter extends IMessageFilter
{ public int priority() {
return 2;
} public boolean doFilter(Message msg) {
if(msg.getSeverity() == 0)
{
System.out.println("Severity filter false, message is " + msg);
return false;
}
System.out.println("Severity filter true, message is " + msg);
return true;
} }
4、类型过滤器
package com.coshaho.learn.filter; import org.springframework.stereotype.Component; /**
*
* TypeFilter.java Create on 2017年5月13日 上午12:44:36
*
* 类功能说明: 类型过滤
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
@Component
public class TypeFilter extends IMessageFilter{ public int priority()
{
return 3;
} public boolean doFilter(Message msg) { if(msg.getType() < 3)
{
System.out.println("Type filter false, message is " + msg);
return false;
}
System.out.println("Type filter true, message is " + msg);
return false;
} }
5、消息监听服务
package com.coshaho.learn.filter; import java.util.Collections;
import java.util.List; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component; /**
*
* MessageListener.java Create on 2017年5月13日 上午12:44:49
*
* 类功能说明: 告警消息监听
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
@Component
public class MessageListener
{
public static void main(String[] args)
{
@SuppressWarnings("resource")
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
MessageListener listener = (MessageListener)context.getBean("messageListener");
Message msg = new Message();
msg.setHour(12);
msg.setName("coshaho");
msg.setType(5);
msg.setSeverity(3);
listener.listen(msg);
} public void listen(Message msg)
{
excute(msg);
} private boolean excute(Message msg)
{
@SuppressWarnings("unchecked")
List<IMessageFilter> filters = (List<IMessageFilter>)SpringUtils.getBeansOfType(IMessageFilter.class);
Collections.sort(filters);
for(IMessageFilter filter : filters)
{
if(!filter.doFilter(msg))
{
return false;
}
}
return true;
}
}
6、Spring工具类
package com.coshaho.learn.filter; import java.util.ArrayList;
import java.util.List;
import java.util.Map; import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service; @Service
public class SpringUtils implements ApplicationContextAware
{
private static ApplicationContext context; public void setApplicationContext(ApplicationContext context)
throws BeansException
{
SpringUtils.context = context;
} @SuppressWarnings({ "rawtypes", "unchecked" })
public static List getBeansOfType(Class clazz)
{
Map map = context.getBeansOfType(clazz);
return new ArrayList(map.values());
}
}
7、消息类
package com.coshaho.learn.filter; /**
*
* Message.java Create on 2017年5月13日 上午12:43:37
*
* 类功能说明: 告警消息
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public class Message
{
private String name; private int hour; private int type; private int severity; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getHour() {
return hour;
} public void setHour(int hour) {
this.hour = hour;
} public int getType() {
return type;
} public void setType(int type) {
this.type = type;
} public int getSeverity() {
return severity;
} public void setSeverity(int severity) {
this.severity = severity;
} @Override
public String toString() {
return "Message [name=" + name + ", hour=" + hour + ", type=" + type
+ ", severity=" + severity + "]";
}
}
可以看到,过滤器模式可以很方便的扩展过滤业务。
Java设计模式应用——过滤器模式的更多相关文章
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- 折腾Java设计模式之备忘录模式
原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...
- 折腾Java设计模式之状态模式
原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- 折腾Java设计模式之访问者模式
博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...
- 折腾Java设计模式之命令模式
博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...
随机推荐
- 各浏览器Cookie大小、个数限制【转】
先插入一条广告,博主新开了一家淘宝店,经营自己纯手工做的发饰,新店开业,只为信誉!需要的亲们可以光顾一下!谢谢大家的支持!店名: 小鱼尼莫手工饰品店经营: 发饰.头花.发夹.耳环等(手工制作)网店: ...
- mysql limit 优化
1.当取出的数据超过20%时,优化器不会使用索引,而是全表扫描: 2.limit和offset的问题,其实是offset的问题,它会导致mysql扫描大量不需要的行然后删掉 如: select * f ...
- OSI互联数据包封装与解封装过程
当我们在七层协议最上层,主机A想和其它主机通信, 比如telnet到主机B,各层都为数据打包后再封装上自己能识别的数据标签,现在我们只说四层以下的通信过程. .当一个高层的数据包到达传输层,由于tel ...
- java基础/一个类A继承了类B,那么A就叫做B的派生类或子类,B就叫基类或超类。
类重复,pulic class demo1 和class demo1 重复 无主类, 在cmd中输入命令: SET CLASSPATH=. (等号后为英文点符号),即可设置解释的路径为当前路径. 再次 ...
- PHP配置xcache缓存扩展
安装步骤 wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz tar -xf xcache-3.2.0.tar ...
- poj1269 intersecting lines【计算几何】
We all know that a pair of distinct points on a plane defines a line and that a pair of lines on a p ...
- 51nod 1126 - 求递推序列的第N项 - [找规律]
题目链接:https://cn.vjudge.net/problem/51Nod-1126 有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + ...
- iOS-深入理解(转载)
RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何 ...
- 2018/03/27 每日一个Linux命令 之 cron
Cron 用于配置定时任务. -- 环境为 Ubuntu16-04 -- 先说说怎么配置一个简单的定时任务.直观的可以看到效果. 之前在网上查找资料,对Shell编程不熟悉的实在是很头疼,走了不少弯路 ...
- KVM--安装及初步使用
KVM是Kernel-based Virtual Machine的简称,是一个开源的虚拟化模块,今天我将在CentOS7的操作系统上安装KVM,以下是我的安装步骤. 一.环境信息 系统: CentOS ...