欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用Redis构建自定义标签(1)

程序员文章站 2022-04-29 23:25:16
...

 

(1)整体设计

利用Redis构建自定义标签(1)
 
 
 
(2)字典模块

利用Redis构建自定义标签(1)
 
 
(3)Redis模块

利用Redis构建自定义标签(1)
 
(4)加载总控线程
package com.crm.application.main;

import java.sql.Connection;
import java.sql.Statement;
import java.util.concurrent.CountDownLatch;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.crm.application.load.DictionaryLoadThread;
import com.crm.h2.H2Manager;
import com.crm.h2.load.H2LoadThread;
import com.crm.redis.load.RedisLoadThread;

public class MainThread extends Thread {

	private static Log log = LogFactory.getLog(MainThread.class);

	public static final CountDownLatch mainThreadStopLatch = new CountDownLatch(1);

	@Override
	public void run() {
		log.info("-------------------------【总制线程】BEGIN-------------------------");
		
		try {
			log.info("---------------【CRM系统初始化】【01】【H2初始化】---------------");
			Connection conn = H2Manager.getConnection();
			Statement stmt = conn.createStatement();
			stmt.executeUpdate(H2Manager.getCreateCrmTranslateKindSql());
			stmt.executeUpdate(H2Manager.getCreateCrmTranslateMapSql());
			conn.close();
			new H2LoadThread().start();
			
			log.info("---------------【CRM系统初始化】【02】【字典加载】---------------");
			new DictionaryLoadThread().start();
			
			mainThreadStopLatch.await();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		log.info("---------------【CRM系统初始化】【03】【Redis缓存加载】---------------");
		// 必须等待上面的2个线程执行完成后,在执行Redis
		new RedisLoadThread().start();

		log.info("-------------------------【总制线程】END-------------------------");
	}

}
 (5)字典加载线程
package com.crm.application.load;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.crm.application.CrmContext;
import com.crm.application.main.MainThread;
import com.crm.common.util.CrmConst;
import com.crm.model.common.BODwdCrmMemExtinfoDim;
import com.crm.model.dictionary.BOCrmDictionary;
import com.crm.service.base.BaseSVImpl;
import com.crm.service.dictionary.DictionarySVImpl;
import com.crm.service.dictionary.StaticDataSVImpl;
import com.crm.service.dictionary.load.implclass.interfaces.IDictionaryLoadSV;

public class DictionaryLoadThread extends Thread {

	private static Log log = LogFactory.getLog(DictionaryLoadThread.class);

	List<BODwdCrmMemExtinfoDim> list = null;
	List<String> dimCodeList = null;
	
	// 1.获取数据仓库的数据
	BaseSVImpl BaseSVImpl = CrmContext.getBean("BaseSVImpl", BaseSVImpl.class);
	DictionarySVImpl DictionarySVImpl = CrmContext.getBean("DictionarySVImpl", DictionarySVImpl.class);
	StaticDataSVImpl StaticDataSVImpl = CrmContext.getBean("StaticDataSVImpl", StaticDataSVImpl.class);
	
	@Override
	public void run() {
		try {
			if (checkDataRepositoryNeedLoad()) {
				doRun();
			}
		} catch (Exception e) {
			log.error(e.getMessage());
		} finally {
			MainThread.mainThreadStopLatch.countDown();
		}
	}

	private void doRun() {
		// 1.清空静态数据

		StringBuilder sql = new StringBuilder();
		sql.append(" DELETE CRM_STATIC_DATA A  ");
		sql.append(" WHERE EXISTS (SELECT 1 ");
		sql.append(" FROM CRM_DICTIONARY B ");
		sql.append(" WHERE A.DICTIONARY_ID = B.ID ");
		sql.append(" AND B.INIT_SRC = :INIT_SRC ) ");

		Map params = new HashMap();
		params.put("INIT_SRC", CrmConst.CrmDictionaryInitSrc.DATA_REPOSITORY);

		BaseSVImpl.executeNativeUpdate(sql.toString(), params);
		// 2.清空静态数据
		sql.delete(0, sql.length());
		sql.append(" DELETE CRM_DICTIONARY A WHERE A.INIT_SRC = :INIT_SRC ");

		BaseSVImpl.executeNativeUpdate(sql.toString(), params);

		// 3.新增字典数据
		List<BOCrmDictionary> BOCrmDictionarys = new ArrayList<BOCrmDictionary>();
		for (String dimCode : dimCodeList) {
			BODwdCrmMemExtinfoDim bo = getBODwdCrmMemExtinfoDim(dimCode, list);
			BOCrmDictionary d = new BOCrmDictionary();
			d.setCityControl(bo.getCityValidFlag().toString());
			d.setCode(bo.getDimCode().toString());
			d.setCreateDate(new Date());
			d.setInitImpl("com.crm.service.dictionary.load.implclass.impl.DefaultDictionaryLoadSVImpl");
			d.setInitSrc(CrmConst.CrmDictionaryInitSrc.DATA_REPOSITORY);
			d.setInitType(CrmConst.CrmDictionaryInitType.IMPL_CLASS);
			d.setLoadOnStartUp(CrmConst.commonYesOrNoString.YES);
			d.setName(bo.getDimName());
			d.setRemarks("");
			d.setState(CrmConst.CommonState.VALIDATION);
			d.setUpdateDate(new Date());
			BOCrmDictionarys.add(d);
		}
		DictionarySVImpl.saveBatch(BOCrmDictionarys);

		// 获取所有的字典
		sql.delete(0, sql.length());
		sql.append(" from BOCrmDictionary a where a.state = :state and a.loadOnStartUp = :loadOnStartUp");
		params = new HashMap();
		params.put("state", CrmConst.CommonState.VALIDATION);
		params.put("loadOnStartUp", CrmConst.commonYesOrNoString.YES);

		List<BOCrmDictionary> existDRList = DictionarySVImpl.getEntitys(sql.toString(), params);
		for (BOCrmDictionary b : existDRList) {
			try {
				if (b.getInitType().equals(CrmConst.CrmDictionaryInitType.STATIC_DATA)) {

				} else if (b.getInitType().equals(CrmConst.CrmDictionaryInitType.IMPL_CLASS)) {
					String className = b.getInitImpl();
					IDictionaryLoadSV sv = (IDictionaryLoadSV) Class.forName(className).newInstance();
					sv.execute(b, list);

				} else if (b.getInitType().equals(CrmConst.CrmDictionaryInitType.SQL)) {

				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	private boolean checkDataRepositoryNeedLoad() {
		boolean flag = true;

		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT * FROM DWD_CRM_MEM_EXTINFO_DIM A ");

		list = BaseSVImpl.executeNativeSelect(sql.toString(), new HashMap(), BODwdCrmMemExtinfoDim.class);

		dimCodeList = new ArrayList<String>();
		for (BODwdCrmMemExtinfoDim b : list) {
			if (!dimCodeList.contains(b.getDimCode().toString())) {
				dimCodeList.add(b.getDimCode().toString());
			}
		}

		sql.delete(0, sql.length());
		sql.append(" SELECT COUNT(1) TOTAL_COUNT ");
		sql.append(" FROM CRM_STATIC_DATA A, CRM_DICTIONARY B ");
		sql.append(" WHERE A.DICTIONARY_ID = B.ID ");
		sql.append(" AND A.STATE = :STATE ");
		sql.append(" AND B.STATE = :STATE ");
		sql.append(" AND B.INIT_SRC = :INIT_SRC");

		Map params = new HashMap();
		params.put("STATE", CrmConst.CommonState.VALIDATION);
		params.put("INIT_SRC", CrmConst.CrmDictionaryInitSrc.DATA_REPOSITORY);
		List<Map> totalCountList = BaseSVImpl.executeNativeSelect(sql.toString(), params);
		long dataRepositoryAmount = Long.parseLong(totalCountList.get(0).get("TOTAL_COUNT").toString());

		if (list.size() == dataRepositoryAmount) {
			flag = false;
		}

		return flag;
	}

	private BODwdCrmMemExtinfoDim getBODwdCrmMemExtinfoDim(String dimCode, List<BODwdCrmMemExtinfoDim> list) {
		BODwdCrmMemExtinfoDim r = null;
		for (BODwdCrmMemExtinfoDim b : list) {
			if (dimCode.equals(b.getDimCode().toString())) {
				r = b;
				break;
			}
		}
		return r;
	}

}