Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何记住该方法,以便在服务器重新启动时使用它?_Java_Database - Fatal编程技术网

Java 我如何记住该方法,以便在服务器重新启动时使用它?

Java 我如何记住该方法,以便在服务器重新启动时使用它?,java,database,Java,Database,我正在编写RaspberryPi程序,用于在给定时间执行任务。我编写了TaskManager,它将所有任务保持在同步映射(等待任务)中并进行管理。其方法之一是 附加项(…) 正如您所看到的,任务(如果它有更多属性,则考虑将其设为类)有其自己的ID、日期和执行的方法 我想处理服务器重启和所有实时任务完全消失的情况。我在考虑在数据库中保存任务。我可以保存TaskID和日期,但如何确定给定任务应该执行的方法 我喜欢这种方法的灵活性,因为我可以使任何方法在时间上可执行。 例如,这里有一个来自RGBLed

我正在编写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);
    }