每15分钟运行一次java程序

时间:2012-11-06 17:46:27

标签: java multithreading

以下是我的程序中的示例代码,该代码查询数据库并将结果复制到目录中的不同文件。我想要实现的是下面的代码应该在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类?

谢谢,

5 个答案:

答案 0 :(得分:3)

如果您在Unix类型操作系统上运行,那么您可以使用cron执行此操作:

将其添加到crontab:

*/15 * * * * /yourpath-to-jdk/bin/java -cp yourclasspath CountryLogtoCSV

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

答案 1 :(得分: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);
}
}

答案 2 :(得分: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 );
    }
 }

希望这有帮助

答案 3 :(得分:0)

最好你可以使用quartz调度程序定期执行代码。尝试使用以下参考

http://www.mkyong.com/java/quartz-scheduler-example/

答案 4 :(得分:0)

如果你不想使用调度程序并且不想更改时间限制,最基本的解决方案是使用一个简单的线程,并睡眠(15 * 90 * 1000)毫秒...有帮助且有效你不想使用第三方s / w。