以下是我的程序中的示例代码,该代码查询数据库并将结果复制到目录中的不同文件。我想要实现的是下面的代码应该在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类?
谢谢,
答案 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调度程序定期执行代码。尝试使用以下参考
答案 4 :(得分:0)
如果你不想使用调度程序并且不想更改时间限制,最基本的解决方案是使用一个简单的线程,并睡眠(15 * 90 * 1000)毫秒...有帮助且有效你不想使用第三方s / w。