EverydayOneCat
🛏️🐈💨❌
📖🐈🌃✅
任务调度SpringTask
1.什么是任务调度
在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作。常见的任务调度框架有Quartz和SpringTask等。
2.入门小Demo
添加配置文件applicationContext-task.xml
1 |
|
创建包com.pinyougou.task编写类
1 |
|
执行后会看到控制台每秒都输出了当前时间,其中cron设置的为表达式,是执行的时间规则。
3.Cron表达式
3.1格式
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
(1)Seconds Minutes Hours DayofMonth Month DayofWeek Year
(2)Seconds Minutes Hours DayofMonth Month DayofWeek(常用)
每一个域可出现的字符如下:
Seconds:可出现”, - /“四个字符,有效范围为0-59的整数
Minutes:可出现”, - /“四个字符,有效范围为0-59的整数
Hours:可出现”, - /“四个字符,有效范围为0-23的整数
DayofMonth:可出现”, - / ? L W C”八个字符,有效范围为1-31的整数
Month:可出现”, - /“四个字符,有效范围为1-12的整数或JAN-DEc
DayofWeek:可出现”, - / ? L C #”四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推
Year:可出现”, - * /“四个字符,有效范围为1970-2099年
每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:
(1) :表示匹配该域的任意值,假如在Minutes域使用 , 即表示每分钟都会触发事件。
(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 ?, 其中最后一位只能用?,而不能使用 ,如果使用* 表示不管星期几都会触发,实际上并不是这样。
(3)-:表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
(4)/:表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
(5),:表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
(6)L:表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
(7)W: 表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一 到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份
(8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
(9)#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。
3.2例子
0 0 10,14,16 ? 每天上午10点,下午2点,4点
0 0/30 9-17 ? 朝九晚五工作时间内每半小时
0 0 12 ? WED 表示每个星期三中午12点
“0 0 12 ?” 每天中午12点触发
“0 15 10 ? “ 每天上午10:15触发
“0 15 10 ?” 每天上午10:15触发
“0 15 10 ? “ 每天上午10:15触发
“0 15 10 ? 2005” 2005年的每天上午10:15触发
“0 14 ?” 在每天下午2点到下午2:59期间的每1分钟触发
“0 0/5 14 ?” 在每天下午2点到下午2:55期间的每5分钟触发
“0 0/5 14,18 ?” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
“0 0-5 14 ?” 在每天下午2点到下午2:05期间的每1分钟触发
“0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44触发
“0 15 10 ? MON-FRI” 周一至周五的上午10:15触发
“0 15 10 15 ?” 每月15日上午10:15触发
“0 15 10 L ?” 每月最后一日的上午10:15触发
“0 15 10 ? 6L” 每月的最后一个星期五上午10:15触发
“0 15 10 ? 6L 2002-2005” 2002年至2005年的每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发
4.秒杀商品列表的增量更新
每分钟执行查询秒杀商品表,将符合条件的记录并且缓存中不存在的秒杀商品存入缓存
1 | //刷新秒杀商品 |
5.过期秒杀商品的移除
每秒中在缓存的秒杀上皮列表中查询过期的商品,发现过期同步到数据库,并在缓存中移除该秒杀商品
1 | //移除秒杀商品 |
Maven Profile
1.什么是MavenProfile
在我们平常的java开发中,会经常使用到很多配制文件(xxx.properties,xxx.xml),而当我们在本地开发(dev),测试环境测试(test),线上生产使用(product)时,需要不停的去修改这些配制文件,次数一多,相当麻烦。现在,利用maven的filter和profile功能,我们可实现在编译阶段简单的指定一个参数就能切换配制,提高效率,还不容易出错.
profile可以让我们定义一系列的配置信息,然后指定其激活条件。这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。
2.Maven Profile入门
修改pom.xml,增加profile定义(properties用于设置默认值)
1 | <properties> |
执行命令 tomcat7:run -P pro 发现以9205端口启动;执行命令 tomcat7:run -P dev 发现以9105端口启动
-P 后边跟的是profile的id
如果我们只执行命令tomcat7:run ,也是以9105启动,因为我们一开始定义的变量值就是9105,就是在不指定profileID时的默认值.
3.切换数据库连接配置
3.1编写不同环境的配置文件
在pinyougou-dao工程中src/main/resources下创建filter文件夹
(1)filter文件夹下创建db_dev.properties ,用于配置开发环境用到的数据库
1 | env.jdbc.driver=com.mysql.jdbc.Driver |
(2)filter文件夹下创建db_pro.properties
1 | env.jdbc.driver=com.mysql.jdbc.Driver |
(3)修改properties下的db.properties
1 | jdbc.driver=${env.jdbc.driver} |
3.2定义Profile
这里我们定义2个profile,分别是开发环境和生产环境
1 | <properties> |
3.3资源过滤与变量替换
1 | <build> |
这里我们利用filter实现对资源文件(resouces) 过滤
maven filter可利用指定的xxx.properties中对应的key=value对资源文件中的${key}进行替换,最终把你的资源文件中的username=${key}替换成username=value
3.4打包
在pinyougou-dao 工程 执行命令:package -P pro , 解压生成的jar包,观察db.properties配置文件内容,已经替换为生产环境的值。
在pinyougou-sellergoods-service工程 执行命令 pageage ,解压生成的war包里的pinyougou-dao的jar包,发现也是生成环境的值。
4.切换注册中心连接配置
4.1集中配置注册中心地址
(1)在pinyougou-common工程中properties下创建dubbox.properties
1 | address=192.168.25.135:2181 |
(2)Spring目录下创建spring配置文件 applicationContext-dubbox.xml 配置如下:
1 | <dubbo:registry protocol="zookeeper" address="${address}"/> |
(3)所有的服务工程与web工程都要依赖pinyougou-common . 并删除每个工程中关于注册中心地址的配置
(4)安装pinyougou-common到本地仓库,然后测试运行。
4.2MavenProfile配置
(1)在pinyougou-common工程中创建filters目录 ,目录下建立dubbox_dev.properties
1 | env.address=192.168.25.135:2181 |
(2)建立dubbox_pro.properties
1 | env.address=192.168.25.136:2181 |
(3)修改dubbox.properties
1 | address=${env.address} |
(4)修改pinyougou-common的pom.xml
1 | <properties> |
MongoDB简介
1.什么是MongoDB
MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。它支持的数据结构非常松散,是类似JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。
MongoDB 的官方网站地址是:http://www.mongodb.org/
2.MongoDB特点
MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。
具体特点总结如下:
(1)面向集合存储,易于存储对象类型的数据
(2)模式自由
(3)支持动态查询
(4)支持完全索引,包含内部对象
(5)支持复制和故障恢复
(6)使用高效的二进制数据存储,包括大型对象(如视频等)
(7)自动处理碎片,以支持云计算层次的扩展性
(8)支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++语言的驱动程序,社区中也提供了对 Erlang 及.NET 等平台的驱动程序
(9) 文件存储格式为 BSON(一种 JSON 的扩展)
3.MongoDB体系结构
MongoDB 的逻辑结构是一种层次结构。主要由:
文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户
的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。
(1)MongoDB 的文档(document),相当于关系数据库中的一行记录。
(2)多个文档组成一个集合(collection),相当于关系数据库的表。
(3)多个集合(collection),逻辑上组织在一起,就是数据库(database)。
(4)一个 MongoDB 实例支持多个数据库(database)。
4.MongoDB在品优购系统中的应用
MongoDB通常存储价值不大,但是偏复杂且数据量大的数据。我们品优购的评价系统、收藏系统采用等信息存储在MongoDB 。
结语
跨越了6、7、8、9四个月的品优购系统开发终于在十一之前完结啦🖖🖖🖖🖖后续还有3章系统部署有时间学习整理一波呈现给大家😜
下一个征战——虚幻4!!!!