[準備]
・プロジェクトを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にアップロードされます。
ちょっと不安定ですがこれで様子をみます。