0

解决此问题的最佳方法是什么?我想在运行我的应用程序时第一次调用特定方法,但第二次应该只在有任何更改时调用它。如果没有变化,那么我不想调用该方法。

我想process在运行我的应用程序时第一次调用方法,它应该像这样打印出来——我不想在调用中使用TestingFramework条目。process method

{Answer-A=1.0.0, Answer-B=1.0.0}

但在那之后我有一个后台线程运行,它将getAttributesFromDatabase再次调用方法,所以现在我只想打印出改变的信息,但如果没有改变,那么我不想process再次调用方法。

假设任何一个值都改变了Animal-Aor Animal-B,那么它应该只打印出更改信息。

举个例子——假设我的后台线程第二次运行时,map条目是这样的,没有任何变化——

TestingFramework 1.0.0
Answer-A         1.0.0
Asnwer-B         1.0.0

然后我不想再次调用 process 方法,因为没有变化。但不知何故,假设值条目已更改为Answer-Aor Answer-B,那么那时,我想使用已更改的条目调用 process 方法。

我希望这个问题足够清楚。

public static Map<String, String> frameworkInfo = new LinkedHashMap<String, String>();
public static Map<String, String> bundleList = new LinkedHashMap<String, String>();
public static Map<String, String> newBundleList = new LinkedHashMap<String, String>();
private static Map<String, String> oldBundleList = new LinkedHashMap<String, String>();

public static void main(String[] args) {

    getAttributesFromDatabase();

    loggingAfterEveryXMilliseconds();

}

private static void getAttributesFromDatabase() {

    Map<String, String> bundleInformation = new LinkedHashMap<String, String>();

    bundleInformation = getFromDatabase();

    if(TestingFrameworkInfo.get("TestingFramework") != (bundleInformation.get("TestingFramework"))) {
        TestingFrameworkInfo.put("TestingFramework", bundleInformation.get("TestingFramework"));    
        String version = TestingFrameworkInfo.get("TestingFramework");
        printTestingFrameworkBundle("TestingFramework", version);
    }

    bundleInformation.remove("TestingFramework");

    if(!bundleInformation.isEmpty()) {
        oldBundleList = bundleList;
        bundleList = bundleInformation;
    }

    final Map<String, MapDifference.ValueDifference<String>> entriesDiffering = Maps.difference(oldBundleList, bundleList).entriesDiffering();
    if (!entriesDiffering.isEmpty()) {
        for (String key : entriesDiffering.keySet()) {
            newBundleList.put(key, bundleList.get(key));
            System.out.println("{" + key + "=" + bundleList.get(key) + "}");
        } 

        process(newBundleList);
    }
    process(bundleList);
}


private static void process(final Map<String, String> test) {
    System.out.println(test);
}


private static Map<String, String> getFromDatabase() {

    Map<String, String> hello = new LinkedHashMap<String, String>();

    String version0 = "1.0.0";
    String version1 = "1.0.0";
    String version2 = "1.0.0";

    hello.put("TestingFramework", version0);
    hello.put("Answer-A", version1);
    hello.put("Answer-B", version2);

    return hello;
}

private static void loggingAfterEveryXMilliseconds() {
    new Thread() {
        public void run() {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {

                }
                getAttributesFromDatabase();

            }
        }
    }.start();
}

使用下面的代码,我有,它会在没有变化的情况下第一次和第二次调用 process 方法,然后再次调用我根本不想要的 process 方法。有人可以帮我吗?

我很确定,我在这里遗漏了一件关键的事情,然后我猜它会开始工作。

更新:-

我仍在努力。有人可以帮我吗?

4

1 回答 1

1

如果您的数据库是一个 RDBMS,您可以将检测更改的逻辑放在那里,即使用触发器来更新您的应用程序将轮询的最后修改的列,并process在它更改时调用您的方法。

于 2013-08-21T00:15:00.667 回答