handler

dubbo remoting(3)

无人久伴 提交于 2019-12-09 21:04:38
上文说了dubbo remoting 的发送、处理逻辑。本文的重点是dubbo remoting的代码逻辑,看看这块是如何组织代码解决问题的。我们不谈代码的来由,需要读者对dubbo remoting的代码有一定的了解。 dubbo remoting的代码要涉及到发送数据的各个方面:通道channel、处理器handler、序列化反序列化、编解码codec。 #通道 dubbo里面的通道具体有三种:Grizzly、Netty、Mina的。 #处理器 有了通道就有了发送接收数据的工具。数据发送接收需要做一系列的逻辑处理。这些逻辑处理就是处理器要做的事情。处理器要做的事情就是将channel包装成channel事务ChannelEventRunnable,然后配置一个线程池处理该信息。 executor.execute(new ChannelEventRunnable(channel, handler ,ChannelState.DISCONNECTED)); 渠道那么多,他们是如何选择处理器的呢?答案是派发器Dispatcher,派发起决定哪个渠道使用哪个处理器。 那派发器有是什么时候指定的呢? 首先我们看代码ChannelHandlers */ public class ChannelHandlers { public static ChannelHandler wrap

Django-djangorestframework-异常模块-源码及自定义异常

旧城冷巷雨未停 提交于 2019-12-09 20:55:47
目录 异常模块 为什么要自定义异常模块 常见的几种异常情况 异常模块源码分析 自定义 drf 异常处理 异常模块 为什么要自定义异常模块 所有 经过 drf APIView 视图类产生的异常 ,都可以提供异常处理方案(没有继承 APIVIew 的视图函数不会触发) drf 默认提供了异常处理方案( rest_framework.views.exception_handler ),但是处理范围有限 drf 提供的处理方案有两种 有对应处理,处理了返回异常信息 没有对应处理(处理范围之外),返回 None,直接服务器抛异常给前台 自定义异常的目的就是解决 drf 没有处理的异常,让前台得到合理的异常信息返回,后台记录异常具体的信息(方便事后排查) 如果程序报错了,我们应该尽可能的隐藏后台的错误,返回给前台就是服务器错误(你返回给用户用户也看不懂呀,如果是黑客,那可能还会利用报错袭击服务器) 常见的几种异常情况 像这种就比较可怕了,甚至连代码文件位置都暴露了 drf 异常处理模块处理后的异常 drf 异常处理模块处理后的异常 异常信息经汉化后的报错(django 配置了国际化后) 异常模块源码分析 视图函数执行出现异常会自动触发 handle_exception 函数 每个请求都会经历这么一个过程,走到 dispatch 函数 E:/python3-6-4/Lib/site

python使用logging进行日志配置

六月ゝ 毕业季﹏ 提交于 2019-12-09 20:30:19
1. logging介绍 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。 logging模块与log4j的机制是一样的,只是具体的实现细节不同。 模块提供logger,handler,filter,formatter: 1)logger:提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。 2)handler:将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。 3)filter:提供一种优雅的方式决定一个日志记录是否发送到handler。 4)formatter:指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串

mysql存储过程整理

£可爱£侵袭症+ 提交于 2019-12-09 18:51:08
1、存储过程的简介: 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 2、存储过程的有点: (1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction

Android进程间通讯之messenger

断了今生、忘了曾经 提交于 2019-12-09 18:14:58
平时一说进程间通讯,大家都会想到 AIDL ,其实 messenger 和 AIDL 作用一样,都可以进行进程间通讯。它是基于消息的进程间通信,就像子线程和 UI 线程发送消息那样,是不是很简单,还不用去写 AIDL 文件,是不是有点小爽。哈哈。 此外,还支持记录客户端对象的 Messenger ,然后可以实现一对多的通信;甚至作为一个转接处,任意两个进程都能通过服务端进行通信。 与 AIDL 比较:   当您需要执行 IPC 时,为您的接口使用 Messenger 要比使用 AIDL 实现更加简单,因为 Messenger 会将所有服务调用排入队列,而纯粹的 AIDL 接口会同时向服务发送多个请求,服务随后必须应对多线程处理。   对于大多数应用,服务不需要执行多线程处理,因此使用 Messenger 可让服务一次处理一个调用。如果您的服务必须执行多线程处理,则应使用 AIDL 来定义接口。 接下来看下怎么写: 服务端: 1. 创建一个 handler 对象,并实现 hanlemessage 方法,用于接收来自客户端的消息,并作处理 2. 创建一个 messenger( 送信人 ), 封装 handler 3.messenger 创建一个 IBinder 对象,通过 onBind 返回给客户端 客户端: 1. 在 activity 中绑定服务 2. 创建

Logging模块

坚强是说给别人听的谎言 提交于 2019-12-09 18:08:35
1.基本元素说明: Logger:用于输出的日志的总对象 Handlers:用来指定log的输出方式 Formatters:设置日志信息的结构和内容格式,默认的时间格式为%Y-%m-%d %H:%M:%S Filter:过滤器,用来过滤的输出内容(如:只输出debug以上的内容) Logger 常用函数 LOG=logging.getLogger(”chat.gui”) Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高 Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别 Logger.log("debug","This is a bug"):可以通过这个函数直接输出内容并选择对应的告警级别 内置级别 名称 对应数字级别 NOTSET 0 DEBUG 10 INFO 20 WARNING 30 ERROR 40

How to “simulate” a click on a Google Maps Marker?

久未见 提交于 2019-12-09 14:21:59
问题 What I'd like to do is to invoke the click handler on a marker. So this is my code : var marker = new google.maps.Marker({ position: location, map: map, title: title }); google.maps.event.addListener(marker, 'click', function() { alert("clicked"); }); marker.click(); but I cannot see any alert... 回答1: It's possible to trigger any Maps API event listener on any object using the google.maps.event.trigger function. You'll probably want to pass in a mock MouseEvent object, depending on what your

Redis 实现排行榜

邮差的信 提交于 2019-12-09 13:19:47
不再介绍数据库做实时排行榜的弊端,直接介绍Redis的有序集合的强大作用。 有序集合的数据和集合一样,不能重复,但每个元素又可以关联一个分数,这个分数可以重复。 需要注意的是,redis版本和命令变化较大,注意运行环境。 运行环境: redis 库版本:3.3.11 redis版本:3.2.1 1、从MongoDB中导入数据到Redis 生成数据: import pymongo import random handler = pymongo . MongoClient ( 'mongodb://127.0.0.1:27017' ) . chapter_9 . rank_data for i in range ( 10000 , 10100 ) : data = { 'user_id' : i , 'score' : round ( random . random ( ) * 1000 , 1 ) } handler . insert_one ( data ) 导入到有序集合中: import pymongo import redis handler = pymongo . MongoClient ( 'mongodb://127.0.0.1:27017' ) . chapter_9 . rank_data client = redis . Redis ( ) rows =

深入理解PHP原理之扩展载入过程

余生颓废 提交于 2019-12-09 12:59:24
why xdebug extension must be loaded as a zend extension? what is zend extension and what are the differents between regular php extension and zend extension? let’s start from that the extension loading process. PHP是可以被扩展的, PHP的核心引擎Zend Engine也是可以被扩展的, 如果你也对Apache Module的编写也有所了解的话, 那么, 你就会对如下的结构很熟悉了: struct _zend_extension { char *name; char *version; char *author; char *URL; char *copyright; startup_func_t startup; shutdown_func_t shutdown; activate_func_t activate; deactivate_func_t deactivate; message_handler_func_t message_handler; op_array_handler_func_t op_array_handler; statement_handler

Go的net/http

痞子三分冷 提交于 2019-12-09 11:49:09
函数 服务端函数 func Handle(pattern string, handler Handler)将handler按照指定的格式注册到 DefaultServeMux,ServeMux解释了模式匹配规则 func HandleFunc(pattern string, handler func(ResponseWriter, *Request))同上,主要用来实现动 态文件内容的展示,这点与ServerFile()不同的地方。 func ListenAndServe(addr string, handler Handler) error监听TCP网络地址addr然后调用具有 handler的Serve去处理连接请求.通常情况下Handler是nil,使用默认的DefaultServeMux func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error该函数与ListenAndServe功能基本相同,二者不同之处是该函数需要HTTPS连接.也就是说,必须给该服务 Serve提供一个包含整数的秘钥的文件,如果证书是由证书机构签署的,那么证书文件必须是服务证书之后跟着CA 证书. func ServeFile(w ResponseWriter, r