关于elasticsearch同步mysql的个人历程

实现同步思路

项目的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(){}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值