Spring事件的应用
2021-01-08 11:31
标签:用户 return syn long erro rem 应用 row col 在项目中为了解耦两个组件,应用了Spring中的事件通知模型。最新的Spring框架可以将任何的实体包装为event,所以,项目中可以发送任何的实体了。 话不多少,直接上代码。 上述代码完成了事件的发送、接收处理等流程。 Spring事件的应用 标签:用户 return syn long erro rem 应用 row col 原文地址:https://www.cnblogs.com/sunxianbiao/p/12967832.html1、事件实体
@Data
@Accessors(chain = true)
@ApiModel("用户审核事件")
public class UserExamineEvent {
@ApiModelProperty("注册者的id")
String userId;
@ApiModelProperty("推荐人的id")
String recommendId;
@ApiModelProperty("审核结果")
boolean success;
ActivityInfo info;
}
2、通知服务
@Service
public class ActivityServiceImpl implements ActivityService, ApplicationEventPublisherAware {
ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
@Override
@Transactional(rollbackFor = {Exception.class, CommonException.class})
public void examine(ActivityInfo info) {
int value = activityMapper.examine(info);
if (value != 1) {
throw new CommonException(CommonExcepEnums.ERROR.getCode(), "审核失败!");
}
final ActivityInfo allInfo = activityMapper.queryByUserId(info);
boolean isSuccess = "examined".equalsIgnoreCase(info.getStatus()) ? true : false;
//发送审核操作的事件
applicationEventPublisher.publishEvent(new UserExamineEvent()
.setRecommendId(allInfo.getRecommendId())
.setSuccess(isSuccess)
.setUserId(allInfo.getUserId().toString())
.setInfo(allInfo)
);
}
3、事件的监听
@Component
public class UserExamineListener {
@Async
@EventListener
public void listenUserExamine(UserExamineEvent event) {
sendMessage(event);
if (!event.isSuccess()) return;
giveRegisterMoney(event);
Long successed = redisTemplate.opsForValue().increment(getSuccessedKey(event), 1);
recommendServices.forEach(
recommendService -> {
if (recommendService.isAccept(successed)) {
recommendService.afterRecommend(event, successed);
}
}
);
}
}
上一篇:Java-链表知识梳理