SUMMARY
- 能做什么
- DEMO
- 原理圖
- 應用場景
能做什么
A2DFramework的事件機制是基於發布訂閱模式改進得來的一套API,中間件部分實現了msmq、redis、Supersocket可替換。能夠實現較徹底的模塊事件傳遞過程中的解耦,支持分布式環境。由於訂閱端采用了消息隊列作為轉發層,因此也能支持事件量很大的場景。
DEMO
Demo工程下載地址(可右鍵保存):
一、建立各個工程,並且加入A2DFramework.EventService的引用
二、給各個工程加入A2D基本代碼,如下:
A2DFramework.Starter.Init();
A2DFramework.QueueService.Starter.Init();
A2DFramework.EventService.Starter.Init();
三、加入A2D.config文件以及相應的配置(事件機制用到了隊列框架)
<?xml version="1.0" encoding="utf-8" ?> <A2D> <QueueSetting QueueType="MSMQ"><!--Redis--> <MSMQ><!-- 根據QueueType類型,此節點可省略 --> <AutoDeleteNetworkFile>true</AutoDeleteNetworkFile> <QueueConnectionStringFormat>server1\private$\A2D_訂閱者2_{0}</QueueConnectionStringFormat> <NetworkLocation>msmq</NetworkLocation> <MaxQueueBodyLength>3670016</MaxQueueBodyLength> </MSMQ> <Redis><!-- 根據QueueType類型,此節點可省略 --> <ReadWriteServerIps>192.168.1.1</ReadWriteServerIps> <ReadOnlyServerIps>192.168.1.1</ReadOnlyServerIps> <MaxReadPoolSize>1000</MaxReadPoolSize> <MaxWritePoolSize>1000</MaxWritePoolSize> <QueueNameFormat>A2D_{0}1</QueueNameFormat> </Redis> </QueueSetting> <ShareFileSetting> <NetworkShareRoot>\\server1\share\msmq</NetworkShareRoot> </ShareFileSetting> <EventSetting EventBusType="Redis"><!--SuperSocket/Redis/Local--> <SuperSocket><!-- 可選 --> <Identifier>app server name 3</Identifier><!--客戶端的名稱,需要發往event server--> <Address>192.168.4.191</Address> <Port>2012</Port> <RetryConnectInterval>1000</RetryConnectInterval> </SuperSocket> <Redis><!-- 可選 --> <Identifier>app server name 1</Identifier> <ReadWriteServerIps>192.168.4.191</ReadWriteServerIps> <ReadOnlyServerIps>192.168.4.191</ReadOnlyServerIps> <MaxReadPoolSize>1000</MaxReadPoolSize> <MaxWritePoolSize>1000</MaxWritePoolSize> </Redis> <Local><!-- 可選 --> </Local> <EventMapping><!-- Event節點可以有多個 --> <Event Event="Events.OrderCreated" EventFullType="Events.OrderCreated, Events">訂閱者2.OrderCreatedEventHandlerProcessor, 訂閱者2</Event>
<!--
Event屬性:事件Type全路徑
EventFullType屬性:事件Type全路徑+dll名
節點value:關聯的事件處理函數類+dll名
-->
</EventMapping> </EventSetting> </A2D>
四、定義事件(可自定義)
public class OrderCreated : IEvent //A2DFramework.EventService.IEvent { /// <summary> /// 新訂單ID /// </summary> public Guid NewOrderID { get; set; } /// <summary> /// 下單時間 /// </summary> public DateTime OrderTime { get; set; } }
五、在訂閱者中定義事件處理函數:
public class OrderCreatedEventHandlerProcessor : IProcessReceivedEventProcessorHandler<OrderCreated> { public void Process(OrderCreated evt) { Console.WriteLine("訂閱者1 接收到了OrderCreated事件,NewOrderID: " + evt.NewOrderID); } }
六、運行效果圖:
原理圖
應用場景
- 將重載荷通過事件分發到專門處理的服務器來處理,比如生成pdf、生成報表數據等
- 能保持前端輕,響應速度快
- 模塊解耦、面向模塊編程