实现同步思路
项目的ORM层框架用的springdata + jpa,用logstash同步最快也是一分钟同步一次,所以我在解决es和mysql同步问题的时候,除了使用logstash进行同步,还在JAVA中使用AOP拦截springdata的增删改方法,对mysql进行数据修改的同时去同步es的数据,达到实时修改的目的。
@Aspect
@Component
public class XxxAspect {
....
@Pointcut(value = "execution(public * xxx.XxxRepository.save*(..))")
public void saveProduct(){}
@AfterReturning(returning = "ret",pointcut = "saveProduct()")
public void saveAfter(Object ret){
LOGGER.info("成功拦截增改操作!"+TimeUtil.getYearMothDayAndhourMinuteSecond());
....
}
....
}
对于springData的保存方法有 save,saveAndFlush,saveAll,所以在拦截的时候直接save*表示拦截所有save开头的方法,然后对参数类型进行判断,来做相应的处理
if (ret instanceof XXX){
....
} else if (ret instanceof Collection) {
....
}else {
LOGGER.error("保存操作返回参数有误,请核实保存方法是否以save开头");
return;
}
出现问题
通过实际运用发现,saveAll方法并不会每次都被save*拦截,但是测试又会被拦截,该问题没有找到原因,解决方式是不使用通配符,拦截方法名都全部写全
@Pointcut(value = "execution(public * XxxRepository.save(..)) ||" +
"execution(public * XxxRepository.saveAndFlush(..)) ||" +
"execution(public * XxxRepository.saveAll(..))")
public void saveProduct(){}