2016-08-23 5 views
3

私は与えられた時間にタスクを実行するための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); 
} 

それは無理だと思う。

似たような問題を抱えている多くの質問がありましたが、単純に見つけることはできません。質問を正しく指定できません(変更してください)

ありがとう!

+0

データを永続化する必要があります。それをシンプルに保つためのシリアライズされたテキストファイル、またはデータベースかもしれません。タスクをその上に挿入し、完了したらそれらにフラグを付ける(または単に削除する)。 システムが起動するとき、最初にファイル/データベースタスクを使ってアレイをロードすることです。 – danielbathke

+0

私はお互いを理解しているとは思わない。すべてのクラスには、時間内に実行可能な複数のメソッドがあります。タスクを追加すると、メソッドをオーバーライドします。そして、問題は、私はこの特定のメソッドへのハンドラをどこかに保存する必要があるということです。したがって、サーバーが戻ってきたら、適切な方法を回復します。 –

+1

シリアライズすると、クラスの種類が保存され、メソッドにアクセスできます。クラスの型を保存する必要があるため、クラスの型を再作成することができます。 – danielbathke

答えて

1

あなたには2つの問題があります。あなたが描写したものは「簡単に」修正することができます。特定のメソッドを呼びたいと思っていることが分かります。

メソッドに名前があります。名前は...文字列です。だから、単にその名前を文字列として保存することができます。あなたの前にオブジェクトがあるときは、Javaリフレクション手段を使って特定のメソッドを呼び出すことができます。

もう1つの問題は、オブジェクトを永続化することはそれほど簡単ではないことです。あなたの例が正しいとすれば、あなたはほとんどが匿名の内部クラスを扱っています。そして、はい、そのようなクラスのオブジェクトも、通常のクラス(例えば、hereを参照)として "簡単"または "考えなく"として直列化することはできません。

だから、私の提案:

  1. 内部クラスを使用しないでください。通常のクラス(既存のコードの "レイアウト"に大きな影響を与えるかもしれませんが)。 、シリアライズされたオブジェクトと
  2. 一緒に、これらのクラスのオブジェクトをシリアライズ名(および必要なおそらく引数)を覚えているので、あなたはそれがその目的のために特別にクラスを作成するには意味をなさないと思いますおそらく

名前でメソッドを呼び出すことができます。 2つのフィールド(シリアル化される実際のオブジェクト、およびそれを呼び出すメソッドの名前)を含みます。

関連する問題