Java 在一周的特定时间之间停止程序执行
我正在编写一个Java程序,需要在以下几个小时之间复制文件和文件夹:Java 在一周的特定时间之间停止程序执行,java,Java,我正在编写一个Java程序,需要在以下几个小时之间复制文件和文件夹: Mon - 18:00 to 06:30 Tue - 18:00 to 06:30 Wed - 18:00 to 06:30 Thu - 18:00 to 06:30 Fri - 18:00 to 06:30 Sat - all day Sun - all day 程序将持续运行,直到完成所有文件和文件夹的复制。然而,在上述时间之外,程序应该只是睡眠 我正在使用属性文件来存储上述设置 更新 我正在寻找最简单的实现,包括属性文
Mon - 18:00 to 06:30
Tue - 18:00 to 06:30
Wed - 18:00 to 06:30
Thu - 18:00 to 06:30
Fri - 18:00 to 06:30
Sat - all day
Sun - all day
程序将持续运行,直到完成所有文件和文件夹的复制。然而,在上述时间之外,程序应该只是睡眠
我正在使用属性文件来存储上述设置
更新
我正在寻找最简单的实现,包括属性文件中属性的格式以及进行检查的代码。您应该尝试使用连续集成系统。例如,可以使用以下工具轻松设置该场景
我建议在这样的环境中这样做的原因是,您可以更好地控制程序运行的历史记录。由于您的程序将持续运行,最简单的解决方案是在复制文件之前检查日期和时间。如果时间在非工作时间,请继续复制下一个文件,否则
Thread.sleep
如果这是一个内部的、一次性的程序,我会继续硬编码工作时间,而不是读取属性文件。无需增加复杂性。每当启动程序时,获取当前时间,并查看今天的日期
检查是否在允许的时间内,如果是,让它继续。如果没有,请在“当天”的00:00am查找时间。并在xx:yyZZ(允许时间的开始)处找到时间。计算差异,让程序休眠那么长时间。我会这样做
final Map<Integer, String> schedule = new HashMap<>();
// parse your settings and fill schedule
schedule.put(Calendar.MONDAY, "18:00 to 06:30");
// ...
// create timer to fire e.g. every hour
new Timer().scheduleAtFixedRate(new TimerTask() {
public void run() {
Calendar c = Calendar.getInstance();
String s = schedule.get(c.get(Calendar.DAY_OF_WEEK));
if (withinTimeRange(c, s)) { // implement withinTimeRange func
// copy files
}
}}, 0, 1000 * 3600);
final Map schedule=new HashMap();
//解析您的设置并填写时间表
日程安排(日历,星期一,18:00至06:30);
// ...
//创建点火计时器,例如每小时一次
新计时器().scheduleAtFixedRate(新计时器任务()){
公开募捐{
Calendar c=Calendar.getInstance();
字符串s=schedule.get(c.get(Calendar.DAY/u-OF-u-WEEK));
if(withinTimeRange(c,s)){//实现withinTimeRange函数
//复制文件
}
}}, 0, 1000 * 3600);
谢谢您的建议
最后我提出了一个有效的解决方案,如果它得到足够的分数,我会把它作为答案。我试图通过思考非工作时间而不是工作时间来解决这个问题。此代码仅用于插图
# Properties
Mon = 06:30-18:00
Tue = 06:30-18:00
Wed = 06:30-18:00
Thu = 06:30-18:00
Fri = 06:30-18:00
在属性上循环以获取其值
String[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
Map<Integer, Integer[]> nonWorkingHours = new HashMap<Integer, Integer[]>();
for( int i = 0; i < days.length; i++ ) // for each property in file
{
// excluded implementation of getConfig
String prop = getConfig( days[ i ] ); // e.g. "06:00-19:00"
// +1 to match CALENDAR.DAY_OF_WEEK
nonWorkingHours.put( i + 1, getHours( prop );
}
我相信有一种更简单的方法可以做到这一点:-)但确实如此。您的程序是一直在运行,只是在给定的时间“工作”,还是希望程序在特定的时间启动?@ay89我在windows上使用计划任务运行程序。一旦启动,它将运行尽可能多的天来完成文件传输。我没有将文件传输到网络驱动器,因此无法使用robocopy等工具。如果当前时间在不允许的时间间隔内,您的程序可能只需读取属性文件并调用
Tread.sleep(..)
。Jenkins?用于计划的java任务?为什么不?我并不是说这是唯一可能的情况,但我有几个预定的任务和自动化运行存储在其中。保持管理简单。谢谢你。但是,我希望在复制文件后运行检查。如果它试图复制另一个文档,但时间超出了允许的时间,我只希望它停止。看不出有多大区别,在开始复制下一个文件之前,循环复制每个文件并检查eahc时间,在其超出范围后立即中断谢谢您的回答。这不是我想要的。我希望在执行每个复制后检查计划,而不是定期安排复制。我提供了一些我实现的代码作为答案。您可以简化它:-)
// e.g. if prop = "06:00-19:00" then { 6, 0, 19, 0 } is returned
public Integer[] getHours( String prop )
{
String times = prop.split( "(:|-)" );
Integer[] t = new Integer[4];
for( int i = 0; i < times.length; i++ )
{
t[i] = Integer.parseInt( times[i] );
}
return t;
}
private void sleepIfOutsideWorkingHours()
{
Integer[] data = nonWorkingHours.get( currentDay );
if( data != null )
{
Calendar c = Calendar.getInstance();
Integer currentSeconds = ( Calendar.HOUR_OF_DAY * 3600 ) + ( Calendar.MINUTE * 60 );
Integer stopFrom = ( data[ 0 ] * 3600 ) + ( data[ 1 ] * 60 );
Integer stopTill = ( data[ 2 ] * 3600 ) + ( data[ 3 ] * 60 );
if( currentSeconds > stopFrom && currentSeconds < stopTill )
{
Integer secondsDiff = stopTill - currentSeconds;
if( secondsDiff > 0 )
{
try
{
Thread.sleep( secondsDiff * 1000 ); // turn seconds to milliseconds
}
catch( InterruptedException e )
{
// error handling
}
}
}
}
}
sleepIfOutsideWorkingHours();