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(); 

}

}

この Java クラスを 15 分ごとに実行するには??

ありがとう、

4

5 に答える 5

4

Unix タイプの OS で実行している場合は、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

スケジューラを使用せず、時間制限を変更したくない場合、最も基本的な解決策は単純なスレッドを使用し、(15*90*1000) ミリ秒スリープすることです...サードパーティのソフトウェアを使用したい。

于 2012-11-06T19:07:55.270 に答える
0

コードを定期的に実行するには、クォーツスケジューラを使用することをお勧めします。以下を参考に試してみてください

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

于 2012-11-06T18:04:34.043 に答える