`
toknowme
  • 浏览: 139885 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

 
阅读更多

 

(1)整体设计


 
 
 
(2)字典模块


 
 
(3)Redis模块

 
(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;
	}

}
 
 
 
 
 

 

 

  • 大小: 85.3 KB
  • 大小: 102.4 KB
  • 大小: 59.4 KB
1
2
分享到:
评论

相关推荐

    基于springboot的论坛系统,主要使用的技术有springboot+mybatis+redis+自定义分页.zip

    标题 "基于springboot的论坛系统,主要使用的技术有springboot+mybatis+redis+自定义分页" 描述了一个使用现代Web技术构建的论坛应用程序。这个项目的核心是Spring Boot框架,它简化了Java应用程序的开发过程,提供...

    自定义分页标签 Java

    1. **自定义标签的实现**: - **JSP标签库(TLD)**:在Java Web中,自定义标签通过JSP Tag Library Descriptor (TLD) 文件定义。TLD文件描述了标签的行为、属性和对应的Java类。 - **标签处理类**(Tag Handler ...

    ruby和redis接口

    Ruby 和 Redis 接口是开发过程中非常重要的工具,它们允许Ruby程序员充分利用Redis的高效数据存储和处理能力。Redis是一款开源的、基于键值对的数据结构存储系统,它以内存为运行基础,支持多种数据结构,如字符串、...

    shiro-redis-cluster

    《Spring MVC、Shiro与...这种架构不仅提高了系统的安全性,还利用Redis的高性能特性提升了数据访问速度,为大型分布式应用提供了有力支持。在实际项目中,开发者应根据业务需求和环境调整具体配置,以达到最佳效果。

    redisMq(按任务批次分不同队列)

    总结来说,这个示例展示了如何利用Redis构建一个分布式任务分发系统,通过创建多个队列来处理不同任务批次,以达到灵活管理和高效执行的目的。同时,通过自定义序列化类和配置类,优化了数据存储和传输的效率。整个...

    Another-Redis-Desktop-Manager.1.6.1

    安装后,用户可以利用其强大的功能,如实时监控Redis服务器的性能指标,查看内存占用情况,设置键的过期时间,以及备份和恢复数据等。 总结来说,Another-Redis-Desktop-Manager 1.6.1是一款功能齐全、易于使用的...

    redis-desktop-manager-0.9.3.817

    Redis是世界上最受欢迎的内存数据存储系统之一,常用于构建高性能、低延迟的数据缓存和数据库。Redis Desktop Manager是一款跨平台的、用户友好的图形界面工具,它为开发者提供了方便的Redis键值存储管理功能,使得...

    redis-unstable.zip_Redis C_c redis_redis_redis c++_visual c

    Redis是一款开源的、高性能的键值对存储系统,主要用于数据缓存、消息中间件、数据库等功能。...通过深入学习,你将能够更好地利用Redis来满足各种应用场景的需求,并且有能力对其进行定制化开发。

    thinkphp_redis

    通过集成"thinkphp_redis",开发者可以充分利用Redis的优势,提高应用程序的响应速度和整体性能。 "tpredis"这个标签表明了这个类库是ThinkPHP与Redis的整合,使得开发者无需深入了解Redis的底层细节,只需调用相应...

    使用redis管理对象缓存,可代替session

    标题中的“使用redis管理对象缓存,可代替session”指的是在Web应用中,利用Redis作为对象缓存系统来替代传统的HTTP Session。Redis是一款高性能的Key-Value存储系统,它可以用来存储临时性的数据,如用户的Session...

    redis整合到tomcat集群的支持

    为了解决这个问题,我们可以利用Redis作为中央会话存储,使得各个Tomcat实例都可以访问同一份会话数据。 1. **Redis作为会话存储**: Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合,其中哈希...

    Redis面试题(含答案)_20190220222533.pdf

    ### Redis基础知识及特性 #### 1. 什么是Redis? Redis是一种高性能的键值对(Key-Value)数据库,它与Memcached类似,都是基于内存的操作...通过对Redis特性的深入了解,可以帮助开发者更好地利用Redis解决实际问题。

    my_redis-5.0.14.tar

    描述中的 "my_redis-5.0.14.tar" 同样强调了这是 Redis 的一个自定义或个人化的构建,可能是对官方发行版的某种修改或定制,以满足特定需求或环境。tar 文件是一种在类 Unix 系统(如 Linux)中常见的文件打包格式,...

    django-redis-chs-readthedocs-io-zh_CN-latest.zip

    **Django-Redis:在Django中高效利用Redis缓存** `django-redis`是一个针对Django框架的高度兼容和功能齐全的Redis缓存后端组件,遵循BSD许可证,允许自由使用和修改。它使得开发者能够充分利用Redis的强大功能,...

    Redis缓存url访问次数(SpringBoot拦截器)

    标题 "Redis缓存url访问次数(SpringBoot拦截器)" 描述的是一个使用SpringBoot框架构建的应用中,通过拦截器来统计URL访问次数,并利用Redis作为缓存存储这些计数的过程。这个技术方案通常用于网站性能优化,通过...

    redis-desktop-manager的exe文件

    关于标签"redis",这表明内容与Redis这个内存数据存储系统密切相关。Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合,这些在数据库设计中非常有用。此外,Redis还支持发布/订阅、事务、持久化、复制...

    Laravel开发-laravel-redis-tagger

    `laravel-redis-tagger` 是一个针对Laravel的扩展,旨在帮助开发者更有效地利用Redis进行标签(tagging)管理。这个项目可能包含一组自定义的助手函数,使得在Laravel应用中管理和操作带有标签的数据变得更加便捷。 ...

    spring-data-redis-1.6.0.RELEASE.jar + jedis-2.7.2.jar包

    Spring Data Redis使得在应用程序中集成Redis变得简单,提供了丰富的API和抽象层,让开发者能够利用Redis的高速缓存、持久化和分布式特性。这个“spring-data-redis-1.6.0.RELEASE.jar”是该库的特定版本,1.6.0....

    upupw_php_redis-7.0-nts-vc14-x64.zip

    标题“upupw_php_redis-7.0-nts-vc14-x64.zip”指的是一个针对UpUpW(一款Windows平台的Apache...正确安装和配置这个扩展,可以充分利用Redis的高性能特性,如缓存、消息队列等功能,提升Web应用的性能和响应速度。

    cpp-一个Redis模块用于提供张量并执行深度学习模型

    5. 机器学习与数据处理:如何利用Redis进行大规模数据处理,支持机器学习任务。 6. Git版本控制:了解如何使用Git进行代码管理和协作,d28350a是一个具体的版本标识。 7. 分布式系统优化:在分布式环境中,如何通过...

Global site tag (gtag.js) - Google Analytics