使用linuxcrontab启动程序实现不断运行程序

有时我们程序需要不断处理一件事情

如果实时性要求很高,如几秒内,那用程序启动线程循环处理是个不错的选择。

但如果实时性要求不是很高,分钟级或以下,那可以选择换个方式,使用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 = 1; thNo <= threadSize; thNo++) {
			jobRunables.add(getJobRunable(thNo));
		}
		//启动相应服务线程
		ExecutorService executorService = 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() + "threadLatch.await()", e1);
			}
			SocketUtil.closeSocket();
			LogUtil.error(getLogName(), getLogName() + "mainEnd");
		}

	}

 

public class SocketUtil {

	protected final static Logger log = LoggerFactory.getLogger(SocketUtil.class);
	private static ServerSocket serverSocket;

	public static void bindPort(int port) throws IOException {
		SocketUtil.serverSocket = new ServerSocket(port);
	}

	public static void closeSocket() {
		try {
			SocketUtil.serverSocket.close();
		} catch (IOException e) {
			log.error("close socket error", e);
		}
	}

}

 

 附:linux端口号

  • 1--1023 系统保留,只能由root用户使用
  • 1024---4999 由客户端程序自由分配
  • 5000---65535 由服务器端程序自由分配

你可能感兴趣的:(crontab)