我怎么记得方法所以我可以在服务器重启时使用它?

时间:2016-08-23 19:35:08

标签: java database

我正在编写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获取方法,但我不认为它是可行的。

我敢打赌,有很多类似问题的问题,但我不能简单地找到它们。我无法正确指定问题(所以请更改)

谢谢!

1 个答案:

答案 0 :(得分:1)

你面临两个问题。您描述的那个可以很容易修复&#34;。你知道,你知道你想要调用特定的方法。

方法有名字。名字是......字符串。所以,你可以简单地将该名称存储为字符串;当你面前有一些对象时,可以使用Java反射方法来调用特定的方法。

另一个问题是:坚持你的对象可能不那么容易。如果我的示例正确,那么您主要处理的是匿名内部类。是的,这些类的对象也可以序列化,但不能像#34; easy&#34;或者&#34;没有想到&#34;作为普通类(例如,参见here)。

所以,我的建议:

  1. 不要使用内部课程;但普通的课程(虽然这可能会在很大程度上影响现有代码的布局和#34;);序列化这些类的对象
  2. 与序列化对象一起,记住名称(可能还有你需要的参数),这样你就可以按名称调用方法
  3. 创建专门用于此目的的课程可能是有意义的;包含两个字段(要序列化的实际对象,以及要调用的方法的名称)。