对Item中定时器的理解
一、Diamond介绍
Diamond主要提供持久配置的发布和订阅服务,最大特点是结构简单,稳定可靠。
主要的使用场景:TDDL使用Diamond动态切换数据库,动态扩容等;业务使用Diamond推送系统开关配置。
架构如下:

发布或者更新配置数据时,步骤如下:
- 写入MySql数据库
 - 写本地磁盘
 - 通知集群其他机器去数据库dump更新的数据
 
订阅方获取配置数据时,直接读取服务端本地磁盘文件,尽量减少对数据库压力。 这种架构用短暂的延时换取最大的性能和一致性,一些配置不能接受延时的情况下,通过API可以获取数据库中的最新配置。
数据获取模型:
客户端采用推拉结合的策略在长连接和短连接之间取得一个平衡,让服务端不用太关注连接的管理,又可以获得长连接的及时性。
- 客户端发起一个对比请求到服务端,请求中包含客户端订阅的数据的指纹
 - 服务端检查客户端的指纹是否与最新数据匹配
- 如果匹配,服务端持有连接
 - 如果30秒内没有相关数据变化,服务端持有连接30秒后释放
 - 如果30秒内有相关数据变化,服务端立即返回变化数据的ID
 
 - 如果不匹配,立即返回变化数据的ID
 - 客户端根据变化数据的ID去服务端获取最新的内容
 
Diamond通过这种推拉结合的方式,让客户端逻辑尽量简单,而且高效。
二、Diamond和DTS接入
接入步骤:
0.生成dts的groupId
在[国内测试集群] 日常、二套:http://ops.jm.taobao.net/dts-console/中创建dts分组

1.引入diamond-client和dts-client的maven依赖
<dependency>
<groupId>com.taobao.diamond</groupId>
<artifactId>diamond-client</artifactId>
<version>3.6.9.2</version>
</dependency> <dependency>
<groupId>com.alibaba.dts</groupId>
<artifactId>dts-client</artifactId>
<version>0.0.3.9</version>
</dependency>
2.spring中配置Diamond
<bean id="jobSwitch" class="com.taobao.cun.item.diamond.JobSwitch"></bean>
<!-- diamond配置 -->
<bean id="deleteLogConfigManager" class="com.taobao.cun.item.diamond.ConfigManager"
init-method="init">
<property name="dataId" value="cuntaoic-timer-configure"></property>
<property name="groupId" value="timer-group"></property>
<property name="receivers">
<map>
<entry key="allSellerCheckOpen" value-ref="jobSwitch"></entry>
<entry key="pullDownAllProductOpen" value-ref="jobSwitch"></entry>
</map>
</property>
</bean>
初始化SpringContext时,执行ConfigManager的init方法初始化Diamond,通过Diamond.addListener(dataId, groupId, managerListener)注册监听器,监听器的作用是用于监听服务端数据的变化,client端会定时的向服务端检测数据的变化,当数据变化时,会及时返回给client。监听器中,提供了处理新数据的回调方法receiveConfigInfo。
 Diamond.addListener(dataId, groupId, new ManagerListener() {
                 public void receiveConfigInfo(String configInfo) {
                     try {
                         processConfig(configInfo);
                     } catch (IOException e) {
                         log.error("processConfig error", e);
                     }
                 }
                 public Executor getExecutor() {
                     return null;
                 }
             });
processConfig(configInfo)方法处理配置服务中心更新的配置信息,这里获取的是作业开关的关闭状态
3.spring中配置DTS任务调度框架
<bean id="dtsClient" class="com.alibaba.dts.client.DtsClient"
init-method="init">
<property name="groupId">
<value>${cuntao.ic.timer.dts.group.id}</value><!--此处填写控制台创建分组后生成的分组ID -->
</property>
</bean>
三、Job任务开发
1.在这里定时钟任务开发只需实现SimpleJobProcessor接口,如下文的删除日志Job
 public class DeleteLogJob implements SimpleJobProcessor {
     public ProcessResult process(SimpleJobContext context) {
         try {
             Runtime.getRuntime().exec("rm -rf /home/admin/logs/*.log");
         } catch (IOException e) {
             e.printStackTrace();
         }
         return new ProcessResult(true);//true表示执行成功,false表示失败
     }
 }
2.在后台进行Job配置

在定时表达式中输入:0 0 1 * * ?,这样就可以在每天的凌晨1点执行删除任务了
四、测试与发布
参照杨威的文档cuntaoic定时钟开发规范
对Item中定时器的理解的更多相关文章
- Scrapy基础(十)———同步机制将Item中的数据写在Mysql
		
前面讲解到将Item中的所有字段都已经填写完成,那么接下来就是将他们存储到mysql数据库中,那就用到了pipeline项目管道了: 对项目管道的理解:做一个比喻,爬取好比是开采石油,Item装 ...
 - Scrapy基础(九)————将不定长度的URL进行固定长度写入Item中
		
前面讲到将每篇文章的URL写入Item,但是每个url的长度是不同的,可以在Item中设置一个字段怎样使得每个URL的长度相同,这就需要对每个URL进行md5运算,使得长度统一,再加入到设定的Item ...
 - Java中hashcode的理解
		
Java中hashcode的理解 原文链接http://blog.csdn.net/chinayuan/article/details/3345559 怎样理解hashCode的作用: 以 java. ...
 - Java中定时器Timer致命缺点(附学习方法)
		
简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...
 - Fouandation(NSString ,NSArray,NSDictionary,NSSet) 中常见的理解错误区
		
Fouandation 中常见的理解错误区 1.NSString //快速创建(实例和类方法) 存放的地址是 常量区 NSString * string1 = [NSString alloc]init ...
 - linux中socket的理解
		
对linux中socket的理解 一.socket 一般来说socket有一个别名也叫做套接字. socket起源于Unix,都可以用“打开open –> 读写write/read –> ...
 - Unity3D中定时器的使用
		
源地址:http://unity3d.9tech.cn/news/2014/0402/40149.html 在游戏设计过程中定时器是必不可少的工具,我们知道update方法是MonoBehavior中 ...
 - ListView item 中TextView 如何获取长按事件
		
昨天晚上小伙伴突然来信, ListView item中嵌套的TextView 无法获取长按事件 从前从来没有仔细留意过, coding后发现...果然没什么动静 而且没有合适的API让我调用获取Tex ...
 - 谈谈我对Java中CallBack的理解
		
谈谈我对Java中CallBack的理解 http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallBack是回 ...
 
随机推荐
- 【Vue】Vue中的父子组件通讯以及使用sync同步父子组件数据
			
前言: 之前写过一篇文章<在不同场景下Vue组件间的数据交流>,但现在来看,其中关于“父子组件通信”的介绍仍有诸多缺漏或者不当之处, 正好这几天学习了关于用sync修饰符做父子组件数据双向 ...
 - 面试题收集---grep和find的区别
			
grep是通过文件找内容 find 是通过内容找文件 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来. 而linux下的find, 在目录结构 ...
 - websphere:rs.getDate()无法使用的解决方法
			
参考java.text.SimpleDateFormat 在tomcat中我们可以根据数据的类型将结果集获取到,但在websphere中却无法实现,原因不详. 现在有两种解决方法: 第一种方法是当字符 ...
 - 我的项目经验总结——CDN镜像:1(初探)
			
前言 其实,这个标题有些大,作为一个小白,只是在实际工作中经常听闻我司的CDN服务如何如何牛B……而且我司的云服务还拿到了工信部的CDN牌照……那么,作为一个研发仔,怎么能不去了解和熟悉呢?!不过,这 ...
 - js 中采用词法作用域
			
所谓的 词法( 代码 )作用域, 就是代码在编写过程中体现出来的作用范围. 代码一旦写好, 不用执行, 作用范围就已经确定好了. 这个就是所谓词法作用域. 在 js 中词法作用域规则: 1.函数允许访 ...
 - Redis单机版和集群版的安装和部署
			
1.单机版的安装 本次使用redis3.0版本.3.0版本主要增加了redis集群功能. 安装的前提条件: 需要安装gcc:yum install gcc-c++ 1.1 安装redis 1.下载re ...
 - java_jstl 标签库
			
jstl标签库的使用以及介绍 jstl:jsp标准标签库,是jsp的标签集合,它里面封装了jsp通用的核心功能,比如:建构化的任务,迭代,条件判断,xml 文档的操作,国际化标签,sql标签,还提供框 ...
 - 通过编译lambda表达式来创建实例(可在反射时候用,效率比反射高一些)
			
原文地址:https://rogerjohansson.blog/2008/02/28/linq-expressions-creating-objects/ 据说编译lambda创建实例是比反射快.实 ...
 - [js高手之路]Vue2.0基于vue-cli+webpack同级组件之间的通信教程
			
我们接着上文继续,本文我们讲解兄弟组件的通信,项目结构还是跟上文一样. 在src/assets目录下建立文件EventHandler.js,该文件的作用在于给同级组件之间传递事件 EventHandl ...
 - C#之实参和形参
			
1.值类型 例如:我们定义一个函数 static void Exchange(int x, int y) { int flag = x; flag = y; y = x; x = flag; } 其中 ...