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 类?

谢谢,

4

5 回答 5

4

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

将此添加到 crontab:

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

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

于 2012-11-06T17:49:43.683 回答
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);
}
}
于 2012-11-06T17:49:00.443 回答
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 );
    }
 }

希望这可以帮助

于 2012-11-06T18:01:01.213 回答
0

更好的是,您可以使用石英调度程序定期执行您的代码。尝试以下参考

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

于 2012-11-06T18:04:34.043 回答
0

如果您不想使用调度程序并且不想更改时间限制,最基本的解决方案是使用简单的线程,并休眠(15 * 90 * 1000)毫秒......如果你不这样做很有帮助和有效想使用第 3 方软件。

于 2012-11-06T19:07:55.270 回答