首页 > 其他分享 >reactor模式

reactor模式

时间:2023-10-23 21:36:02浏览次数:29  
标签:execute reactor get 模式 public handler class

reactor模式

模型:
image

1.三种角色说明

reactor:派发器负责监听及分配事件,将事件分配给对应的handler
acceptor:请求连接器,处理用户新过来的连接
handler:请求处理器,负责事件的处理,将自身于事件绑定

2.模型分类

  • 单reactor单线程模型
  • 单reactor多线程模型
  • 主从reactor单线程模型
  • 主从reactor多线程模型

3.主从reactor多线程模型性能最好,效率最高

4.基于reactor模型思路做项目的模拟代码

4.0 说明

  • 多个reactor后台线程运行
  • reactor接受请求,通过HandlerDispatcher去分发找到handler
  • handler处理请求,是异步,通过线程池通过工作队列workPool 去后台执行
  • handler获取后台执行线程的返回结果,返回给reactor前端

4.1 reactor模型设计

Reactor.java

public abstract class Reactor<T> {
    public abstract T execute(String msg) throws Exception;
}

MainReactor.java 只处理新用户连接

public class MainReactor extends Reactor<Object>{

    @Override
    public Object execute(String msg) throws Exception {
        return null;
    }
}

SubReactor.java 实际工作reactor

@NoArgsConstructor
public class SubReactor extends Reactor<Object>{
    @Override
    public Object execute(String msg) throws Exception {
        NotifyMethod method = NotifyMethod.TIMLINE;
        HandlerDispatcher dispatcher = Singleton.get(HandlerDispatcher.class);
        AbstractHandler handler = dispatcher.getHandler(method);
        return handler.execute();
    }
}

ReactorDispatcher reactor分发器

public class ReactorDispatcher {


    private Map<MsgType, List<Reactor>> ship = new HashMap<MsgType,List<Reactor>>(){{
        put(MsgType.ALIVE, Lists.newArrayList(Singleton.get(MainReactor.class)));
        put(MsgType.BUSINESS, IntStream.range(0,Runtime.getRuntime().availableProcessors())
                .mapToObj(c -> new SubReactor()).collect(Collectors.toList()));
    }};
    public Reactor getReactor(MsgType type){
        List<Reactor> reactors = ship.get(type);
        int index = new Random().nextInt(reactors.size());
        return reactors.get(index);
    }
}

4.2 HandlerDispatcher的设计

public class HandlerDispatcher {
    private Map<NotifyMethod, AbstractHandler> ships = new HashMap<NotifyMethod,AbstractHandler>(){{
        put(NotifyMethod.TIMLINE, Singleton.get(TimlineHandler.class));
    }};

    public AbstractHandler getHandler(NotifyMethod method){
        return ships.get(method);
    }
}

4.3 handler的设计

AbstractHandler

public abstract class AbstractHandler<T> {
    protected ThreadPoolExecutor workerPool;

    public AbstractHandler(ThreadPoolExecutor workerPool) {
        this.workerPool = workerPool;
    }

    public abstract T execute() throws Exception;
}

TimlineHandler.java

public class TimlineHandler extends AbstractHandler<Result>{

    public TimlineHandler() {
        super(ThreadUtils.newDaemonFixedThreadPool(20,"TIMLINE-HANDLER"));
    }

    @Override
    public Result execute() throws ExecutionException, InterruptedException, TimeoutException {
        CompletableFuture<Result> future = CompletableFuture.supplyAsync(new Supplier<Result>() {
            @Override
            public Result get() {
                return Result.of(null);
            }
        }, workerPool);
        return future.get(10, TimeUnit.SECONDS);
    }
}

4.4 启动类

public class App {
    public static void main(String[] args) throws Exception {
        Msg msg = new Msg("111", MsgType.BUSINESS);
        ReactorDispatcher reactorDispatcher = Singleton.get(ReactorDispatcher.class);
        Reactor reactor = reactorDispatcher.getReactor(msg.type);
        reactor.execute(msg.content);

    }

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    static class Msg { // 消息体
        String content;
        MsgType type;
    }
}

标签:execute,reactor,get,模式,public,handler,class
From: https://www.cnblogs.com/PythonOrg/p/17783415.html

相关文章

  • 软考上午05设计模式-创建型
    设计模式为了复用成功的设计和体系结构设计模式分为创建型结构型行为型模式 创建型设计模式:抽象工厂,生成器,原型,单例工厂模式的意图:使一个类的实例化延迟到其子类适用性:当一个类不知道它所创建的类的对象的类的时候当一个类希望由他的子类......
  • 解决:AP6256模块-蓝牙HFP模式无声音
    针对于BroadcomBCM2835,BCM4354和BCM43438,这些适配器可能有错误的SCO音频路由。使用这个命令(root用户)来修复路由:hcitoolcmd0x3F0x01C0x010x020x000x010x01参考文档:https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Bluetooth/#index......
  • 商业模式调整建议
    商业模式调整建议August30,2023Thisconversationmayreflectthelinkcreator’sCustomInstructions,whicharen’tsharedandcanmeaningfullychangehowthemodelresponds. 你是顶级商业顾问,根据我的案题不断向我提问,一问一答,然后给我的反馈建议ChatGPT当然,我们可......
  • 设计模式(1) -- 创建模式
    创建模式一种封装创建对象的模式它包括:抽象工厂模式(AbstractFactory)构造者模式(Builder)工厂方法(FactoryMethod)原型对象(Prototype)单例模式(Singleton)AbstractFactory提供一个接口,用于创建一组相关或依赖的对象而无需指定它们的具体类型。从关键字"一组相关或依赖的对象"可知:......
  • 杜撰23种设计模式--装饰器模式
    、接口car,定义共有行为ComponentConcreteComponent 具体的构件,是每辆车都有的行为。Decorator继承与汽车装饰器的两个具体的装饰器:最终的实现:  如果只有一个ConcreteComponet类而没有抽象的Component类, Decorator也可以直接继承到ConcreteComponent 具体的装......
  • 企业集成模式-引言
    书名:企业集成模式副标题:设计、构建及部署消息传递解决方案作者:GregorHohpe;BoddyWoolf译者:荆涛王宇杜枝秀书号:ISBN7-5083-4114-7版次:2006.3北京第一版3006.3第一次印刷前言这是一本有关使用消息传递进行企业集成的书。我们选择异步消息传递作为本书的重点,还是......
  • 策略模式
    策略模式考虑一个场景,顾客买东西计算商品的总金额。如果活动的计算方式不同,应该如何写?比如打折,满减,积分活动。思路一:简单工厂模式,把打折的模式进行分类抽象。满减,打折等等传参不同归为不同的计算模式,然后工厂类去根据参数生产对应的实例。 实例返回的参数可以用多态思想例如......
  • go中介模式
    Go设计模式--中介者,最后的模式!原创 _卡尔文 网管叨bi叨 2023-05-2208:45 发表于北京收录于合集#用Go学设计模式24个大家好,这里是每周都在陪你一起进步的网管~!今天继续学习设计模式,也是我们要学习的最后一个设计模式—中介者模式,对这个模式有一点了解后会觉得它跟我们......
  • 【C#9.0篇】Switch匹配模式新特性
    概述C#9.0中的switch匹配模式引入了许多新特性,其中一些特性是C#8.0中不存在的,比如以下特性:关系模式:可以使用关系运算符模式匹配+逻辑模式:可以使用模式匹配+逻辑模式(如and、or)来组合多个模式模式匹配+关系模式:可以使用模式匹配+关系运算符(如<、>、<=、>=、==、!=)默认的匹配......
  • 设计模式05 —— 模板模式
    设计模式05——模板模式本教程参考:菜鸟教程-学的不仅是技术,更是梦想!(runoob.com)参考书:《图解设计模式》本系列为本人学习笔记,和课程学习笔记,资料和参考均源自互联网,希望各位大佬多多指点!介绍在模板模式(TemplatePattern)中,一个抽象类公开定义了执行它的方法的方式/模......