有时我们程序需要不断处理一件事情
如果实时性要求很高,如几秒内,那用程序启动线程循环处理是个不错的选择。
但如果实时性要求不是很高,分钟级或以下,那可以选择换个方式,使用linux crontab
好处:只要linux不挂,程序就可以正常运行,linux服务器重启后服务也不受影响。比上种方式更稳定,编程更简单。
linuxcrontab设置
在命令端输入crontab -e,加入定时调用
*/5 * * * * /opt/consumegradesql/run_add.sh
linux脚本run_add.sh:
注意:crontab,在设定环境变量java_home时必须自己在脚本里设定,如果是直接./执行脚本会查找系统的环境变量。
#!/bin/bash
export JAVA_HOME=/opt/jdk1.6.0_21
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
baseDirForScriptSelf=$(cd "$(dirname "$0")"; pwd)
LIB_CP=:""$baseDirForScriptSelf""/WEB-INF/classes
flist=$baseDirForScriptSelf""/WEB-INF/lib/*.jar;
for i in $flist;
do
LIB_CP=$LIB_CP":"$i;
done
export LIB_CP
CP=${CLASSPATH}${LIB_CP}
java -cp ${CP} -Xms1024m -Xmx1024m com.jd.consume.link.AddConsumeJob
程序主函数:
/**
*负责job启动
*/
public static void main(String[] args) {
SpringUtil springUtil = new SpringUtil("spring/spring-config.xml");
AddConsumeJob addConsumeJob = springUtil.getBean("addConsumeJob");
addConsumeJob.setAlwaysrun(false);
addConsumeJob.start();
LogUtil.error(addConsumeJob.getLogName(), "main End");
System.exit(1);//防止还有其它线程
}
相关代码,要加入防止重复启动代码(通过端口号)
/**
* 启动后不退出
*/
public void start() {
if (!alwaysrun) {//如果是执行完就退出的job
try {
SocketUtil.bindPort(port);
} catch (IOException e) {
LogUtil.error(getLogName(), getLogName() + "Bind port:" + port + " error!", e);
}
LogUtil.error(getLogName(), getLogName() + "Bind port:" + port);
countDownLatch = new CountDownLatch(threadSize);
}
//初始化相应线程
for (int thNo &#61; 1; thNo <&#61; threadSize; thNo&#43;&#43;) {
jobRunables.add(getJobRunable(thNo));
}
//启动相应服务线程
ExecutorService executorService &#61; Executors.newFixedThreadPool(threadSize);
for (JobRunable jobRunable : jobRunables) {
executorService.execute(jobRunable);
}
executorService.shutdown();
if (!alwaysrun) {//如果是执行完就退出的job
try {
countDownLatch.await();
} catch (InterruptedException e1) {
LogUtil.error(getLogName(), getLogName() &#43; "threadLatch.await()", e1);
}
SocketUtil.closeSocket();
LogUtil.error(getLogName(), getLogName() &#43; "mainEnd");
}
}
public class SocketUtil {
protected final static Logger log &#61; LoggerFactory.getLogger(SocketUtil.class);
private static ServerSocket serverSocket;
public static void bindPort(int port) throws IOException {
SocketUtil.serverSocket &#61; new ServerSocket(port);
}
public static void closeSocket() {
try {
SocketUtil.serverSocket.close();
} catch (IOException e) {
log.error("close socket error", e);
}
}
}
附&#xff1a;linux端口号
1--1023 系统保留&#xff0c;只能由root用户使用
1024---4999 由客户端程序自由分配
5000---65535 由服务器端程序自由分配