0

この問題を解決する最善の方法は何ですか? アプリケーションを実行しているときに特定のメソッドを初めて呼び出したいのですが、2 回目は変更がある場合にのみ呼び出す必要があります。変更がない場合は、そのメソッドを呼び出したくありません。

アプリケーションを実行しているときに初めてメソッドを呼び出したいのですが、このように出力されるはずです。呼び出しでエントリprocessを使用したくありません。TestingFrameworkprocess method

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

しかし、その後、メソッドを再度呼び出すバックグラウンドスレッドが実行されているため、変更された情報のみを出力したいのですが、変更がない場合はメソッドを再度getAttributesFromDatabase呼び出したくありません。process

Animal-Aまたはのいずれかの値が変更されたと仮定するとAnimal-B、変更情報のみを出力する必要があります。

例を見てみましょう - バックグラウンド スレッドが実行されている 2 回目で、マップ エントリが変更なしでこのようになっているとします -

TestingFramework 1.0.0
Answer-A         1.0.0
Asnwer-B         1.0.0

その後、変更がなかったため、プロセスメソッドを再度呼び出したくありません。しかし、どういうわけAnswer-Aか orの値エントリが変更された場合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();
}

以下のコードでは、プロセスメソッドを初めて呼び出し、変更がないときに2回目にプロセスメソッドを呼び出し、まったく必要のないプロセスメソッドを呼び出します。誰でもこれで私を助けることができますか?

ここで重要なことが1つ欠けていると確信しています。その後、機能し始めると思います。

更新しました:-

私はまだこれに取り組んでいます。誰でもこれで私を助けることができますか?

4

1 に答える 1

1

データベースが RDBMS の場合、そこに変更を検出するロジックを配置できます。つまり、トリガーを使用して、最後に変更された列を更新し、アプリケーションがポーリングしprocessて変更時にメソッドを呼び出します。

于 2013-08-21T00:15:00.667 に答える