每隔15分钟运行一次Java程序。

3

以下是我程序中的样例代码,用于查询数据库并将结果复制到目录中的不同文件中。我想要实现的是,以下代码应该每15分钟运行一次,以便文件可以使用新数据进行更新。

public class CountryLogtoCSV {

static Connection con = null;
static ResultSet rs = null;

public static void main(String... argv)
{
FileWriter  filewriter=null;

File countryHits=new File("countryhits.csv");
filewriter=new FileWriter(countryHits);
query = "SELECT countryID, count(*) as total FROM mobileCountryLog"
        + " WHERE aHitType='ALL' AND aDate>'2012-11-06' GROUP BY countryID";

rs = Database.getResult(connection,query)
while (rs.next()) {

    //Writing result to File, FileWriter is used 
    filewriter.append(rs.getString("countryID"));
    filewriter.append(rs.getString("total"));
    filewriter.flush();
}   

File countryUnique=new File("countryunique.csv");
filewriter=new FileWriter(countryUnique);
query = "SELECT countryID, count(*) as total FROM mobileCountryLog"
        + " WHERE (aHitType='UNIQUE'AND aDate>'2012-11-06' GROUP BY countryID;

rs = Database.getResult(connection,query)
while (rs.next()) {

    //Writing Result to File, FileWriter is used
    filewriter.append(rs.getString("countryID"));
    filewriter.append(rs.getString("total"));
    filewriter.flush();
}   
rs.close(); 

}

}

如何每15分钟运行一次这个Java类?

谢谢。


1
请查看http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html。 - Santosh Gokak
2
这取决于你想如何实现这个目标。你可以使用操作系统调度程序,基于Java的调度程序,或者只是使用主线程进行管理。 - home
@家里,如果可能的话,我更喜欢基于Java的调度程序。在这个类中如何实现调度程序?有没有示例或样本? - Madan Madan
@SantoshGokak已经学习了这个教程,但我需要知道如何在我的类中实现?在哪里实现以及如何让我的类在15分钟的终端周期内运行? - Madan Madan
@MadanMadan,我已经粘贴了一个答案,应该符合你的要求。 - Santosh Gokak
@Santos..非常感谢!当您写上 //Your Application logic  时,是不是意味着我应该在这里编写我的SQL查询和filewriter.append代码? - Madan Madan
5个回答

4
如果你正在运行Unix类型的操作系统,那么你可以使用cron进行以下操作:cron:
将以下内容添加到crontab中:
*/15 * * * * /yourpath-to-jdk/bin/java -cp yourclasspath CountryLogtoCSV

您也可以使用Executor包来在Java中执行此操作,但这意味着您必须一直运行该代码,否则它将不会执行。使用cron,您的代码只需要每15分钟(或您设置的时间)运行一次。这意味着如果您的服务器重新启动或您的代码在某个时间崩溃,它将在下一个周期尝试再次执行。更加稳定和易于管理。


是的,我正在Linux上运行这个程序,使用Apache Tomcat。有示例吗? - Madan Madan
看看这个教程 http://www.pantz.org/software/cron/croninfo.html。Cron非常容易使用,您只需要确保crontab中的条目(如上所示)具有完全指定的所有路径即可。 - mprivat
浏览一下,当我看到服务器中的init.d文件夹时,里面有很多文件..!! 我应该创建另一个类似的文件并将您的命令复制到那里吗? - Madan Madan
您无需编辑init.d。您只需要通过添加上述行(根据本地驱动器路径进行调整)来编辑crontab即可。也许可以查看一个更简单的教程:http://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/ - mprivat

2
你可以使用ScheduledExecutorService来执行这个任务。
以下是一个示例:
   import static java.util.concurrent.TimeUnit.*;
  class BeeperControl {
private final ScheduledExecutorService scheduler =
   Executors.newScheduledThreadPool(1);

public void beepForAnHour() {
    final Runnable beeper = new Runnable() {
            public void run() { System.out.println("beep"); }
        };
    final ScheduledFuture<?> beeperHandle =
        scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
    scheduler.schedule(new Runnable() {
            public void run() { beeperHandle.cancel(true); }
        }, 60 * 60, SECONDS);
}
}

是的,我已经阅读过它了,但我需要知道如何在我的类中使用ScheduledExecutorService?有任何实现它的想法吗? - Madan Madan
刚刚更新了一个例子...希望解决了你的问题!! - Rahul Tripathi
@Rahul.. 这个例子来自同一个Java教程。我已经看过了,但是我无法在我的类中实现它...这是主要的问题。由于我有疑问,FileWriter被使用了..请问在我的类中何时使用ScheduledFuture?有什么建议吗? - Madan Madan

1
在你的情况下,你需要像这样捆绑你的代码。
import static java.util.concurrent.TimeUnit.*;
public class CountryLogtoCSV{
    private final ScheduledExecutorService scheduler =
       Executors.newScheduledThreadPool(1);

    public void logtoCSV() {
        final Runnable logger= new Runnable() {
                //You application logic as shown in the question
            };
        final ScheduledFuture<?> loggerHandle =
            scheduler.scheduleAtFixedRate(logger, 15, 15, MINUTES );

    //Incase you want to kill this after some time like 24 hours
        scheduler.schedule(new Runnable() {
                public void run() { loggerHandle.cancel(true); }
            }, 24, HOURS );
    }
 }

希望这能有所帮助。

@Santos..非常感谢!当你写 //Your Application logic means时,我应该在那里编写我的SQL查询、filewriter.append吗? - Madan Madan
@MadanMadan 是的,这应该有你的应用程序逻辑,负责处理像查询数据库、进行HTTP调用等任务。 - Santosh Gokak
@Santos...在这一行中,它给了我以下异常:Runnable logger=new Runnable()anonymous CountryLogtoCSV不是抽象的,并且没有覆盖java.lang.Runnable中的抽象方法run()。我应该如何在这里实现run方法? - Madan Madan
http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html 可以让你更深入地了解如何在Java中编写线程和并发。 - Santosh Gokak
@Santosh.. 非常感谢.. 成功了!! - Madan Madan

0

0

如果您不想使用调度程序,也不想更改时间限制,最基本的解决方案是使用简单的线程,并休眠(15*90*1000)毫秒... 如果您不想使用第三方软件,这是一个有用且有效的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接