| | |
| | | //package org.springblade.common.interceptor; |
| | | // |
| | | //import org.apache.ibatis.binding.MapperMethod; |
| | | //import org.apache.ibatis.executor.Executor; |
| | | //import org.apache.ibatis.executor.statement.StatementHandler; |
| | | //import org.apache.ibatis.mapping.BoundSql; |
| | | //import org.apache.ibatis.mapping.MappedStatement; |
| | | //import org.apache.ibatis.plugin.*; |
| | | //import org.apache.logging.log4j.util.Strings; |
| | | //import org.springblade.common.utils.SQLParseUtils; |
| | | //import org.springblade.es.service.ElasticsearchDocumentService; |
| | | //import org.springblade.es.vo.EsParam; |
| | | //import org.springblade.modules.article.entity.Article; |
| | | //import org.springframework.beans.factory.annotation.Autowired; |
| | | //import java.util.Properties; |
| | | // |
| | | //@Intercepts({ |
| | | // @Signature(type = StatementHandler.class, method = "update", args = {MappedStatement.class, Object.class}) |
| | | //}) |
| | | //public class DataSyncInterceptor implements Interceptor { |
| | | // |
| | | // @Autowired |
| | | // private ElasticsearchDocumentService elasticsearchDocumentService; |
| | | // |
| | | // /** |
| | | // * 拦截器在sql执行成功后同步到es, |
| | | // * 如果同步失败抛出异常,保证数据一致性 |
| | | // * |
| | | // * @param invocation |
| | | // * @return |
| | | // * @throws Throwable |
| | | // */ |
| | | // @Override |
| | | // public Object intercept(Invocation invocation) throws Throwable { |
| | | // Object res = invocation.proceed(); |
| | | // |
| | | // Object[] args = invocation.getArgs(); |
| | | // if (args.length >= 2) { |
| | | // MappedStatement mappedStatement = (MappedStatement) args[0]; |
| | | // //参数 |
| | | // Object parameter = invocation.getArgs()[1]; |
| | | // BoundSql boundSql = mappedStatement.getBoundSql(parameter); |
| | | // //sql |
| | | // String sql = boundSql.getSql(); |
| | | // sql = sql.replaceAll("\n", ""); |
| | | // //获取表名 |
| | | // String tableName = SQLParseUtils.getTableName(sql); |
| | | // String sqlType = SQLParseUtils.parseSQLType(sql); |
| | | // if (!Strings.isBlank(tableName)) { |
| | | // if (tableName.equals("jczz_article") || |
| | | // tableName.equals("jczz_house") || |
| | | // tableName.equals("jczz_household") || |
| | | // tableName.equals("jczz_place")) |
| | | // syncDataAfterUpdate(sql,tableName,sqlType,args[1]); |
| | | // } |
| | | // } |
| | | // return res; |
| | | // } |
| | | // |
| | | // |
| | | // /** |
| | | // * 数据同步 |
| | | // * @param tableName |
| | | // * @param sqlType |
| | | // * @param parameter |
| | | // */ |
| | | // private void syncDataAfterUpdate(String sql,String tableName,String sqlType,Object parameter) { |
| | | // EsParam esParam = new EsParam(); |
| | | // esParam.setIndexName("test"); |
| | | // esParam.setTableName(tableName); |
| | | // // 判断操作类型 |
| | | // if (sqlType.equals("INSERT")){ |
| | | // //insert 可用直接拦截到实体类 |
| | | // if (tableName.equals("jczz_article")) { |
| | | // Article entity = (Article) parameter; |
| | | // elasticsearchDocumentService.addArticle(esParam,entity); |
| | | // } |
| | | // } |
| | | // if(sqlType.equals("UPDATE")){ |
| | | // //update 方法需要特殊处理 |
| | | // if (tableName.equals("jczz_article")) { |
| | | // Article entity = (Article) ((MapperMethod.ParamMap) parameter).get("param1"); |
| | | // elasticsearchDocumentService.update(esParam,entity); |
| | | // } |
| | | // } |
| | | // // 删除处理 |
| | | // if(sqlType.equals("DELETE")){ |
| | | // esParam.setTableId("test"); |
| | | // elasticsearchDocumentService.removeByQuery(esParam); |
| | | // } |
| | | // } |
| | | // |
| | | // |
| | | // @Override |
| | | // public Object plugin(Object target) { |
| | | // if (target instanceof Executor || target instanceof StatementHandler) { |
| | | // return Plugin.wrap(target, this); |
| | | // } |
| | | // return target; |
| | | // } |
| | | // |
| | | // @Override |
| | | // public void setProperties(Properties properties) { |
| | | // // 可以接收配置属性 |
| | | // } |
| | | //} |
| | | package org.springblade.common.interceptor; |
| | | |
| | | import org.apache.ibatis.binding.MapperMethod; |
| | | import org.apache.ibatis.executor.Executor; |
| | | import org.apache.ibatis.mapping.BoundSql; |
| | | import org.apache.ibatis.mapping.MappedStatement; |
| | | import org.apache.ibatis.plugin.*; |
| | | import org.apache.logging.log4j.util.Strings; |
| | | import org.springblade.common.constant.EsTableConstant; |
| | | import org.springblade.common.utils.SQLParseUtils; |
| | | import org.springblade.es.service.ElasticsearchDocumentService; |
| | | import org.springblade.es.vo.EsParam; |
| | | import org.springblade.modules.article.entity.Article; |
| | | import org.springblade.modules.house.entity.HouseEntity; |
| | | import org.springblade.modules.house.entity.HouseholdEntity; |
| | | import org.springblade.modules.house.vo.HouseVO; |
| | | import org.springblade.modules.house.vo.HouseholdVO; |
| | | import org.springblade.modules.place.entity.PlaceEntity; |
| | | import org.springblade.modules.place.vo.PlaceVO; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Properties; |
| | | @Component |
| | | @Intercepts({ |
| | | @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}) |
| | | }) |
| | | public class DataSyncInterceptor implements Interceptor { |
| | | |
| | | @Lazy |
| | | @Autowired |
| | | private ElasticsearchDocumentService elasticsearchDocumentService; |
| | | |
| | | @Value("${elasticsearch.indexName}") |
| | | private String indexName; |
| | | |
| | | /** |
| | | * 拦截器在sql执行成功后同步到es, |
| | | * 如果同步失败抛出异常,保证数据一致性 |
| | | * |
| | | * @param invocation |
| | | * @return |
| | | * @throws Throwable |
| | | */ |
| | | @Override |
| | | public Object intercept(Invocation invocation) throws Throwable { |
| | | // 获取StatementHandler,进行自定义处理 |
| | | // StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget()); |
| | | |
| | | Object res = invocation.proceed(); |
| | | System.out.println("res = " + res); |
| | | |
| | | Object[] args = invocation.getArgs(); |
| | | MappedStatement ms = (MappedStatement) args[0]; |
| | | if (args.length >= 2) { |
| | | //参数 |
| | | Object parameter = invocation.getArgs()[1]; |
| | | BoundSql boundSql = ms.getBoundSql(parameter); |
| | | //sql |
| | | String sql = boundSql.getSql(); |
| | | sql = sql.replaceAll("\n", ""); |
| | | //获取表名 |
| | | String tableName = SQLParseUtils.getTableName(sql); |
| | | String sqlType = SQLParseUtils.parseSQLType(sql); |
| | | if (!Strings.isBlank(tableName)) { |
| | | if (tableName.equals("jczz_article") || |
| | | tableName.equals("jczz_house") || |
| | | tableName.equals("jczz_household") || |
| | | tableName.equals("jczz_place")) |
| | | syncDataAfterUpdate(tableName,sqlType,invocation.getArgs()[1]); |
| | | } |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 数据同步 |
| | | * @param tableName |
| | | * @param sqlType |
| | | * @param parameter |
| | | */ |
| | | private void syncDataAfterUpdate(String tableName,String sqlType,Object parameter) { |
| | | EsParam esParam = new EsParam(); |
| | | esParam.setIndexName(indexName); |
| | | esParam.setTableName(tableName); |
| | | // 判断操作类型 |
| | | if (sqlType.equals("INSERT")){ |
| | | //insert 可用直接拦截到实体类 |
| | | if (tableName.equals("jczz_article")) { |
| | | Article entity = (Article) parameter; |
| | | elasticsearchDocumentService.addArticle(esParam,entity); |
| | | } |
| | | if (tableName.equals("jczz_place")) { |
| | | PlaceVO entity = (PlaceVO) parameter; |
| | | elasticsearchDocumentService.addPlace(esParam,entity); |
| | | } |
| | | if (tableName.equals("jczz_house")) { |
| | | HouseVO entity = (HouseVO) parameter; |
| | | elasticsearchDocumentService.addHouse(esParam,entity); |
| | | } |
| | | if (tableName.equals("jczz_household")) { |
| | | HouseholdVO entity = (HouseholdVO) parameter; |
| | | elasticsearchDocumentService.addHousehold(esParam,entity); |
| | | } |
| | | } |
| | | if(sqlType.equals("UPDATE")){ |
| | | //update 方法需要特殊处理 |
| | | if (tableName.equals("jczz_article")) { |
| | | Article entity = (Article) ((MapperMethod.ParamMap) parameter).get("param1"); |
| | | if (null!=entity.getId()) { |
| | | esParam.setTableId(entity.getId().toString()); |
| | | elasticsearchDocumentService.update(esParam, entity, EsTableConstant.articleList); |
| | | } |
| | | } |
| | | if (tableName.equals("jczz_place")) { |
| | | PlaceEntity entity = new PlaceEntity(); |
| | | PlaceEntity placeEntity = new PlaceEntity(); |
| | | if (parameter instanceof MapperMethod.ParamMap){ |
| | | placeEntity = (PlaceEntity) ((MapperMethod.ParamMap) parameter).get("param1"); |
| | | if (null!=placeEntity.getId()) { |
| | | setPlaceInfo(entity, placeEntity); |
| | | esParam.setTableId(entity.getId().toString()); |
| | | elasticsearchDocumentService.update(esParam, entity, EsTableConstant.placeList); |
| | | } |
| | | }else { |
| | | placeEntity = (PlaceEntity) parameter; |
| | | // 删除 |
| | | esParam.setTableId(placeEntity.getId().toString()); |
| | | elasticsearchDocumentService.removeByQuery(esParam); |
| | | } |
| | | } |
| | | if (tableName.equals("jczz_house")) { |
| | | HouseEntity houseEntity = new HouseEntity(); |
| | | HouseEntity entity = new HouseEntity(); |
| | | if (parameter instanceof MapperMethod.ParamMap){ |
| | | entity = (HouseEntity) ((MapperMethod.ParamMap) parameter).get("param1"); |
| | | if (null!=entity.getId()) { |
| | | setHouseInfo(houseEntity, entity); |
| | | esParam.setTableId(entity.getId().toString()); |
| | | elasticsearchDocumentService.update(esParam, entity, EsTableConstant.houseList); |
| | | } |
| | | }else { |
| | | entity = (HouseEntity) parameter; |
| | | // 删除 |
| | | esParam.setTableId(entity.getId().toString()); |
| | | elasticsearchDocumentService.removeByQuery(esParam); |
| | | } |
| | | } |
| | | if (tableName.equals("jczz_household")) { |
| | | HouseholdEntity householdEntity = new HouseholdEntity(); |
| | | HouseholdEntity entity = new HouseholdEntity(); |
| | | if (parameter instanceof MapperMethod.ParamMap){ |
| | | entity = (HouseholdEntity) ((MapperMethod.ParamMap) parameter).get("param1"); |
| | | if (null!=entity.getId()) { |
| | | setHouseholdInfo(householdEntity, entity); |
| | | esParam.setTableId(entity.getId().toString()); |
| | | elasticsearchDocumentService.update(esParam, entity, EsTableConstant.householdList); |
| | | } |
| | | }else { |
| | | entity = (HouseholdEntity) parameter; |
| | | // 删除 |
| | | esParam.setTableId(entity.getId().toString()); |
| | | elasticsearchDocumentService.removeByQuery(esParam); |
| | | } |
| | | } |
| | | } |
| | | // 删除处理 |
| | | if(sqlType.equals("DELETE")){ |
| | | List<Long> list =(List<Long>) ((MapperMethod.ParamMap) parameter).get("param1"); |
| | | esParam.setTableId(list.get(0).toString()); |
| | | elasticsearchDocumentService.removeByQuery(esParam); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 场所值复制 |
| | | * @param entity |
| | | * @param placeEntity |
| | | */ |
| | | private void setPlaceInfo(PlaceEntity entity, PlaceEntity placeEntity) { |
| | | entity.setId(placeEntity.getId()); |
| | | entity.setPlaceName(placeEntity.getPlaceName()); |
| | | entity.setPrincipal(placeEntity.getPrincipal()); |
| | | entity.setPrincipalPhone(placeEntity.getPrincipalPhone()); |
| | | entity.setPrincipalIdCard(placeEntity.getPrincipalIdCard()); |
| | | entity.setLocation(placeEntity.getLocation()); |
| | | } |
| | | /** |
| | | * 房屋值复制 |
| | | * @param entity |
| | | * @param houseEntity |
| | | */ |
| | | private void setHouseInfo(HouseEntity entity, HouseEntity houseEntity) { |
| | | entity.setId(houseEntity.getId()); |
| | | entity.setHouseName(houseEntity.getHouseName()); |
| | | } |
| | | |
| | | /** |
| | | * 住户值复制 |
| | | * @param entity |
| | | * @param householdEntity |
| | | */ |
| | | private void setHouseholdInfo(HouseholdEntity entity, HouseholdEntity householdEntity) { |
| | | entity.setId(householdEntity.getId()); |
| | | entity.setName(householdEntity.getName()); |
| | | entity.setPhoneNumber(householdEntity.getPhoneNumber()); |
| | | entity.setIdCard(householdEntity.getIdCard()); |
| | | entity.setCurrentAddress(householdEntity.getCurrentAddress()); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public Object plugin(Object target) { |
| | | return Plugin.wrap(target, this); |
| | | } |
| | | |
| | | @Override |
| | | public void setProperties(Properties properties) { |
| | | } |
| | | } |