私は与えられた時間にタスクを実行するためのRaspberryPiプログラムを書いています。私はすべてのタスクを同期マップ(awaitingTasks)に保持して管理するTaskManagerを作成しました。あなたは、タスク(それはより多くの属性を持っていれば、クラス作りの思考が)それが実行される独自のID、日付と方法を持って見ることができるように、それの方法の一つは、方法を覚えているので、サーバーを再起動するときに使用する方法はありますか?
addInTimeTasks(...)
public static int addInTimeTask(Callable task, DateTime time) {
synchronized (awaitingTasks) {
final int id = assignNewId();
awaitingTasks.put(id, scheduledThreadPool.schedule(new CallableTask(task, new CallableTask.MyCallback() {
@Override
public void onFinish() {
awaitingTasks.remove(id);
}
}), TimeDiffCalc.secToDate(time), TimeUnit.SECONDS));
return id;
}
}
です。
サーバーが再起動し、すべての時間内のタスクが単に消えてしまったときの状況を処理したい。タスクをデータベースに保持することを考えていました。私はTaskIDとDateを保持することができますが、どのようにタスクを実行する必要があるメソッドを決定するのですか?
私はこのメソッドのflexablityを好きです。私は任意のメソッドを実行可能にすることができます。ここで例えば は(時間で実行することができmutltipleメソッドを持っています)RGBLEDクラスからメソッドで、すべてのメソッドのIDに割り当て、その後、idでメソッドを取得しますが、私はいけないことだった何を私の心に入って来た
public int lightLed(final LedColor color, DateTime dateTime){
return TaskManager.addInTimeTask(new Callable<Void>() {
public Void call() throws Exception {
//here is code that makes led lighting
return null;
}
},dateTime);
}
それは無理だと思う。
似たような問題を抱えている多くの質問がありましたが、単純に見つけることはできません。質問を正しく指定できません(変更してください)
ありがとう!
データを永続化する必要があります。それをシンプルに保つためのシリアライズされたテキストファイル、またはデータベースかもしれません。タスクをその上に挿入し、完了したらそれらにフラグを付ける(または単に削除する)。 システムが起動するとき、最初にファイル/データベースタスクを使ってアレイをロードすることです。 – danielbathke
私はお互いを理解しているとは思わない。すべてのクラスには、時間内に実行可能な複数のメソッドがあります。タスクを追加すると、メソッドをオーバーライドします。そして、問題は、私はこの特定のメソッドへのハンドラをどこかに保存する必要があるということです。したがって、サーバーが戻ってきたら、適切な方法を回復します。 –
シリアライズすると、クラスの種類が保存され、メソッドにアクセスできます。クラスの型を保存する必要があるため、クラスの型を再作成することができます。 – danielbathke