package com.ukefu.webim.util.aop; import java.util.List; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ukefu.core.UKDataContext; import com.ukefu.util.UKTools; import com.ukefu.util.UKeFuList; import com.ukefu.util.event.MultiUpdateEvent; import com.ukefu.webim.service.hibernate.BaseService; import com.ukefu.webim.web.model.ESBean; @Aspect @Component public class SyncDatabaseExt { @Autowired private BaseService<?> dbDataRes ; /** * 定义拦截规则:拦截org.springframework.data.elasticsearch.repository。 */ @Pointcut("execution(* org.springframework.data.elasticsearch.repository.*.save(*))") public void syncSaveEsData(){} /** * 定义拦截规则:拦截org.springframework.data.elasticsearch.repository。 */ @Pointcut("execution(* org.springframework.data.elasticsearch.repository.*.delete(*))") public void syncDeleteEsData(){} @SuppressWarnings("unchecked") @Around("syncSaveEsData()") public Object syncSaveEsData(ProceedingJoinPoint pjp) throws Throwable{ Object[] args = pjp.getArgs() ; if(args.length == 1){ Object data = args[0] ; if(data!=null){ if(data instanceof UKeFuList){ /**只有一个地方用到,从DB同步数据到ES**/ }else if(data instanceof List){ List<Object> dataList = (List<Object>)data ; for(Object dbData : dataList){ UKTools.multiupdate(new MultiUpdateEvent<Object>(dbData , dbDataRes, UKDataContext.MultiUpdateType.SAVE.toString())); } }else{ UKTools.multiupdate(new MultiUpdateEvent<Object>(data, dbDataRes, UKDataContext.MultiUpdateType.SAVE.toString())); } } } return pjp.proceed(); } @SuppressWarnings("unchecked") @Around("syncDeleteEsData()") public Object syncDeleteEsData(ProceedingJoinPoint pjp) throws Throwable{ Object[] args = pjp.getArgs() ; if(args.length == 1){ Object data = args[0] ; if(data instanceof List){ List<Object> dataList = (List<Object>)data ; for(Object dbData : dataList){ UKTools.multiupdate(new MultiUpdateEvent<Object>(dbData , dbDataRes, UKDataContext.MultiUpdateType.DELETE.toString())); } }else{ if(data instanceof ESBean){ UKTools.multiupdate(new MultiUpdateEvent<Object>(data, dbDataRes, UKDataContext.MultiUpdateType.DELETE.toString())); }else{ UKTools.multiupdate(new MultiUpdateEvent<Object>(data, dbDataRes, UKDataContext.MultiUpdateType.DELETE.toString())); } } } return pjp.proceed(); } }