发布订阅 - 基于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、生成报表数据等
  • 能保持前端轻,响应速度快

  • 模块解耦、面向模块编程

 

posted @ 2014-03-18 21:39 McKay 阅读(...) 评论(...) 编辑 收藏