-
近期文章
标签
文章归档
- 2020 年一月
- 2019 年六月
- 2018 年四月
- 2017 年八月
- 2017 年七月
- 2016 年十一月
- 2016 年十月
- 2016 年六月
- 2016 年五月
- 2016 年一月
- 2015 年十二月
- 2015 年十一月
- 2015 年十月
- 2015 年九月
- 2015 年八月
- 2015 年六月
- 2015 年五月
- 2015 年四月
- 2015 年三月
- 2015 年一月
- 2014 年十二月
- 2014 年九月
- 2014 年八月
- 2014 年六月
- 2014 年五月
- 2014 年四月
- 2014 年三月
- 2014 年一月
- 2013 年十二月
- 2013 年十一月
- 2013 年十月
- 2013 年九月
- 2013 年八月
- 2013 年七月
分类目录
功能
分类目录归档:编程语言
RocketMQ学习(四):rocketmq-filtersrv介绍和filter原理
源代码版本是3.2.6,还是直接跑源代码,启动配置参照前面写的《简介和quickstart》,启动顺序是namesrv,broker,filtersrv,filter和broker有顺序要求,如果filtersrv启动后找不到broker,则会System.exit()退出程序。 看下启动图: 看rocketmq-filtersrv代码,核心processor包下的只有一个Class类且只处理2种类型的请求,即DefaultRequestProcessor.processRequest()只处理RequestCode.REGISTER_MESSAGE_FILTER_CLASS和RequestCode.PULL_MESSAGE: REGISTER_MESSAGE_FILTER_CLASS:接收consumer端注册过来的filterClass源代码的请求。 PULL_MESSAGE:接收consumer端发出的拉消息的请求。
RocketMQ学习(三):rocketmq-namesrv介绍
刚刚拉了最新的代码,版本是3.2.6,直接NamesrvStartup类的main()方法启动,不需要带启动参数,启动序列图如下: 当broker,producer,consumer都运行后,namesrv一共有8类线程: 1.ServerHouseKeepingService:守护线程,本质是ChannelEventListener,监听broker的channel变化来更新本地的RouteInfo。 2.NSScheduledThread1:定时任务线程,定时跑2个任务,第一个是,每隔10分钟扫描出不活动的broker,然后从routeInfo中删除,第二个是,每个10分钟定时打印configTable的信息。 3.NettyBossSelector_1:Netty的boss线程(Accept线程),这里只有一根线程。 4.NettyEventExecuter:一个单独的线程,监听NettyChannel状态变化来通知ChannelEventListener做响应的动作。
RocketMQ学习(二):依赖关系和模块功能介绍
现在看的代码版本还是3.2.2 develop。先看张内部结构代码图: 从依赖层次再来看,越是被依赖的,越在底层: rocketmq包含9个子模块:
Netty5源码学习之buffer篇(一):PooledHeapByteBuf
PooledHeapByteBuf,带有池的堆内buffer,顾名思义,肯定比一般通过new出来的buffer性能好。把对象放入对象池缓存起来,一般都是因为创建该对象开销比较大,常见的有线程池(ThreadPool)、连接池(ConnectionPool)等。 PooledHeapByteBuf继承关系如下: PooledHeapByteBuf –》 PooledByteBuf –》 AbstractReferenceCountedByteBuf –》 AbstractByteBuf –》 ByteBuf。 继承关系比较简单清晰。 先介绍几个相关的类: PooledByteBufAllocator:buffer分配器,用来分配buffer(包括堆内和堆外)。 PoolArena:一块逻辑上的内存池,用来管理和组织buffer的,内部数据结构较复杂。 FastThreadLocal:较快的ThreadLocal(相对于jdk自带的),实现:线程T扩展于FastThreadLocalAccess,InternalThreadLocalMap是它的成员变量,set()时放入InternalThreadLocalMap的成员变量数组,下标是index,get()时从InternalThreadLocalMap的成员变量数组中下标是index处取。
GraphicsMagick使用练习
GraphicsMagick官网地址:http://www.graphicsmagick.org/,介绍不多说网上都有,我这里只使用了它图片缩放功能,用java调用练习。 第一步:下载安装。 我下载的是:GraphicsMagick-1.3.20-Q8-win32-dll.exe,安装目录:C:\Program Files (x86)\GraphicsMagick-1.3.20-Q8。安装完毕后,安装目录自动配置到环境变量的Path中了,安装目录里有gm.exe。测试一下,gm -version,如果打印出GraphicsMagick相关信息则ok。这时就可以在命令行里使用gm命令了。 如果使用java调用报错:Caused by: java.io.IOException: CreateProcess error=2。则表示没有gm命令找不到,也就是说环境变量有可能更改了但是没有生效,我的做法是重启eclipse,运行同样程序就ok。如果还是报错,可能环境变量还是没有生效,重启电脑,又或者是安装目录压根就没有配置到环境变量Path中去,手动配置即可。 第二步:写代码。
RocketMQ学习(一):简介和QuickStart
RocketMQ是什么? 引用官方描述: RocketMQ是一款分布式、队列模型的消息中间件,具有以下特点: 支持严格的消息顺序 支持Topic与Queue两种模式 亿级消息堆积能力 比较友好的分布式特性 同时支持Push与Pull方式消费消息 历经多次天猫双十一海量消息考验 RocketMQ是纯java编写,基于通信框架Netty。 代码地址:https://github.com/alibaba/RocketMQ,目前分支是3.2.2 develop。 下载完代码后,将各个模块导入eclipse,本地尝试启动看看。 1.启动nameServer,运行rocketmq-namesrv的NamesrvStartup,运行之前需设置环境变量ROCKETMQ_HOME为RocketMQ项目的根目录,这样有一个作用是,指向logback的配置文件路径,保证在nameServer启动时,logback的正常初始化。我本机设置的是:ROCKETMQ_HOME=C:\Users\Administrator\git\RocketMQ。 The Name Server boot success. 表示启动成功。 2.启动brokerServer,运行rocketmq-broker的BrokerStartup,同样,运行之前需设置环境变量ROCKETMQ_HOME,然后启动参数需要带上【-n “192.168.0.109:9876″】,我本机的ip是192.168.0.109。如果不带-n的参数,那么broker会去访问http://jmenv.tbsite.net:8080/rocketmq/nsaddr获取nameServer的地址,这个地址不是我们自己的nameServer。 The broker[LENOVO-PC, 192.168.0.109:10911] boot success. and name server is 192.168.0.109:9876表示成功。 3.这个非必选项,不运行也可以。还可以启动rocketmq-srvutil的FiltersrvStartup,这是Consumer使用Java代码,在服务器做消息过滤。启动方式和broker一样,具体的过滤原理以后再详细的说。 到此就可以运行demo了。
log4j几个tips
log4j是很常用的日志框架,这里总结几个小知识点: 1. logger是以名称为key,logger为value的形式存储在Hashtable里,所以,logger作为入参不需要传入引用,直接输入名称get即可。 LogFactoryImpl.java 2. logger的继承关系是根据名称的“.”分割来区分,表现为子logger打印日志时遍历父logger里的appender的进行日志打印。 Category.java 3.定义模块名为常量,按模块名称取logger,解决项目里包名类名相同日志无法区分问题。 贴代码: 示例一 示例二 练习代码看这里
classloader隔离练习
平时,我们用maven来管理项目的依赖包,可是有时候还是会出现jar包多版本同时存在的问题,这时,我们可以利用classloader的隔离机制来解决。 1.我们自定义classloader,然后设置它为应用的contextClassLoader运行。 2.自定义classLoader加载特定目录的jar包,同时把加载过的Class缓存起来,这时classLoader就起到隔离作用,像一个容器,只装自己的jar包。 3.Class的查找机制,如果自定义classLoader里加载过,取出来直接返回,没有则用父classLoader查找加载。 4.自定义classLoader加载自己指定目录的jar包,父classLoader则加载classpath里的包或者类。 可能说的比较简洁,大家感兴趣还是直接看代码吧。 练习代码看这里
go语言项目如何引用依赖Github上的开源项目
用go语言写项目时,难免会引用到一些Github上的开源项目,下面说说在开发时如何引用。 系统:windows Go:1.3.1 开发工具:LiteIDE 比如: 当正确引用后,在写“timetool.”时,后面接着会有提示。 步骤: 前提是配好go的环境变量,包括GOROOT和GOPATH。LiteIDE分系统GOPATH和用户自定义GOPATH。 示例要引用的项目地址是:https://github.com/yankai913/go-tools 1. 打开cmd,执行go get github.com/yankai913/go-tools,会把项目源代码下载下来,同时控制台输出 package github.com/yankai913/go-tools等字样以及下载到本地的地址,我的本地地址是C:\Go\bin\src\github.com\yankai913\go-tools。 2. 进入go-tools的timetool包,即执行 cd C:\Go\bin\src\github.com\yankai913\go-tools\timetool,然后,编译,go build,安装,go install。完成后,记得刷新GOPATH,我用的LiteIDE,“package浏览”,“重新加载所有”就行了,此时在编辑器里输入“包名+点”,后面跟着提示信息。 另外,如果你需要go-tools里其他的package,那么你只需要进入相应的包里,执行编译,安装,即可。
springext练习
最近新做的项目使用了webx,项目做完后,对webx还不是很有感觉,只知道webx是基于springext的,然后上网查了下springext,结果都是照搬webx官网文档里讲springext部分,没有自己的见解和代码,所以就打算自己写个demo练练手。 先贴代码,练习代码看这里。 webx官方文档地址,http://www.openwebx.org/。 看图说话: 1.看练习代码之前建议还是先看下webx官方文档里讲的springext部分,了解下概念和装插件。 2.文件《spring.configuration-points》是用来定义扩展点的。里面的内容定义是:“扩展点名称=uri命名空间; nsPrefix=前缀”。注意,扩展点名称推荐用“/”来区分,要唯一。 3.扩展点名称.bean-definition-parsers用来定义捐献文件,里面扩展点名称places/countries这里要转换成places-countries。 4.为捐献定义的schema的路径与扩展点的命名空间相匹配,扩展点是places,捐献是country,那么schema的路径就是“/META-INF/places/country.xsd”。 5.spring.schemas和META-INF/springext/springext-base.xsd可要可不要,因为webx框架已经包含定义。 6.springext和spring完全兼容。 7.schema的编写基础知识了解一点。 感觉大概就是这么多了,主要还是看代码,有兴趣的哥们可以上去看下。