如何为网站增加邮件推送功能

有时候,有人给我的网站留了言,但是我必须要打开我的网站( https://www.xiandanplay.com/ )才知道,所以我决定给网站增加一个邮件推送的功能,好让我第一时间知道。按照我自己的思路,同时为了去学习了解rabbitmq以及EventBus概念,我设计了一套邮件推送的功能,这里分享出来,可能方案不是很好,大家不喜勿喷。

什么是事件总线

事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。

关于这个概念,网上有很多讲解的,这里我推荐一个讲的比较好的( 事件总线知多少 )

什么是RabbitMQ

RabbitMQ这个就不用说了,想必到家都知道。

粗糙流程图

简单来解释就是:

1、定义一个事件抽象类

2、定义一个事件处理抽象类,以及对应的一个队列消息执行的一个记录

3、定义一个邮件事件消息类,继承自EventData,以及一个邮件处理的Hanler继承自EventHandler

4、接着就是如何把事件消息和事件Hanler关联起来,那么我这里思路就是把EmailEventData的类型和CreateEmailHandler的类型先注册到字典里面,这样我就可以根据EmailEventData找到对应的处理程序了,找类型还不够,如何创建实例呢,这里就还需要把CreateEmailHandler注册到DI容器里面,这样就可以根据容器获取对象了,如下

5、发送消息,这里代码简单,就是简单的发送消息,这里用eventData.GetType().Name作为消息的RoutingKey,这样消费这就可以根据这个key调用FindEventType,然后找到对应的处理程序了

6、订阅消息,核心的是这一段

Type eventType = _eventBusManager.FindEventType(eventName);
var eventData = (T)JsonConvert.DeserializeObject(body, eventType);
EventHandler<T> eventHandler = _eventBusManager.FindHandlerType(eventType)  as       EventHandler<T>;

注意,这里我使用的时候有个小坑,就是最开始是用using包裹这个IModel channel = connection.CreateModel();导致最后程序启动后无法收到消息,然后去rabbitmq的管理界面发现没有channel连接,队列也没有消费者,最后发现可能是using执行完后就释放掉了,把using去掉就好了。

好了,到此,我的思路大概讲完了,现在我的网站留言也可以收到邮件了,那么多测试邮件,哈哈哈哈哈

大家感兴趣的话可以去我的网站( https://www.xiandanplay.com/ )踩一踩,互加友链也可以的,谢谢大家,不喜勿喷喽!

标签:游戏攻略