handler

java23种设计模式之十:责任链模式

喜欢而已 提交于 2019-12-07 15:46:30
  最近在学习netty中发现其中用到了责任链模式,然后结合自己在写代码中遇到了大量写if...else的情况,决定学习一下责任链模式。 一.什么样的场景下会选择用责任链模式   我们在进行业务逻辑判断时,需要根据传入参数类型的不同做出不同的处理,如果在传入的参数类型相对较少的情况时,可以用if...else来做判断,这样的确是没有什么问题的,但是如果后期由于业务系统的扩展,导致参数类型会随之延伸出很多种不同的处理,这时就需要用责任链模式来抒代码重构,这样会让代码封装的更好、更简洁,阅读性更强,后期如果增加了新的处理场景,只需要增加新的类就行,不会对原代码有很大的改动。 责任链模式的使用,会让方法的调用像递归一样的调用向后传递,如果传入的参数类型符合第1个handler处理的定义,那么就由第1个handler进行处理,如果不能处理,那就交由后续的handler进行处理。 大量的写if...else是可以解决问题,但个人认为写多了,这样的if...else就像一面墙一样,在等着请求类型的不同来选择不同的方法进行处理,而责任链是一条线一样的处理模式,能处理就由当前的处理,不能处理则由后面的handler处理。 二.责任链模式的编写   1.抽象1个总的handler   2.编写3个实现类来实现handler   3.请求类   4.客户端测试类 /** * 处理机器人请求 * *

netty服务端详解

血红的双手。 提交于 2019-12-07 14:28:33
本文仅适用与Netty4.0.32版本,其他版本是否适用表示并不清楚... Netty服务器启动流程: 1、创建线程池 创建处理连接的线程池:bossGroup 创建处理所有事件的线程池:workerGroup EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); 2、设定辅助启动类。ServerBootStrap 传入1中开辟的线程池 指定连接该服务器的channel类型 指定需要执行的childHandler 设置部分参数,如AdaptiveRecvByteBufAllocator缓存大小 .Option用于设置bossGroup相关参数 .childOption用于设置workerGroup相关参数 2.5、此处可处理一个问题:超长字符串在服务端handler无法被一次接收完 可通过此句进行设置:.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, MAX_LENGTH_OF_MSG, 65536)) ServerBootstrap serverBootstrap = new ServerBootstrap();

七 netty学习之 boss线程池,worker线程的生命周期

陌路散爱 提交于 2019-12-07 14:14:03
netty的线程模型 1. bossGroup线程组 如果绑定了一个端口的话,那么只有一条线程来处理所有到来的请求.即使这个线程组里可能不止一条线程 如果绑定了两个端口的话,那就有两条线程 new EventLoopGroup(1) 所以, 可以指定线程组之初始化1条线程 所以, ServerBootstrap监听一个端口对应一个boss线程,它们一一对应. 2. worker线程组 在boss接受了socket连接请求后,会产生一个channel,并把这个channel交给ServerBootstrap初始化时指定的ServerSocketChannelFactory处理, boss线程则继续处理socket的请求 ServerSocketChannelFactory则会到worker线程池中找出一条worker线程来继续处理这个请求 **如果是OioServerSocketChannelFactory,**那么这个channel上所有的socket消息,从开始到channel(socket)关闭,都只由这个特定的worker线程来处理,也就是说打开的一个socket对应一个指定的worker线程,在这个socket没有关闭的情况,只能为这个socket处理消息,没有办法为其他socket服务 ** 如果是NioServerSocketChannelFactory,** 则不然

Android消息机制1-Handler(Java层)

橙三吉。 提交于 2019-12-07 12:10:25
相关源码 framework/base/core/java/andorid/os/Handler.java framework/base/core/java/andorid/os/Looper.java framework/base/core/java/andorid/os/Message.java framework/base/core/java/andorid/os/MessageQueue.java libcore/luni/src/main/java/java/lang/ThreadLocal.java 一、概述 在整个Android的源码世界里,有两大利剑,其一是Binder IPC机制,,另一个便是消息机制(由Handler/Looper/MessageQueue等构成的)。关于Binder在 Binder系列 中详细讲解过,有兴趣看看。 Android有大量的消息驱动方式来进行交互,比如Android的四剑客 Activity , Service , Broadcast , ContentProvider 的启动过程的交互,都离不开消息机制,Android某种意义上也可以说成是一个以消息驱动的系统。消息机制涉及MessageQueue/Message/Looper/Handler这4个类。 1.1 模型 消息机制主要包含: Message:消息分为硬件产生的消息

ATL3.0中的窗口类-客户端使用ATL创建DUI框架的起点

泪湿孤枕 提交于 2019-12-07 11:15:01
摘要:讨论Active Template Library (ATL) 3.0中的一些类,这些类围绕着Windows API建立了一个面向对象的编程框架,使用这个框架,可以简化Microsoft® Windows®编程并且只需要很少的系统开销。内容包括:考察对窗口做了简单封装的CWindow类;使用CWindowImpl进行消息处理和消息映射;使用ATL中的对话框类以及扩展现有窗口类的功能的方法。 内容: 简介 CWindow CWindowImpl 一个简单而完整的示例 消息映射 为现有的窗口类添加功能 基类消息链 窗口的超类化 窗口子类化 被包含的窗口 消息反射 ATL中的对话框类 指定窗口类的信息 结论 简介: 虽然Active Template Library (ATL)主要是为了支持COM开发而设计的,但它确实包含了很多可用于窗口设计的类。这些窗口类和ATL中的其它类一样,都是基于模版的,并且只需要花费很少系统开销。这篇文章就向我们演示了使用ATL创建窗口和对话框并进行消息处理的基本方法。 这篇文章假设读者熟悉C++语言和Windows程序设计;但是并不一定要求读者具有COM方面的知识。 CWindow: 在ATL窗口类中,CWindow是最基本的。这个类对Windows API进行了面向对象的包装,它封装了一个窗口句柄,并提供一些成员函数来操作它

ATL中的窗口类及常见的窗口处理情况

十年热恋 提交于 2019-12-07 11:09:30
ATL 中的窗口类及常见的窗口处理情况 1 、 ATL 中的窗口类( CWindow ): CWindow类作为ATL中的窗口类,它主要实现了对窗口进行管理和操作的基本功能;它提供的很多方法都是对Win32 API函数的简单封装。 在实际的应用中,我们可以根据自己的需要,合理的使用CWindow类的子类CWindowImpl、CContainedWindow、CDialogImpl,etc来简化操作。 其各类的功能如下: CWindow类:允许你通过窗口的句柄为其指定一个CWindow对象,并通过CWindow类的方法来管理该窗口。 CWindowImpl类:允许你创建一个新的窗口或者为存在的窗口创建一个子窗口,并将消息的处理放在消息链中进行。 CContainedWindow类:包容器窗口,你也可以用它创建一个新的窗口或为存在的窗口创建一个子窗口;它作为CWindow与CWindowImpl的一个折中,允许你将窗口的消息处理集中到父窗口中。 CDialogImpl类:允许你创建一个有模式或无模式对话框,并将消息的处理放在消息链中进行。 CAxDialogImpl:允许你为Active X控件创建一个有模式或无模式对话框。 其它的还有CWndClassInfo、CWinTraits,CWinTraitsOR,其各个类的具体使用,及它们提供的方法祥见MSDN。 2

django 自定义日志配置

白昼怎懂夜的黑 提交于 2019-12-07 09:42:38
可参考的连接 http://www.cnblogs.com/qwj-sysu/p/4218536.html http://davidbj.blog.51cto.com/4159484/1433741 import logging import django.utils.log import logging.handlers LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': { 'standard': { 'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'} #日志格式 }, 'filters': { }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', 'include_html': True, }, 'default': { 'level':'DEBUG', 'class':'logging.handlers

Store and Restore event handler

≡放荡痞女 提交于 2019-12-07 09:11:50
问题 Please help to fix my function, store event of one element and delete them, then re-install; I don't know where is the problem, the function will only delete the event of element and will not restore. Please help to fix. HTML <a href="#" id="a">a</a> <a href="#" id="b">b</a>​ JS $("#a").hover(function(){alert("test")}); $("#b").click(function(){ Test_Handle('#a'); } function Test_Handle(id) { target = $(id); if($.hasData(target.get(0))){ // if the elment has event || target = element target[0

How to pass a handler from activity to service

坚强是说给别人听的谎言 提交于 2019-12-07 08:30:23
问题 How to pass handler from an activity to service? I am trying to update the activity UI on the state of Bluetooth connection by using Handler as shown below from service class. mHandler.obtainMessage(MenuActivity.MESSAGE_STATE_CHANGE, state, -1).sendToTarget(); In the activity, I implemented this: public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_STATE_CHANGE: if (true) Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1); switch(msg.arg1){ case BluetoothService.STATE

Loop with delay period

隐身守侯 提交于 2019-12-07 07:53:04
问题 I have a TextView and I want each second to highlight another letter in the word. For example: h e l l o - h e l l o - h e l l o - h e l l o - h e l l o What I have done: int i = 0; String text; Handler handler = new Handler(); public void spanText(String txt) { text = txt; for(int i=0; i<text.length(); i++) { handler.post(runnable); } Runnable runnable = new Runnable() { @Override public void run() { Spannable spannable = Spannable.Factory.getInstance().newSpannable(text); StyleSpan style =