我正在编写RaspberryPi程序,用于在给定时间执行任务。我编写了TaskManager,它将所有任务保存在同步Map(awaitingTasks)中并对其进行管理。其中一种方法是
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;
}
}
正如你所看到的那样(如果有更多属性,可以考虑让它成为类),它有自己的ID,日期和方法。
我想处理服务器重启时的情况,并且所有时间任务都会消失。我在考虑在数据库中保存任务。我可以保存TaskID和Date但是如何确定给定任务应该执行的方法?
我喜欢这种方法的灵活性,因为我可以使任何方法及时执行。 例如,这里是来自RGBLed类的方法(具有可以及时执行的多个方法)
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);
}
我想到的是分配给每个方法ID,然后通过id获取方法,但我不认为它是可行的。
我敢打赌,有很多类似问题的问题,但我不能简单地找到它们。我无法正确指定问题(所以请更改)
谢谢!
答案 0 :(得分:1)
你面临两个问题。您描述的那个可以很容易修复&#34;。你知道,你知道你想要调用特定的方法。
方法有名字。名字是......字符串。所以,你可以简单地将该名称存储为字符串;当你面前有一些对象时,可以使用Java反射方法来调用特定的方法。
另一个问题是:坚持你的对象可能不那么容易。如果我的示例正确,那么您主要处理的是匿名内部类。是的,这些类的对象也可以序列化,但不能像#34; easy&#34;或者&#34;没有想到&#34;作为普通类(例如,参见here)。
所以,我的建议:
创建专门用于此目的的课程可能是有意义的;包含两个字段(要序列化的实际对象,以及要调用的方法的名称)。