参考链接:Springboot-事件驱动详解
问题:当一个缓存更新时,如何更新缓存,这里不考虑注解框架,思路是通过事件驱动发布一个事件,通知接收者更新缓存
代码结构:
首先定义一个事件,我们修改缓存即发布的此事件
public class CacheEvent extends ApplicationEvent {
/**
* 需要更新的缓存key
*/
private String key;
public CacheEvent(@NonNull Object source) {
super(source);
try {
this.key= (String) source;
} catch (Exception e) {
throw new RuntimeException("缓存事件初初始化失败");
}
}
@Override
public String getSource() {
return (String) super.getSource();
}
}
为了方便扩展,我们定义一个监听接口,应对不同域的监听,具体监听由子类实现
public interface IOrderCache {
/**
*
* @param cacheEvent
* @return true 更新成功
*/
Boolean orderFresh(@NonNull CacheEvent cacheEvent);
具体的缓存实现
@Slf4j
@Component
public class TraceListener implements IOrderCache {
@Override
@EventListener(classes = CacheEvent.class)
@Order(0)//监听顺序,较低的数值优先级更高
public Boolean orderFresh(CacheEvent cacheEvent) {
String source = cacheEvent.getSource();
if(StringUtils.hasLength(source)){
//todo 更新交易缓存
log.warn("交易收到消息,缓存已更新");
return true;
}
return false;
}
}
@Slf4j
@Component
public class WareListener implements IOrderCache {
@Override
@EventListener(classes = CacheEvent.class)
@Order(1)
public Boolean orderFresh(CacheEvent cacheEvent) {
String source = cacheEvent.getSource();
if(StringUtils.hasLength(source)){
//todo 更新仓储缓存
log.warn("仓储收到消息,缓存已更新");
return true;
}
return false;
}
}
测试
@Autowired
private ApplicationEventPublisher publisher;
@Test
public void t6(){
//发布事件
publisher.publishEvent(new CacheEvent("testKey"));
}
测试结果: