1.å¦ä½èªå¨è®¾å¥½Android.mkçLOCAL
2.Vert.x 源码解析(4.x)——Local EvnentBus入门使用和源码解析
å¦ä½èªå¨è®¾å¥½Android.mkçLOCAL
ããç¨Cocos2d-xå¼åAndroid游ææ¶ï¼éè¦å¨Android.mkæ件ä¸ï¼ä¸ºLOCAL_SRC_FILESåéæå®è¦ç¼è¯çæºä»£ç ï¼ä»¥å为LOCAL_C_INCLUDESåéæå®å¤´æ件ãå½é¡¹ç®æ件è¶æ¥è¶å¤æ¶ï¼è¿ç§æå¨ä¿®æ¹å¾æµªè´¹æ¶é´ã好å¨Android.mkå ¶å®å°±æ¯ä¸ä¸ªmakefileï¼æ们å¯ä»¥åå©makefileè¯æ³æ¥èªå¨å®æè¿é¨åå·¥ä½ã
ãã使ç¨å¤é¨å½ä»¤
ããæç®åçæ¹å¼å°±æ¯è°ç¨shellå¤é¨å½ä»¤ãé¦å æ们æå®è¦æç´¢çæºæä»¶æ ¹ç®å½ï¼è®¾ä¸ºSRC_ROOTè¿ä¸ªåéãLOCAL_C_INCLUDESåéç´æ¥å°±æ¯ç¨find <path> -type då½ä»¤å»æç´¢æ ¹ç®å½ä¸çç®å½ãLOCAL_SRC_FILESç¨å¾®å¤æä¸äºï¼é¦å æ们å ç¨find <path> -type få¾å°ææçæ®éæ件路å¾ï¼åæå®æºä»£ç æ件åçå¹é 模å¼ï¼ä¾å¦æç¨çæ¯c++ï¼æ以ææå®äºåéSRC_SUFFIXåæ¾ä¸è¬c++æºä»£ç æ件çåç¼åï¼ï¼ç¨filterå½ä»¤çéåºææçæºä»£ç æ件路å¾ã
ããå®æ´ç代ç å¦ä¸ï¼
ãã# WARNING: Shell command is 安卓used, it is only works on a UNIX-like OS.
ãã# Replace it with Makefile rules if you want to run on Windows.
ããSRC_SUFFIX := *.cpp *.c
ããSRC_ROOT := $(LOCAL_PATH)/../../Classes
ããALL_FILES := $(shell find $(SRC_ROOT) -type f)
ããSRC_FILES := $(filter $(subst *,%,$(SRC\_SUFFIX)),$(ALL_FILES))
ããLOCAL_SRC_FILES := hellocpp/main.cpp
ããLOCAL_SRC_FILES += $(SRC\_FILES:$(LOCAL_PATH)/%=%)
ããSRC_DIRS := $(shell find $(SRC_ROOT) -type d)
ããLOCAL_C_INCLUDES := $(SRC_DIRS)
ãã使ç¨çº¯Makefileè¯æ³
ãã使ç¨å¤é¨å½ä»¤æ¯æç®åå®ç¨ç解å³æ¹æ¡ï¼ä½æ£å¦ä¸é¢ç代ç 注éææåçï¼è¿ç§æ¹å¼åªè½å¨Unixç³»ç»ä¸æè½ç¨ï¼å¯¹äºéè¦è·¨å¹³å°éç¨çæ åµï¼è¿æ¯éè¦éç¨çº¯Makefileè¯æ³æè¡ã
ããæ们ç¥éï¼Makefileçwildcardå½ä»¤å¯ä»¥é¨åå®ç°ç±»ä¼¼findçåè½ï¼ä¾å¦æ¾å°å½åç®å½ä¸ç.cæ件å¯ä»¥ç¨$(wildcard *.c)ï¼å¯æwildcardæ¯ç«ä¸å¤å¼ºå¤§ï¼è¯¥å½ä»¤çç»æ并ä¸å å«åç®å½ä»¥ä¸ç.cæ件ãæ³è¦å®ç°è¿ä¸åè½ï¼æ们å¯ä»¥åç¨StackOverflowä¸å¤§ç¥ç¨çº¯Makefileè¯æ³åçéå½wildcardï¼
ãã# recursive wildcard
ããrwildcard = $(foreach d,$(wildcard $1\*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)))该rwildcardå½ä»¤ä¼ å ¥ä¸¤ä¸ªåæ°ï¼ç¬¬ä¸ä¸ªåæ°$1æ¯ç®å½ï¼ç¬¬äºä¸ªåæ°$2æ¯å¹é 模å¼ã该å½ä»¤é¦å ç¨$(wildcard $1*)å¾å°ç®å½ä¸çæææ件åä¸çº§åç®å½ï¼åéåä¸éï¼å¯¹äºå½å$dåéæ¯ç®å½çæ åµï¼å¯¹$d/ç®å½éå½è°ç¨rwildcardï¼å¯¹äº$dæ¯æ®éæ件çæ åµï¼éå½è°ç¨ä¼å 为$(wildcard $d/*)æ¾ä¸å°å¹é èç»æ¢ï¼æ¥ä¸æ¥ä¾¿è°ç¨filterå½æ°å¯¹$2ç模å¼è¿è¡çéã
ããå®æ´ç代ç å¦ä¸ï¼
ããSRC_SUFFIX := *.cpp *.c
ããSRC_ROOT := $(LOCAL_PATH)/../../Classes
ãã# recursive wildcard
ããrwildcard = $(foreach d,$(wildcard $1\*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)))
ããSRC_FILES := $(call rwildcard,$(SRC_ROOT)/,$(SRC_SUFFIX))
ããLOCAL_SRC_FILES := hellocpp/main.cpp
ããLOCAL_SRC_FILES += $(SRC\_FILES:$(LOCAL_PATH)/%=%)
ããçé¤ä¸éè¦ç¼è¯çæºä»£ç æ件
ããä¸é¢ä»ç»çæ¹æ³æä¸ä¸ªéç¨çåæï¼é£å°±æ¯$SRC_ROOTä¸æ¯ä¸ªæºä»£ç æ件é½éè¦è¢«ç¼è¯ãèææ¶åè¿ä¸ªæ¡ä»¶å¹¶ä¸æç«ï¼åæ¬æ¸£æå¨é¡¹ç®ä¸å°±ç¨å°äºä¸äºå¤é¨åºï¼è¿äºåºçæºä»£ç æ¯ä¸ç¨è¢«ç¼è¯çï¼ä¾å¦è®¾ä¸ºASIO_HEADER_ONLYçAsioåºï¼ãè¿ä¸ªæ¶åå°±éè¦æè¿é¨åæºä»£ç æé¤å¨LOCAL_SRC_FILESä¹å¤ã
ãã第ä¸ç§æ¹æ³ï¼filter-out
ãã第ä¸ç§æ¹æ³æ¯ç¨Makefileçfilter-outå½ä»¤ï¼
ãã# ASIO library is set as ASIO_HEADER_ONLY, so it will be excluded from source code
ããEXCLUDE_SRC_FILES := $(SRC_ROOT)/3rdParty/Asio/asio/impl/%.cpp
ããEXCLUDE := $(filter $(EXCLUDE_SRC_FILES),$(SRC_FILES))
ããSRC_FILES := $(filter-out $(EXCLUDE_SRC_FILES),$(SRC_FILES))è¿ç§æ¹å¼è½ç¶å¯è¡ï¼ä½æ¯filter-outæ æ³ç¨äºå¤çº§ç®å½ç模å¼å¹é ï¼æ以è¿ç§æ¹æ³æ´é²äºå¤ªå¤å ³äºå¤é¨åºæºä»£ç è·¯å¾çç»èãæ没æå¯è½æå®è¦æé¤çåºåæå ³é®åï¼åæ ¹æ®è¿ä¸ªä¿¡æ¯å»çé¤å¹é çæºä»£ç æ件å¢ï¼
ãã第äºç§æ¹æ³ï¼æ¹è¿rwildcard
ãã第äºç§æ¹å¼æ¯å¨rwildcardä¸å å ¥ä¸ä¸ªå¤æç¨äºçé¤ï¼å¦æå½åçç®å½/æ件åå¹é å°æè¦çé¤çå ³é®åï¼åä»ä¹é½ä¸åï¼å¦å就继ç»éå½è°ç¨åæ§è¡filterå½ä»¤ã
ãã# ASIO library is set as ASIO_HEADER_ONLY, so it will be excluded
ããEXCLUDE_LIB := Asio
ãã# recursive wildcard
ããrwildcard = $(foreach d,$(wildcard $1\*),$(if $(findstring $(EXCLUDE_LIB),$d),,$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)))
ããSRC_FILES := $(call rwildcard,$(SRC_ROOT)/,$(SRC_SUFFIX))è¿ç§æ¹å¼æ¯å¥½ä¸äºäºï¼èä¸ç´æ¥å¨éå½wildcardæç´¢æ¶å°±è¿è¡äºæé¤ï¼ä¸è¿rwildcardåå¾æ´å¤æäºï¼å¯è¯»æ§ä¸ä½³ã
ãã第ä¸ç§æ¹æ³ï¼FILTER_OUT_PATTERN
ããæåçæ¹æ³ä¹æ¥èªäºStackOverflow大ç¥ç¨çº¯Makefileè¯æ³æ¹é è¿çfilter-outï¼ä¸è¿æ¬è´¨ä¸å第äºç§æ¹æ³çå®ç°æ¯ç±»ä¼¼çï¼è¿éå°±ä¸è¯¦ç»è§£éäºï¼
ãã# ASIO library is set as ASIO_HEADER_ONLY, so it will be excluded from source code
ããEXCLUDE_SRC_PATTERN := asio
ããFILTER_OUT_PATTERN = $(foreach v,$(2),$(if $(findstring $(1),$(v)),,$(v)))
ããSRC_FILES := $(call FILTER\_OUT\_PATTERN,$(EXCLUDE_SRC_PATTERN),$(SRC_FILES))
Vert.x 源码解析(4.x)——Local EvnentBus入门使用和源码解析
Vert.x 源码解析(4.x)——Local EvnentBus入门使用和源码解析 本文将介绍使用和解析Vert.x的本地事件总线(Local EvnentBus)的基本概念、入门使用方法以及源码解析。源码g源1. 简介
Vert.x EventBus是安卓一个用于异步通信的分布式事件总线,支持在同个Vert.x应用程序内部或跨多个Vert.x应用程序之间的源码g源消息交互,实现组件、安卓模块或服务之间的源码g源比价网 源码松耦合与高度可扩展性。2. 基本概念
EventBus分为Local模式和Clustered模式,安卓Local模式适用于项目内部通信,源码g源而Clustered模式用于集群间传输。安卓3. 入门使用
3.1 获取EventBus
每个Vertx实例仅有一个EventBus实例,源码g源可使用注册处理器、安卓调用consumer()方法获取MessageConsumer对象。源码g源 在集群模式下注册处理器时,安卓注册信息传播至集群中所有节点可能需要时间。源码g源3.2 注销处理器
通过unregister方法注销处理器,安卓在集群模式下,此动作传播至节点可能需要额外时间,定位软件源码分享可使用回调完成通知。3.3 发布消息
使用publish方法指定地址发布消息,消息将传递给所有在该地址注册的处理器。3.4 发送消息
使用send方法发送消息至指定地址的单个处理器。3.5 设置消息头
在发送或publish消息时可提供DeliveryOptions来设置头信息。3.6 消息顺序
消息按发送顺序传递给处理器。3.7 消息对象
消息处理器接收到的对象类型为Message,包含消息体和头信息。b站源码正则3.8 应答消息/发送回复
通过reply方法在处理器接收到消息后发送回复至消息来源,确认处理。3.9 带超时的发送
使用DeliveryOptions指定超时时间,若超时未收到回复,则调用应答处理器。3. 发送失败
消息发送失败时,应答处理器将接收到异常失败结果。3. 消息编解码器
注册消息编解码器支持发送任何对象,搜索单页面源码通过DeliveryOptions指定对象类型。3. 集群模式的Event Bus
将多个Vert.x实例组合为集群,实现分布式Event Bus。4. 关键类简介
4.1 主要类的作用
EventBus、EventBusInternal、EventBusImpl: EventBus接口定义方法,EventBusImpl实现管理消息、监听器注册、spring源码对并发消息派发等功能,异步操作。 HandlerRegistration、MessageConsumerImpl: 消费者实现类,管理订阅关系与消息派发。 DeliveryContextBase、InboundDeliveryContext、OutboundDeliveryContext: 消息传递管理类,处理发送和接收过程。4.2 EventBus系列
EventBus、EventBusInternal: EventBus接口,EventBusImpl实现。4.3 MessageConsumer系列
MessageConsumerImpl实现消息消费与订阅管理。4.4 DeliveryContext系列
DeliveryContextBase管理消息传递过程,InboundDeliveryContext处理接收消息,OutboundDeliveryContext处理发送消息。4.5 Message系列
Message实现消息对象,MessageImpl具体实现。4.5.3 MessageCodec系列
CodecManager获取解码器,lookupCodec方法实现消息解码。5. Local模式EventBus源码解析
5.1 consumer方法分析
绑定时调用consumer方法,创建MessageConsumerImpl实例。5.2 handler
注册处理器,涉及HandlerRegistration、EventBusImpl等类。5.3 send
发送消息,EventBusImpl类实现,包括创建消息、发送上下文等。5.4 reply
回复消息,与send方法类似。5.5 总结
本地事件总线操作简单,消息发布与发送遵循明确的步骤。回复消息与发送类似,关键在于消息处理与应答机制。