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设计模式应用——过滤器模式的更多相关文章

  1. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  2. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  3. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  4. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  5. 折腾Java设计模式之备忘录模式

    原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...

  6. 折腾Java设计模式之状态模式

    原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...

  7. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  8. 折腾Java设计模式之访问者模式

    博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...

  9. 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...

随机推荐

  1. javaAgent 参数

    -javaagent 这个JVM参数是JDK 5引进的. Java -help的帮助里面写道: -javaagent:<jarpath>[=<options>] load Ja ...

  2. 【C#】简单计算器源代码

    form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...

  3. ssh连接超时时间(ssh timeout)的设置方法

    问题:当某台远程主机宕机时,ssh远程过去会耗费很多的时间去连接,结果还是会失败. 这个时候可以设置超时时间 ssh -o ConnectTimeout= 192.168.0.10

  4. CAT偶现NPE的问题

    1.背景 我们公司的调用链系统是基于大众点评的CAT客户端改造的,服务端完全有自己设计开发的.在是用CAT客户端收集dubbo调用信息的时候,我们发现了一个CAT偶现NPE的bug,该bug隐藏的很深 ...

  5. ELKStack之消息队列

    redis消息队列 安装redis yum -y install redis 修改配置文件 修改ip 后台运行 启动 systemctl start redis 查看 lsof -i:6379 连接 ...

  6. java---rce

    http://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-app ...

  7. Wireless Network--poj2236(并查集)

    Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have ...

  8. PULL解析学习

    学习过程   安卓中有三种对XML解析的方式,这个众所周知,DOM,SAX,PULL 其中被推荐的方法是PULL,说是非常简单,但从一开始接触就觉得比较迷惑,总是云里雾里的感觉,甚至在自己写出了一个能 ...

  9. 【Python】【亲测好用】安装第三方包报错:AttributeError:'module' object has no attribute 'main'

    安装/卸载第三包可能出现如下问题及相应解决办法: 在pycharm编辑中,使用anconda2更新.卸载第三方包时,出现如下错误: AttributeError:'module' object has ...

  10. ovs的主要代码函数及大体结构图

    作者: 北京-小武 邮箱:night_elf1020@163.com 新浪微博:北京-小武 最终抽时间把openvswitch的2.0代码看的思路汇总了下,因为是曾经好早下载的.看完了也才看到2.1依 ...