程序包 com.iohao.game.widget.light.domain.event
package com.iohao.game.widget.light.domain.event
扩展模块 - domain-event 领域事件 - 可为你的系统实现类似 Guava-EventBus、Spring 事件驱动模型 ApplicationEvent、业务解耦、规避并发、不阻塞主线程...等,各种浪操作。
介绍
Disruptor 是一个开源的并发框架。由英国外汇交易公司LMAX开发的一个高性能队列,并且大大的简化了并发程序开发的难度,获得2011Duke’s程序框架创新奖。可以将 disruptor 理解为单机版本的 MQ(轻量级单机最快MQ -- disruptor)。Event Source 领域事件优点
1. 领域驱动设计,基于LMAX架构。 2. 单一职责原则,可以给系统的可扩展、高伸缩、低耦合达到极致。 3. 异步高并发、线程安全的,使用 disruptor 环形数组来消费业务。 4. 使用事件消费的方式编写代码,即使业务在复杂也不会使得代码混乱,维护代码成本更低。 5. 可灵活的定制业务线程模型 6. 插件形式提供事件领域,做到了可插拔,就像玩乐高积木般有趣。for example
// 自定义领域消息实体
public record StudentEo(int id) implements Eo {
}
// 定义领域事件 - 用于处理 StudentEo 领域消息实体,一个事件消费类只处理一件事件(单一职责原则)
public final class StudentEmailEventHandler1 implements DomainEventHandler<StudentEo> {
@Override
public void onEvent(StudentEo studentEo, boolean endOfBatch) {
log.debug("给这个学生发送一个email消息: {}", studentEo);
}
}
// 测试用例
public class StudentDomainEventTest {
... ...省略部分代码
@Before
public void setUp() {
// ======项目启动时配置一次(初始化)======
// 领域事件上下文参数
DomainEventContextParam contextParam = new DomainEventContextParam();
// 配置一个学生的领域事件消费 - 给学生发生一封邮件
contextParam.addEventHandler(new StudentEmailEventHandler1());
// 配置一个学生的领域事件消费 - 回家
contextParam.addEventHandler(new StudentGoHomeEventHandler2());
// 配置一个学生的领域事件消费 - 让学生睡觉
contextParam.addEventHandler(new StudentSleepEventHandler3());
// 启动事件驱动
domainEventContext = new DomainEventContext(contextParam);
domainEventContext.startup();
}
@Test
public void testEventSend() {
// 这里开始就是你的业务代码
StudentEo studentEo = new StudentEo(1);
// 发送事件、上面只配置了一个事件。
// 如果将来还需要给学生发送一封email,那么直接配置。(可扩展)
// 如果将来还需要记录学生今天上了什么课程,那么也是直接配置 (可扩展) 这里的业务代码无需任何改动(松耦合)
// 如果将来又不需要给学生发送email的事件了,直接删除配置即可,这里还是无需改动代码。(高伸缩)
studentEo.send();
}
}
- 作者:
- 渔民小镇
- 日期:
- 2021-12-26
-
类说明负责 Disruptor 的管理领域事件上下文事件发布器