如何监听其他业务单据的操作事件.md 2.2 KB

说明

目前是按应用划分了不同的模块,应用模块主要是在/applications下面。 如果应用A与应用B之间需要关联处理,通常是可以由应用A抽离出api接口,给应用B 去调用,针对强耦合的场景是可以这样做的。但是有些场景,是存在一定的变数,因此 不能把应用之间的关联处理耦合在一起。这样的场景,可以通过监听事件的方式来扩展。

// 发布事件
SpringContextHolder.getContext().publishEvent(new Event());
// 标准的业务操作事件
BizOperationEvent.save(baseDTO).publish();
BizOperationEvent.update(baseDTO).publish();
......

// 监听事件
@EventListener(Event.class)
public void onEvent(Event event) {
    // do something
}

案例一

在oa模块的通知公告审核通过后,给企业微信发送全员消息

通知公告审核的业务,所在模块是/applications/app-oa/app-oa-service, 代码在com.usoftchina.saas.oa.service.impl.NotifyServiceImpl.singleAudit, 企业微信的扩展模块是/external/ext-qywx/ext-qywx-service, 因为单据审核之后都会发布BizOperationEvent事件,因此可以监听该事件来扩展通知公告的 审核业务,代码在com.usoftchina.saas.qywx.listener.NotifyAuditedListener.onBizAuditEvent

@Async
@EventListener(value = BizOperationEvent.class, condition = "#event.operation.name=='AUDIT' && #event.bizType=='Notify'")
public void onBizAuditEvent(BizOperationEvent event) throws Exception{
    NotifyDTO dto = notifyApi.getById(event.getBizId());
    messageSdk.send(...);
}

这样处理的好处是显而易见的,如果将来不用企业微信的功能了,直接去掉/external/ext-qywx/ext-qywx-service模块即可, 对oa模块没任何影响。

案例二

给所有的操作都加上日志记录

因为单据每个操作之后都会发布BizOperationEvent事件,因此可以监听该事件来扩展日志功能, 扩展模块是/base/base-biz/base-biz-service, 代码在com.usoftchina.saas.biz.listener.MessageLogListener.onBizEvent

@EventListener(BizOperationEvent.class)
@Async
public void onBizEvent(BizOperationEvent event) {
    messageLogService.log(event);
}