== 定时任务开发 == svn地址 http://svn.demo.pc.com.cn/svn/autoclub/trunk/crontab/task 这只是一个基于maven的普通java应用程序。以前旧的大部分任务的main函数入口是:cn.pconline.autoclub.task.App.java,由于任务太多,所以后来新增加的任务基本是自己定义个新的java类,独立入口。 == 定时任务注意点 == * 1.一般来说,定时任务是处理一些比较耗时的统计操作,所以要注意查询的条件,避免全表扫描。比如dailyClubPetrolTask这个任务,之前查询条件用到了函数,查询全表扫描,刚开始数据量少没发现问题,到了后面数据量一多,查询就很慢,执行完整个任务要2个多小时。优化后,几分钟就执行完了。 * 2.对于一些更新操作,需要清MC的。最好是在定时任务里面直接连MC清。不要通过应用提供批量清MC的接口来清。之前有一个清全部系统消息的定时任务,很耗时,影响到了车友会整个应用。比如memberRankTask这个任务,就可以考虑优化下 == 线上定时任务相关部署 == * jar包:192.168.236.196/data/clubcron/task/task-1.0-SNAPSHOT.jar (只有196这台机有) * 配置文件:/data/clubcron/task/conf/autoclub.properties (注意其中mc的相关配置要严格跟resin下的配置一致) * 日志:/data/clubcron/task/log/autoclubtask.log (默认全部任务都输出到这个文件) * 定时操作是利用系统crontab命令实现,所以对每个定时任务都需要准备好相关的脚本xxx.sh,然后让网络帮忙配置crontab命令 * 执行脚本需要先配置好环境变量:ANALYZER_HOME=/data/clubcron/task(jar执行目录) LANG=zh_CN.GB18030(避免输出日志到控制台时中文乱码) * 举个例子:统计车友会会员排名的定时任务,利用crontab定时执行脚本,执行完后,再调http接口清缓存。 执行脚本:memberRankTask.sh #!/bin/bash export LANG=zh_CN.GB18030 ANALYZER_HOME=$(cd "$(dirname "$0")"; pwd) cd $ANALYZER_HOME /usr/java/jdk1.6.0_32/bin/java -jar task-1.0-SNAPSHOT.jar memberRankTask sleep 3 curl -s -x 192.168.239.200:1080 --max-tim e600 --connect-timeout 120 "http://club.pcauto.com.cn/util/daily/clear_member_info.do" crontab定时: * 0 0 * * * $ANALYZER_HOME/memberRankTask.sh >> $ANALYZER_HOME/memberRankTask.log 2>&1 == crontab定时任务列表 == * 统计每个车友会会员排名,每天0点0分执行一次 * 0 0 * * * $ANALYZER_HOME/memberRankTask.sh >> $ANALYZER_HOME/memberRankTask.log 2>&1 * 统计车友会每天(昨天)增加的油值,每天1点0分执行一次 * 0 1 * * * $ANALYZER_HOME/dailyClubMemberPetrolTask.sh >> $ANALYZER_HOME/log/dailyClubMemberPetrolTask.log 2>&1 * 统计车友会每天(昨天)增加的油值,每天1点30分执行一次 * 30 1 * * * $ANALYZER_HOME/dailyClubPetrolTask.sh >> $ANALYZER_HOME/log/dailyClubPetrolTask.log 2>&1 * 统计过去一周的车友会油值,每周日2点0分执行一次 * 0 2 * * 0 $ANALYZER_HOME/weeklyClubPetrolTask.sh >> $ANALYZER_HOME/log/weeklyClubPetrolTask.log 2>&1 * 每天检查同步总油值、等级、发贴总数、留言总数,每天2点30分执行一次 * 30 2 * * * $ANALYZER_HOME/synClubTotalPetrolTask.sh >> $ANALYZER_HOME/log/synClubTotalPetrolTask.log 2>&1 * 按活跃度计算车友会排名,每天的3点0分执行一次 * 0 3 * * * $ANALYZER_HOME/countClubRank.sh >> $ANALYZER_HOME/log/countClubRank.log 2>&1 * 统计本周和上周的会员人数和认证人数,每周一的3点30分执行一次 * 30 3 * * 1 $ANALYZER_HOME/clubTotalMemberTask.sh >> $ANALYZER_HOME/log/clubTotalMemberTask.log 2>&1 * 车友会重置周排行,每周日23点55分执行一次 * 55 23 * * 0 $ANALYZER_HOME/clearWeekRank.sh >>$ANALYZER_HOME/log/clearWeekRank.log 2>&1 * 系统消息发送,0点1分,12点1分,15点1分都执行一次 * 31 8,17,20 * * * $ANALYZER_HOME/sendSysMessage.sh >> $ANALYZER_HOME/log/sendSysMessage.log 2>&1 * 车友会动态消息发送,12分钟执行一次 * 0,12,24,36,48 * * * * $ANALYZER_HOME/sendClubMessage.sh >> $ANALYZER_HOME/log/sendClubMessage.log 2>&1 * 车友会统计会员昨天周排行榜,每天12点01分执行一次 * 1 0 * * * $ANALYZER_HOME/clubMemberYesterdayRankApp.sh >>$ANALYZER_HOME/log/clubMemberYesterdayRankApp.log 2>&1 * 统计车友会每天发帖子、说说、回复情况,每天2点01分执行一次 * 1 2 * * * $ANALYZER_HOME/dailyGeneralSituationTask.sh >>$ANALYZER_HOME/log/dailyGeneralSituationTask.log 2>&1 == 一次性工具 == 有时有些旧数据要处理,或者有报障,或者发单个系统消息,这时就需要用到下面的一些工具了。如果要输出日志到文件的话,就要叫网络帮忙执行,开发自己的账号是没有写文件的权限的。 * 统计某个会员的总排行(最初是测试,处理报障时用,现在比较少用) * /usr/java/jdk1.6.0_32/bin/java -cp task-1.0-SNAPSHOT.jar cn.pconline.autoclub.task.MemberRank initOneMemberAllRank ${clubId} ${userId} * 统计某个会员的周排行(最初是测试,处理报障时用,现在比较少用) * /usr/java/jdk1.6.0_32/bin/java -cp task-1.0-SNAPSHOT.jar cn.pconline.autoclub.task.MemberRank initOneMemberWeekRank ${clubId} ${userId} * 删除MC的某个key(之前调试用,目前没用) * /usr/java/jdk1.6.0_32/bin/java -cp task-1.0-SNAPSHOT.jar cn.pconline.autoclub.task.McUtils delete ${key} * 查询MC的某个值(之前调试用,目前没用) * /usr/java/jdk1.6.0_32/bin/java -cp task-1.0-SNAPSHOT.jar cn.pconline.autoclub.task.McUtils get ${key} * 发送单条系统消息,不传ID就发送全部(偶尔会有编辑要赶着发系统消息) * /usr/java/jdk1.6.0_32/bin/java -cp task-1.0-SNAPSHOT.jar cn.pconline.autoclub.task.SendMsgTask sendSysMsg [${msgId}] * 发送单条车友会动态提醒消息,不传ID就发送全部(最初是测试用,现在没用到) * /usr/java/jdk1.6.0_32/bin/java -cp task-1.0-SNAPSHOT.jar cn.pconline.autoclub.task.SendMsgTask sendDynaMsg [${msgId}] * 同步动态图片(已经没用了) * /usr/java/jdk1.6.0_32/bin/java -cp task-1.0-SNAPSHOT.jar cn.pconline.autoclub.task.SyncTopicImage * 同步动态回复(已经没用了) * /usr/java/jdk1.6.0_32/bin/java -cp task-1.0-SNAPSHOT.jar cn.pconline.autoclub.task.SyncTopicReply