使用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 由服务器端程序自由分配
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值