Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一周的特定时间之间停止程序执行_Java - Fatal编程技术网

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 程序将持续运行,直到完成所有文件和文件夹的复制。然而,在上述时间之外,程序应该只是睡眠 我正在使用属性文件来存储上述设置 更新 我正在寻找最简单的实现,包括属性文

我正在编写一个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
程序将持续运行,直到完成所有文件和文件夹的复制。然而,在上述时间之外,程序应该只是睡眠

我正在使用属性文件来存储上述设置

更新


我正在寻找最简单的实现,包括属性文件中属性的格式以及进行检查的代码。

您应该尝试使用连续集成系统。例如,可以使用以下工具轻松设置该场景


我建议在这样的环境中这样做的原因是,您可以更好地控制程序运行的历史记录。

由于您的程序将持续运行,最简单的解决方案是在复制文件之前检查日期和时间。如果时间在非工作时间,请继续复制下一个文件,否则
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();