-
Notifications
You must be signed in to change notification settings - Fork 54
服务引擎
钟勋 edited this page Jun 22, 2021
·
6 revisions
服务引擎用于规范服务执行步骤,解决服务执行中常见公共性痛点。当一个系统需要提供服务给其他系统调用时,往往服务会进行一些固定步骤操作,比如:入参校验(像JSR303)、业务参数校验、开启事务(如果有必要)、执行业务、异常捕获、构建应答等。如果每个服务都需要自己来完成这些操作,那么众多服务中就会存在很多重复的操作。采用服务引擎你可以一次性的完成这些步骤,简化你的代码。
<dependency>
<groupId>org.bekit</groupId>
<artifactId>service</artifactId>
<version>1.3.0.RELEASE</version>
</dependency>
- 如果是spring-boot项目则不需要进行任何配置。
- 如果是非spring-boot项目则需要手动引入服务引擎配置类ServiceEngineConfiguration。比如:
@Configuration
@Import(org.bekit.service.boot.ServiceEngineConfiguration.class)
public class MyImport {
}
使用服务引擎的步骤:1、定义服务,2、定义服务监听器,3、调用服务。
// 转账交易服务
@org.bekit.service.annotation.service.Service(enableTx = true)
@Slf4j
public class AddUserService {
// 服务前置处理(可以进行业务参数检查,比如校验账号存不存),本方法执行前不会主动开始事务
@ServiceBefore
public void before(ServiceContext<AddUserOrder, AddUserResult> context) {
log.info("执行AddUserService.before");
// 具体校验逻辑
}
// 服务执行,真正开始执行业务(如果@Service的enableTx=true,则会主动开启事务,本方法执行结束后会提交事务)
@ServiceExecute
public void execute(ServiceContext<AddUserOrder, AddUserResult> context) throws TimeoutException {
log.info("执行AddUserService.execute");
AddUserOrder order = context.getOrder();
AddUserResult result = context.getResult();
// 具体业务逻辑
}
// 服务后置处理(本方法执行前不会主动开始事务)
@ServiceAfter
public void after(ServiceContext<AddUserOrder, AddUserResult> context) {
log.info("执行AddUserService.after");
// 具体业务逻辑
}
}
服务监听器可以监听服务引擎发出的事件,监听到事件后可以进行入参校验(像JSR303)、业务参数校验、开启事务(如果有必要)、执行业务、异常捕获、构建应答等。它监听的是所有服务的事件,所以只需定义一次,而不是每个服务都定义一次。
@ServiceListener(priority = 1) // 服务监听器注解(监听服务引擎发出的事件),priority属性表示监听器优先级(具体使用方式请查看“事件总线”功能模块)
public class MyServiceListener {
// 监听服务申请事件
@Listen
public void listenServiceApplyEvent(ServiceApplyEvent event) {
// 监听到这个事件后,可以进行一些初始化,比如:打印日志、JSR303校验等
}
// 监听服务异常事件
@Listen(priorityType = PriorityType.DESC)
public void listenServiceExceptionEvent(ServiceExceptionEvent event) {
// 监听这个事件后可以执行一些操作,比如:打印异常日志。
}
// 监听服务完成时间
@Listen(priorityType = PriorityType.DESC)
public void listenServiceFinishEvent(ServiceFinishEvent event) {
// 监听这个事件后可以进行一些结尾性操作,比如:打印日志。
}
}
在需要执行服务的地方注入服务引擎ServiceEngine
@Autowired
private ServiceEngine serviceEngine;
然后就可以执行服务
AddUserOrder order = new AddUserOrder();
order.setUsername("zhangsan");
order.setAge(20);
// 执行服务
AddUserResult result = serviceEngine.execute("addUserService", order);