内容简介:EasyDomain v1.2 已经发布,这是一个领域驱动开发实用库。 此版本更新内容包括: 基于RocketMQ实现的领域事件发布订阅能力 功能介绍 基于RocketMQ的领域事件发布订阅组件,充分借助了RocketMQ可靠性能力、消息持久...
EasyDomain v1.2 已经发布,这是一个领域驱动开发实用库。
此版本更新内容包括:
基于RocketMQ实现的领域事件发布订阅能力
功能介绍
基于RocketMQ的领域事件发布订阅组件,充分借助了RocketMQ可靠性能力、消息持久化能力、消息回溯能力以及分布式处理能力。同时,便于问题的排查。该组件规避了使用线程池方式领域事件发布订阅能力缺陷。该组件实现了IDomainEventManager接口,可以无缝的在基于线程池发布订阅组件和基于RocketMQ发布订阅之间切换使用,并且发布和订阅的相关业务代码无需修改。
领域事件、以及发布订阅的能力,属于一个应用内部的运行逻辑,用于领域事件的topic,一般情况下不应该被外部系统消费。如果,外部应用需要接受一个消息来触发相关的操作,那么可以单独创建一个供外部系统使用的topic,系统内部相关的领域事件,可以增加一个领域事件订阅,用于发送供外部系统使用的消息。
版本说明
- RocketMQ版本:4.7.1
- JAVA:1.8
Maven
编辑您的pom.xml文件
<profiles>
<profile>
<id>coding</id>
<repositories>
<repository>
<id>leebmw-easy-snapshoot</id>
<name>snapshoot</name>
<url>https://leebmw-maven.pkg.coding.net/repository/easy/snapshoot/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
编辑您的 pom.xml 文件
<dependency>
<groupId>easy-domain</groupId>
<artifactId>easy-domainevent-rocketmq</artifactId>
<version>1.0</version>
</dependency>
使用方法
- 应用服务层服务类的父类构造函数接受一个IDomainEventManager接口实现,RocketMQ领域事件发布订阅组件实现了该接口。无参数的构造函数默认使用基于线程池的组件。以下代码 1 、2处
public abstract class BaseApplication implements IApplication {
private final IDomainEventManager manager;
/**
* 1
* 使用默认 事件处理器的构造函数
*/
protected BaseApplication() {
this.manager = new ThreadPoolTaskDomainEventManager();
}
/**
* 2
* 带事件处理器的构造函数
*
* @param manager 事件处理器
*/
protected BaseApplication(IDomainEventManager manager) {
this.manager = manager;
}
....无关代码省略
}
使用RocketMQ领域事件发布订阅组件需要实例化RocketMqDomainEventManager类。该类接受三个参数分别是IProducerCreator、IConsumerCreator、environmentName。以下代码 1 处
public class RocketMqDomainEventManager implements IDomainEventManager, MessageListenerConcurrently {
//1
public RocketMqDomainEventManager(IProducerCreator producerCreator, IConsumerCreator consumerCreator, String environmentName) {
this.mqProducer = producerCreator.create();
this.consumer = consumerCreator.create();
this.environmentName = (environmentName == null || environmentName.equals("")) ? "prod" : environmentName;
this.initConsumer();
}
....无关代码省略
}
- IProducerCreator接口用于创建RocketMQ的生产者实例,ProducerCreator类是默认的实现类。可以根据具体的情况重新实现IProducerCreator接口,以满足特定的环境。
- IConsumerCreator接口用于创建RocketMQ的消费者实例,ConsumerCreator类是默认的实现类。可以根据具体的情况重新实现IConsumerCreator接口,以满足特定的环境。
- environmentName参数,用于实现消息的环境隔离(如,生产环境和灰度环境的消息隔离),当使用该参数是,RocketMQ的topic名字由 environmentName_<事件名称> 组成。
3.事件的注册需要调用registerDomainEvent方法。见代码1处。
private void initSubscriber(){
// 1
this.registerDomainEvent(MyDomainEvent.class);
this.registerSubscriber(factory.build(MyDomainEvent.class,s->{
this.countDownLatch.countDown();
System.out.println("执行相应的操作");
}),"test1");
}
- 事件的订阅可以使用RocketmqSubscriberFactory类来创建,该类实现了ISubscriberFactory接口
RocketmqSubscriberFactory factory=new RocketmqSubscriberFactory();
this.registerSubscriber(factory.build(MyDomainEvent.class,s->{
this.countDownLatch.countDown();
System.out.println("执行相应的操作");
}),"test1");
- 定义领域事件类
@EventName(value = "ShareDomainEvent", shareTopicName = "SharedTopic")
public class ShareDomainEvent extends BaseDomainEvent {
...省略无关代码
}
- @EventName注解 是可选项,如果不设置,需要在RocketMQ中创建和类名一样的Topic,如:"ShareDomainEvent"
- 指定@EventName注解,value值必须设置,设置value后,value的值是RocketMQ对应的Topic。
- shareTopicName 是可选项,该值用于多个事件共用一个RocketMQ的Topic,可以在多个领域事件类中指定相同shareTopicName值。
- 领域事件是一个业务上的概念,它是由领域实体状态变化产生的,对领域事件的命名上应更多的体现业务含义。领域事件和领域实体紧密相连,领域事件类应和领域实体类放在相同模块或包里。
这里输入代码
详情查看:https://gitee.com/lixiaojing/easy-domain/releases/v1.2
以上所述就是小编给大家介绍的《EasyDomain v1.2 发布,领域驱动开发实用库》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 解构领域驱动设计(二):领域驱动设计的核心之分层架构
- 领域驱动设计实践之路(四):领域驱动在微服务设计中的应用
- 架构视角 - DDD、TDD、MDD领域驱动、测试驱动还是模型驱动?
- 领域驱动设计落地方案
- 领域驱动设计概览
- 领域驱动设计简介
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。