Java 我如何记住该方法,以便在服务器重新启动时使用它?
我正在编写RaspberryPi程序,用于在给定时间执行任务。我编写了TaskManager,它将所有任务保持在同步映射(等待任务)中并进行管理。其方法之一是 附加项(…) 正如您所看到的,任务(如果它有更多属性,则考虑将其设为类)有其自己的ID、日期和执行的方法 我想处理服务器重启和所有实时任务完全消失的情况。我在考虑在数据库中保存任务。我可以保存TaskID和日期,但如何确定给定任务应该执行的方法 我喜欢这种方法的灵活性,因为我可以使任何方法在时间上可执行。 例如,这里有一个来自RGBLed类的方法(它有多个可以及时执行的方法)Java 我如何记住该方法,以便在服务器重新启动时使用它?,java,database,Java,Database,我正在编写RaspberryPi程序,用于在给定时间执行任务。我编写了TaskManager,它将所有任务保持在同步映射(等待任务)中并进行管理。其方法之一是 附加项(…) 正如您所看到的,任务(如果它有更多属性,则考虑将其设为类)有其自己的ID、日期和执行的方法 我想处理服务器重启和所有实时任务完全消失的情况。我在考虑在数据库中保存任务。我可以保存TaskID和日期,但如何确定给定任务应该执行的方法 我喜欢这种方法的灵活性,因为我可以使任何方法在时间上可执行。 例如,这里有一个来自RGBLed
public int-lightLed(最终LED颜色,日期时间日期时间){
return TaskManager.addInTimeTask(new Callable()){
public Void call()引发异常{
//下面是制作led照明的代码
返回null;
}
},日期时间);
}
我想到的是分配给每个方法ID,然后按ID获取方法,但我认为这是不可能的
我敢打赌,有许多问题与类似的问题,但我不能简单地找到他们。我无法正确指定问题(请更改)
谢谢 您面临两个问题。你描述的那个问题可以“很容易”解决。你看,你知道你想调用特定的方法 方法有名称。名字是。。。串。因此,您可以简单地将该名称存储为字符串;当您面前有某个对象时,您可以使用Java反射方法来调用特定的方法 另一个问题是:持久化对象可能没有那么容易。如果我没有弄错你的例子,你主要是在处理匿名的内部类。是的,此类类的对象也可以序列化,但不像普通类那样“容易”或“不经思考”(参见示例) 因此,我的建议是:
也许创建一个专门用于此目的的类是有意义的;包含两个字段(要序列化的实际对象和要调用该字段的方法的名称)。要持久化数据。可以是一个简单的序列化文本文件,也可以是一个数据库。在上面插入任务,并在任务完成时标记它们(或仅删除)。当系统启动时,第一件事就是加载带有文件/数据库任务的数组。我认为我们彼此并不了解。每个类都有多个可以及时执行的方法。当我添加一个任务时,我重写了一个方法。问题是,我需要将这个特殊方法的一些处理程序保存在某个地方。因此,当服务器返回时,它将恢复正确的方法。当您序列化时,您将保存类类型,然后您可以访问您的方法。您必须保存类类型,以便可以重新创建它。感谢您的帮助!:)
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;
}
}
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);
}