Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / July 2008

Tip: Looking for answers? Try searching our database.

Timer Schedule TimerTask for same hour every day

Thread view: 
Tomer - 29 Jun 2008 16:47 GMT
If the current time is 18:50 and i schedule Repeating daily TimerTask
to 18:52 then everything is file its being run at 18:52 daily however
if i schedule it to 18:48 then its being run immediately (and i dont
want that) as i run the application :(
However i wanted it to be run every day at 18:48! how can i achieve
that?

following is my test code:

public class TestTimer {

    public static class TestTimerTask extends TimerTask {

        public void run() {
            System.out.println(new Date() + " timer run...");
        }
    }

    public static void main(String[] args) throws Exception {
        Timer timer = new Timer();
        Calendar date = Calendar.getInstance();
        // Timer starts yesterday (so that surely will run today when time
comes.
//        date.setTimeInMillis(new Date().getTime() - 1000 * 60 * 60 * 24);
        DateFormat sdf = new SimpleDateFormat("HH:mm");
        Date dateToBackup = null;
        try {
            dateToBackup = sdf.parse("18:32");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dateToBackup);
        date.set(Calendar.HOUR, calendar.get(Calendar.HOUR));
        date.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE));
        date.set(Calendar.SECOND, calendar.get(Calendar.SECOND));
        date.set(Calendar.MILLISECOND, 0);

        // Schedule to run every day.
        timer.schedule(
                new TestTimerTask(),
                date.getTime(),
                1000 * 60 * 60 * 24
        );
        Thread.sleep(120000);
    }

}

Thanks

Tomer
Arne Vajhøj - 29 Jun 2008 17:08 GMT
> If the current time is 18:50 and i schedule Repeating daily TimerTask
> to 18:52 then everything is file its being run at 18:52 daily however
> if i schedule it to 18:48 then its being run immediately (and i dont
> want that) as i run the application :(
> However i wanted it to be run every day at 18:48! how can i achieve
> that?

>         Timer timer = new Timer();
>         Calendar date = Calendar.getInstance();
[quoted text clipped - 14 lines]
>         date.set(Calendar.SECOND, calendar.get(Calendar.SECOND));
>         date.set(Calendar.MILLISECOND, 0);

Why not just roll one day forward ?

>         // Schedule to run every day.
>         timer.schedule(
[quoted text clipped - 6 lines]
>
> }

Arne
ilkinulas - 29 Jun 2008 22:48 GMT
if timer execution time is earlier then the current time then
roll one day forward.

    public void scheduleTimer(int hour, int minute) {
        Calendar now = new GregorianCalendar();
        int hourNow = now.get(Calendar.HOUR_OF_DAY);
        int minuteNow = now.get(Calendar.MINUTE);

        Calendar firstExecutionDate = new GregorianCalendar();
        firstExecutionDate.set(Calendar.HOUR_OF_DAY, hour);
        firstExecutionDate.set(Calendar.MINUTE, minute);
        firstExecutionDate.set(Calendar.SECOND, 0);
        firstExecutionDate.set(Calendar.MILLISECOND, 0);
        if (hour<hourNow || (hour==hourNow && minute<minuteNow)) {
            //Do not execute today, first execution will be tomorrow.
            firstExecutionDate.add(Calendar.DAY_OF_MONTH, 1);
        }

        long oneDay = 1000L * 60L * 60L * 24L;

        Timer timer = new Timer();
        timer.schedule(new MyTask(), firstExecutionDate.getTime(), oneDay);

    }
Tomer - 30 Jun 2008 10:08 GMT
> > If the current time is 18:50 and ischeduleRepeating dailyTimerTask
> > to 18:52 then everything is file its being run at 18:52 daily however
[quoted text clipped - 35 lines]
>
> Arne

I didnt want to roll one day forward because i didnt want to have
special cases in my code like checking if the current time is later
than scheduled time and in that case roll one day forward, but now
that i see i have no choice, then i would need to check for that
special case and roll one day forward.

Thanks,

Tomer
Arne Vajhøj - 04 Jul 2008 19:10 GMT
> I didnt want to roll one day forward because i didnt want to have
> special cases in my code like checking if the current time is later
> than scheduled time and in that case roll one day forward, but now
> that i see i have no choice, then i would need to check for that
> special case and roll one day forward.

I think your problem includes a condition, so it I don't think
you can avoid a condition in your code.

Arne
Roedy Green - 30 Jun 2008 00:17 GMT
>However i wanted it to be run every day at 18:48! how can i achieve
>that?

I don't think that is a sensible way to handle the problem. You would
need an JVM sitting in RAM 24-7.

Better to use some light weight chron feature of the OS.
Signature


Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com

Arne Vajhøj - 30 Jun 2008 00:34 GMT
>> However i wanted it to be run every day at 18:48! how can i achieve
>> that?
[quoted text clipped - 3 lines]
>
> Better to use some light weight chron feature of the OS.

cron

There is that little aspect called portability.

But if it is a server running 24 x 7 it should probably
use Java EE and scheduling has been part of Java EE since
version 1.4 !

Arne


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.