crontab实现定时任务
场景:使用java调用kettle程序,并加入linux上的crontab定时任务
step1:准备好kettle文件,并将main.kjb中的其他文件以相对路径设置,并写入java文件。
//按路径执行kettle的程序
public static void executeKettleJob(String jobName){
try {
KettleEnvironment.init();
JobMeta jobMeta = new JobMeta(jobName,null);
Job job = new Job(null,jobMeta);
//设置参数传入XX.kjb文件
// job.setVariable("dt_start", dt_start);
// job.setVariable("dt_end", dt_end);
job.start();
job.waitUntilFinished();
if(job.getErrors() > 0){
throw new Exception("execute job error");
}
} catch (Exception e) {
log.error("excute kettle job:" +jobName + " falled !!! " );
e.printStackTrace();
}
}
//主程序
public static void main(String args[]) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"classpath*:/sqlSessionFactory.xml",
"classpath*:/dataSourceContext.xml","beans.xml"});
String calendarId = "Bond_CN";
//if start date is yesterday ,the interval is 1
Date startDate = getMarketDate(1);
Date endDate = getMarketDate(1);//endDate is aways yesterday
String path = "/home/public/songzhiqiang/prepareYeildCurve_kettle/yeildCurve.kjb";
executeKettleJob(path);
log.info(" excute kettle job : " + path+" start from " + " to yesterday is ready !!! ");
}
<!-- Pentaho Kettle Core dependencies development -->
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
<version>5.0.0.1</version>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>org.mortbay.jetty</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-dbdialog</artifactId>
<version>5.0.0.1</version>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-engine</artifactId>
<version>5.0.0.1</version>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-ui-swt</artifactId>
<version>5.0.0.1</version>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle5-log4j-plugin</artifactId>
<version>5.0.0.1</version>
</dependency>
step2:在eclipse上测试java程序(java程序中执行kettle文件)。
step3:eclipse上测试通过后打jar包在DOS中测试程序,测试成功后将java程序中kettle文件的路径修改为linux中的路径。
注意:打jar包成功后在DOS上运行,如果报**/schema/tx的错误,可能是事务冲突了,将DataAccess中的开始事务注释掉,并重新运行 clean install命令
<!-- 开启注解事务 -->
<tx:annotation-driven/>
step4:写shell脚本执行Jar包
#!/bin/bash
#打印开始时间
echo "`date +%Y-%m-%d" "%H:%M:%S`"
echo "--------------
-----------begin------
----------------------------"
#执行jar包
java -jar /home/public/songzhiqiang/YieldCurve.jar
#打印结束时间
step5:在crontab上设置定时任务
在linux中直接运行bash XXX.sh文件可以顺利运行,但是通过crontab -e 写入定时计划中不能够运行的原因很可能是环境问题,因为linux定时执行的时候是linux自己起来的环境
而用户直接运行shell脚本是在用户自己的环境中运行的。解决的办法是将客户的环境引入到shell脚本中。可以先通过export -p命令获得正常执行时该用户下的环境变量,然后复制这些环境变量到需要执行的脚本中。
#!/bin/bash
#!/bin/csh
declare -x CLASSPATH=".:/usr/java/jdk1.8.0_111/lib/dt.jar:/usr/java/jdk1.8.0_111/lib/tools.jar:/usr/java/jdk1.8.0_111/jre/lib"
declare -x CVS_RSH="ssh"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/home/public"
declare -x HOSTNAME="localhost.localdomain"
declare -x JAVA_HOME="/usr/java/jdk1.8.0_111"
declare -x JRE_HOME="/usr/java/jdk1.8.0_111/jre"
declare -x KDEDIRS="/usr"
declare -x KDE_IS_PRELINKED="1"
declare -x LANG="en_US.UTF-8"
declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="public"
declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:"
declare -x MAIL="/var/spool/mail/public"
declare -x OLDPWD="/home/public"
declare -x PATH="/usr/java/jdk1.8.0_111/bin:/usr/java/jdk1.8.0_111/jre/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/public/bin"
declare -x PWD="/home/public"
declare -x QTDIR="/usr/lib64/qt-3.3"
declare -x QTINC="/usr/lib64/qt-3.3/include"
declare -x QTLIB="/usr/lib64/qt-3.3/lib"
declare -x SELINUX_LEVEL_REQUESTED=""
declare -x SELINUX_ROLE_REQUESTED=""
declare -x SELINUX_USE_CURRENT_RANGE=""
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
declare -x SSH_CLIENT="192.168.22.131 53160 22"
declare -x SSH_CONNECTION="192.168.22.131 53160 192.168.22.200 22"
declare -x SSH_TTY="/dev/pts/2"
declare -x TERM="xterm"
declare -x USER="public"
java -jar /home/public/YieldCurve.jar
通过crontab -e命令添加定时任务,crontab中代码如下:
10 07 * * 2-6 bash /home/public/runJar.sh >> /home/public/daily/daily_yield_curve.log 2>&1
在每周二到周六上午7点10分执行任务,并将日志写入/home/public/daily/daily_yield_curve.log通过如下命令可以在测试过程中监控日志文件的变化:
tail -f /home/public/songzhiqiang/daily/daily_yield_curve.log
最后,为了在每次记录日志之前将以前的日志清除,可以在runJar.sh脚本中加入命令echo > /home/public/songzhiqiang/daily/daily_yield_curve.log
#!/bin/bash
#!/bin/csh
#先将日志文件清空
echo > /home/public/daily/daily_yield_curve.log
echo "`date +%Y-%m-%d" "%H:%M:%S`"
本文介绍如何使用Java调用Kettle程序,并将其加入Linux的CronTab实现定时任务。具体步骤包括配置Java环境、执行Kettle作业、打包程序、编写Shell脚本以及设置CronTab定时任务。

1670

被折叠的 条评论
为什么被折叠?



