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 + "]";
    }
}

可以看到,过滤器模式可以很方便的扩展过滤业务。

时间: 2024-08-08 05:48:30

Java设计模型应用——过滤器模式的相关文章

java设计模型 解析工厂模式、proxy-agent模式、templete模式

1.Factory Design pattern 工厂设计模式的优点 (1)工厂设计模式提供了接口而不是实现的代码方法. (2)工厂模式从客户端代码中删除实际实现类的实例化.工厂模式使我们的代码更健壮,耦合更少,易于扩展.例如,我们可以轻松更改PC类实现,因为客户端程序不知道这一点. (3)工厂模式通过继承提供实现和客户端类之间的抽象. JDK中工厂设计模式实列 java.util.Calendar,ResourceBundle和NumberFormat getInstance()方法使用Fac

java设计优化-享元模式

享元模式是设计模式中少数几个以调高系统性能为目的的设计模式.它的核心思想是:如果在一个系统中存在多个相同的对象,那么只需共享一份对象的拷贝,而不必为每一次使用都创建新的对象.在享元模式中,由于需要构建和维护这些可以共享的对象,因此,常常会出现一个工厂类,用于维护和创建对象. 享元模式对性能提升的主要帮助有两点: 1.可以节省重复创建对象的开销,因为被享元模式维护的相同对象只会被创建一次,当对象创建比较耗时时,便可以节省大量时间: 2.由于创建对象的数量减少,所有对系统内存的需求也减少,这样使GC

analysed of J-SON/XML processing model Extend to java design model (J-SON/XML处理模型分析 扩展到Java设计模型 )

一.JSON和XML 1.JSON JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.可在不同平台之间进行数据交换.JSON采用兼容性很高的.完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)体系的行为.这些特性使JSON成为理想的数据交换语言. 2.XML 扩展标记语言 (Extensible Markup Language

JSON/xml、Processing 以及收集Java的设计模型

JSON简介: 1.基本介绍 JSON(JavaScriptObject Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据.简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率. 2.JSON语法 在 JS 语言中,一切都是对象.因此,任何支持的类型都可以通过 JSON 来表示,例如字

面向对象分析与设计—四色原型模式(彩色建模、领域无关模型)(概念版)

阅读目录: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙,让我们真的看见OOAD的希望 5.在四色原型上运用彩色建模增强视觉冲击力 6.通过四色原型模式建模出领域无关模型 7.结束语:建模时你可以不考虑具体实现,但是建模者要懂技术实现 1.背景介绍 至今我都清楚的记得我第一次被面试官问起什么叫"建模"技术时的情景,那是好几年前的事情了,当时是胸有成竹

java内存模型一

Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对多种异构平台的平台独立性而使用的多线程技术支持也是具有开拓性的一面,有时候在开发Java同步和线程安全要求很严格的程序时,往往容易混淆的一个概念就是内存模型.究竟什么是内存模型?内存模型描述了程序中各个变量(实例域.静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节,对象最终是存储在内存里面的,这点没有错,但是编译器.运行库.处理器或者系统

Nio学习3——基础模型:Reactor模式和多路复用

Reactor模式和NIO 本文可看成是对Doug Lea Scalable IO in Java一文的翻译. 当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socket的操作.他们都有一个共同的结构: 1. Read request 2. Decode request 3. Process service 4. Encode reply 5. Send reply 经典的网络服务的设计如下图,在每个线程中完成对数据的处理: 但这种模式在用户负载增加时,性能将下降

java内存模型二

并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体).通信是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递. 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信.在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信. 同步是指程序用于控制不同线程之间操作发生相对顺序的机制.在共享内存并发

深入理解java内存模型

深入理解Java内存模型(一)——基础 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体).通信是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递. 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信.在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信. 同步是指程序用于控制不同线程之