發布訂閱 - 基於A2DFramework的事件機制實現


SUMMARY

  • 能做什么
  • DEMO
  • 原理圖
  • 應用場景

 

能做什么

A2DFramework的事件機制是基於發布訂閱模式改進得來的一套API,中間件部分實現了msmq、redis、Supersocket可替換。能夠實現較徹底的模塊事件傳遞過程中的解耦,支持分布式環境。由於訂閱端采用了消息隊列作為轉發層,因此也能支持事件量很大的場景。

 

DEMO

Demo工程下載地址(可右鍵保存):

發布訂閱Demo.rar 

 

一、建立各個工程,並且加入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、生成報表數據等
  • 能保持前端輕,響應速度快

  • 模塊解耦、面向模塊編程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM