wiki:task

定时任务开发

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?