2016-08-23 1 views
3

J'écris le programme RaspberryPi pour exécuter des tâches à un moment donné. J'ai écrit TaskManager qui conserve toutes les tâches dans Map (awaitingTasks) synchronisé et les gère. Une de ses méthodes estComment est-ce que je me souviens de la méthode afin que je puisse l'utiliser quand le serveur redémarre?

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; 
    } 
} 

comme vous pouvez le voir Tâche (penser à ce qui en fait la classe si elle a d'autres attributs) avoir son propre ID, la date et la méthode qu'il exécute .

Je veux gérer la situation lorsque le serveur redémarre et que toutes les tâches à temps disparaissent. Je pensais à tenir des tâches dans la base de données. Je peux contenir TaskID et Date mais comment déterminer la méthode que la tâche donnée devrait exécuter?

J'aime la flexibilité de cette méthode parce que je peux rendre n'importe quelle méthode exécutable dans le temps. Par exemple est ici méthode de la classe LED RVB (qui ont des méthodes mutltiple qui peuvent être exécutées dans le temps)

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

Ce qui est venu dans mon esprit était d'attribuer à chaque ID de méthode, puis obtenir la méthode par id mais je ne pense que c'est passable. Je parierais qu'il y avait beaucoup de questions avec le même problème mais je ne peux pas simplement les trouver. Je ne peux pas spécifier la question correctement (donc s'il vous plaît le changer)

Merci!

+0

Vous souhaitez conserver vos données. Pourrait être int un fichier texte sérialisé pour le garder simple, ou une base de données. Insérez vos tâches dessus et marquez-les (ou supprimez-les) quand elles sont terminées. Lorsque le système démarre, la première chose à faire est de charger le tableau avec les tâches de fichier/base de données. – danielbathke

+0

Je ne pense pas que nous nous sommes compris. Chaque classe a plusieurs méthodes qui peuvent être exécutées à temps. Lorsque j'ajoute une tâche, je remplace une méthode. Et le problème est que j'ai besoin d'avoir un gestionnaire de cette méthode particulière enregistrée quelque part.Ainsi, lorsque les serveurs reviendront, ils récupéreront la méthode appropriée. –

+1

Lorsque vous sérialiser, vous allez enregistrer le type de classe, vous pouvez alors accéder à votre méthode. Vous devez enregistrer le type de classe, il sera donc possible de le recréer. – danielbathke

Répondre

1

Vous rencontrez deux problèmes. Celui que vous décrivez peut être fixé "facilement". Vous voyez, vous savez que vous voulez appeler des méthodes spécifiques.

Les méthodes ont des noms. Les noms sont ... des chaînes. Donc, vous pouvez simplement stocker ce nom en tant que chaîne; et lorsque vous avez un objet devant vous, vous pouvez utiliser des moyens de réflexion Java pour invoquer une méthode particulière.

L'autre problème est: la persistance de vos objets n'est peut-être pas si simple. Si mes exemples sont bons, vous avez surtout affaire à des classes internes anonymes. Et oui, les objets de ces classes peuvent aussi être sérialisés, mais pas aussi "faciles" ou "sans pensée" que les classes normales (voir here par exemple).

Alors, mes suggestions:

  1. Ne pas utiliser les classes internes; mais les classes ordinaires (bien que cela puisse affecter la "disposition" du code existant dans une grande mesure); sérialiser objets de ces classes
  2. Ensemble avec objet sérialisé, rappelez-vous le nom (et probablement les arguments dont vous avez besoin) afin que vous puissiez appeler des méthodes par nom

Probablement, il serait logique de créer une classe spécifique à cette fin; contenant deux champs (l'objet réel à sérialisé, et le nom de la méthode à appeler sur cela).