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

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

发布订阅 - 基于A2DFramework的事件机制实现的更多相关文章

  1. 基于A2DFramework的事件机制实现

    随笔- 102  文章- 3  评论- 476  发布订阅 - 基于A2DFramework的事件机制实现   SUMMARY 能做什么 DEMO 原理图 应用场景 能做什么 A2DFramework ...

  2. 《JavaScript设计模式与开发实践》笔记第八章 发布-订阅模式

    第八章 发布-订阅模式 发布-订阅模式描述 发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布-订阅模式可以广泛应用于 ...

  3. Atitit.事件机制 与 消息机制的联系与区别

    Atitit.事件机制 与 消息机制的联系与区别 1. 消息/事件机制是几乎所有开发语言都有的机制,在某些语言称之为消息(Event),有些地方称之为(Message).1 2. 发布/订阅模式1 3 ...

  4. nopCommerce 3.9 大波浪系列 之 事件机制(生产者、消费者)

    一.nop事件机制简介 应用场景:客户支付成功后,需要发送短信.邮件告知客户订单支付成功(短信.邮件由不同模块实现) 实现方法: 1.定义支付成功OrderPaidEvent事件. 2.定义短信,邮箱 ...

  5. spring的事件机制实战

    理论 在分布式场景下,实现同步转异步的方式有三种方式: 1.异步线程池执行:比如借助@Asyn注解,放到spring自带的线程池中去执行: 2.放到消息队列中,在消费者的代码中异步的消费,执行相关的逻 ...

  6. javascript中的发布订阅模式与观察者模式

    这里了解一下JavaScript中的发布订阅模式和观察者模式,观察者模式是24种基础设计模式之一. 设计模式的背景 设计模式并非是软件开发的专业术语,实际上设计模式最早诞生于建筑学. 设计模式的定义是 ...

  7. Redis 发布订阅,小功能大用处,真没那么废材!

    今天小黑哥来跟大家介绍一下 Redis 发布/订阅功能. 也许有的小伙伴对这个功能比较陌生,不太清楚这个功能是干什么的,没关系小黑哥先来举个例子. 假设我们有这么一个业务场景,在网站下单支付以后,需要 ...

  8. 【React】354- 一文吃透 React 事件机制原理

    大纲 主要分为4大块儿,主要是结合源码对 react事件机制的原理 进行分析,希望可以让你对 react事件机制有更清晰的认识和理解. 当然肯定会存在一些表述不清或者理解不够标准的地方,还请各位大神. ...

  9. SpringBoot事件监听机制及观察者模式/发布订阅模式

    目录 本篇要点 什么是观察者模式? 发布订阅模式是什么? Spring事件监听机制概述 SpringBoot事件监听 定义注册事件 注解方式 @EventListener定义监听器 实现Applica ...

随机推荐

  1. Django跑起来

    1.  安装python 2.  安装pip 3.  安装dj 4.  配置dj 5.  建立dj  web app 6.  开始项目 打算写这篇文章,先把目录写上

  2. 模拟Linux的shell

    在学习了Linux的进程控制之后,学习了fork函数和exec函数族,通过这些个函数可以简单的实现一份shell,就是实现一份命令行解释器,当然是简单版的,实现功能如下 能执行普通的命令如ls ,ps ...

  3. 存储构造题(Print Check)

    连接:Print Check 题意:n行m列的矩阵,有k次涂色,每一涂一行或者一列,求最后的涂色结果. 从数据的大小看,暴力肯定要TLE: 问题是如何存储数据. 首先:我们只要最后的涂色结果. 其次: ...

  4. fgets和fputs函数

    1 函数输入 下面两个函数提供每次输入一行的功能. #include <stdio.h> char *fgets( char *restrict buf, int n, FILE *res ...

  5. 待实验:Android 增量升级

    参考资料: 增量升级(省流量更新)的Android客户端实现  http://blog.csdn.net/sgwhp/article/details/9009427 http://my.oschina ...

  6. Android编译错误, Ignoring InnerClasses attribute for an anonymous inner class

    今天在做android项目时,加入第三方包,一编译就报错.错误如下:[2012-01-13 14:51:25 - xxx] Dx warning: Ignoring InnerClasses attr ...

  7. 使用 sqlcmd 运行 Transact-SQL 脚本文件

    在数据恢复时遇到问题:bat文件批处理的指导文档 https://msdn.microsoft.com/zh-cn/library/ms170572%28v=sql.120%29.aspx

  8. Mac上远程桌面连接Windows Server 2012 R2

    在将一台服务器的操作系统由Windows Server 2012升级为Windows Server 2012 R2之后,在Mac电脑上用微软的远程桌面软件怎么也连不上服务器,错误信息如下: Remot ...

  9. Hadoop:Windows 7 32 Bit 编译与运行

    所需工具 1.Windows 7 32 Bit OS(你懂的) 2.Apache Hadoop 2.2.0-bin(hadoop-2.2.0.tar.gz) 3.Apache Hadoop 2.2.0 ...

  10. PC-PC-单片机(Arduino)通信实例

    请仔细理解相关参数,如端口设置.IP设置.COM口设置......等等.....不要盲目COPY.....这涉及2台电脑和一个单片机,其中一台电脑作为服务器并与单片机相连,负责通过网络与客户端通信(s ...