2011年10月8日土曜日

Windowsタスクスケジューラを利用して姫野ベンチ実行、DBアップロード

Windowsタスクスケジューラを利用して姫野ベンチ実行、DBアップロードをするメモです。

[準備]
・プロジェクトをEclipseにインポート
・Dドライブ直下に(なければCドライブ直下に)Himenoフォルダを設置
・Dドライブ直下に(なければCドライブ直下に)Benchmarkフォルダ設置

1.次のファイルを作成
[Himeno.java]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

public class Himeno {

String t;

public static void main(String[] args) throws InterruptedException,
IOException {
ProcessBuilder pb = new ProcessBuilder("D:\\himeno\\himenoBMTxp_s.exe");//必要に応じて変更
Process p = pb.start();

BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
Catcher c = new Catcher(br);
c.start();

TimerTask task = new ProcessDestroyer(p);
Timer timer = new Timer("プロセス停止タイマー");
timer.schedule(task, TimeUnit.SECONDS.toMillis(80)); //80秒後にProcessDestroyer#run()が呼ばれる。必要に応じて変更

for (;;) {
try {
p.waitFor(); //プロセスの終了待ち
break;
} catch (InterruptedException e) {
e.printStackTrace();

//waitFor()はInterruptedExceptionが発生する可能性があるが、
//今回の例では、その場合もプロセスの終了待ちを繰り返す。
//(プロセスの強制終了とInterruptedExceptionは無関係)
}
}

timer.cancel(); //タイマーのキャンセル(必須)

// System.out.println(c.out.toString());
// System.out.println(c.out.toString().indexOf("MFLOPS",210)); //最初のMFLOPSは203文字目に出現
int idx = c.out.toString().indexOf("MFLOPS",210);
String t = c.out.toString().substring(idx+10,idx+18);
// System.out.println(t);

Mysql ms = new Mysql();
ms.mysqlInsert(Double.parseDouble(t));

}

int getValue()
{
int value = Integer.parseInt(t);
return value;
}
}


class ProcessDestroyer extends TimerTask {

private Process p;

public ProcessDestroyer(Process p) {
this.p = p;
}

@Override
public void run() {
p.destroy(); //プロセスを強制終了
}
}


class Catcher extends Thread {
Reader in;
StringWriter out = new StringWriter();
public Catcher(Reader in) {
this.in = in;
}

public void run() {
int c;
try {
while ((c = in.read()) != -1) {
out.write((char)c);
}
} catch (IOException e) {
e.printStackTrace();
}

}

}


[Mysql.java]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

class Mysql {

public void mysqlInsert(double vl) {
String msg = "";
try {
// ドライバロード
Class.forName("org.gjt.mm.mysql.Driver");

// MySQLに接続
Connection con = DriverManager.getConnection("jdbc:mysql://ホスト名/DB名", "ユーザ名", "パスワード");

// ステートメント生成
Statement stmt = con.createStatement();


// SQLを実行
String sql = "INSERT INTO himeno_benchmarks(server_id,MFLOPS_measured) VALUES (40,"+vl+")";//40はID。VPSのIDを調べて変更する
stmt.executeUpdate(sql);

// 接続を閉じる
stmt.close();
con.close();
}catch (ClassNotFoundException e){
msg = "ドライバのロードに失敗";
System.out.println(msg);
}catch (Exception e){
msg = "ドライバのロードに失敗しました";
System.out.println(msg);
}
}
}

2.実行可能Jarファイルの作成
図のように実行可能JARファイルを作成します。


これをD:\Benchmark\Himeno40.jar として保存します。

ここまで確認
javaw -jar D:\Benchmark\Himeno34.jar
が実行され、DBに内容が保存されるか確認
Javaがインストールされていなかったらインストール(パス登録も)

3.タスクスケジューラの登録

重要
外部JARファイルとして利用していた「mysql-connector-java-5.0.8-bin.jar」を
「C:\Program Files (x86)\Java\jre6\lib\ext」にいれておきます。
これがないとスケジューラではDBにアップロードされませんでした。

タスクスケジューラに図のように登録します。

「ログインしているかどうかかかわらず実行する」にチェックをいれる

ファイル名はHimeno**.jar (**はID)
プログラム:javaw
引数: -jar D\Benchmark\Himeno**.jar


これで毎時結果がDBにアップロードされます。
ちょっと不安定ですがこれで様子をみます。

0 件のコメント:

コメントを投稿