Вызовите метод в первый раз, а затем вызывайте его снова, когда есть какие-либо изменения в данных

Каков наилучший способ решить эту проблему? Я хочу вызвать определенный метод в первый раз, когда я запускаю свое приложение, но во второй раз его следует вызывать только тогда, когда есть какие-либо изменения. Если изменений нет, я не хочу вызывать этот метод.

Ниже приведен метод, который будет вызываться из моего основного приложения. И в методе ниже, я извлекаю данные из базы данных. Впервые, после извлечения данных из базы данных, карта будет выглядеть примерно так:

BundleFramework    1.0.0
Bundle-A         1.0.0
Bundle-B         1.0.0

Теперь я хочу распечатать BundleFramework и его версию отдельно. А затем вызовите метод процесса, который будет включать Bundle-A и Bundle-B и его версию на карте в первый раз.

И теперь мой фоновый поток работает каждые две секунды, который также будет вызывать getBundlesInformation метод. Теперь, если нет изменений в версии для Bundle-A and Bundle-B, то я не хочу вызывать метод процесса, но если есть какие-либо изменения в любой из версий либо Bundle-A or Bundle-B, затем передать это изменение только process method,

Я почти там в своем коде ниже, но то, что происходит в настоящее время: если в базе данных нет изменений для Bundle-A и Bundle-B версии, то также вызывается метод процесса с информацией Bundle-A и Bundle-B.

Я хочу, чтобы в первый раз (при запуске из основного приложения) он вызывал метод процесса с помощью Bundle-A и Bundle-B, а в следующий раз он должен вызывать метод процесса только тогда, когда есть какие-либо изменения в версии этого приложения. расслоение.

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>();


private static void getAttributesFromDatabase() {

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

    bundleInformation = getFromDatabase();

    if(!bundleInformation.get("BundleFramework").equals(frameworkInfo.get("BundleFramework"))) {
        frameworkInfo.put("BundleFramework", bundleInformation.get("BundleFramework")); 
        String version = frameworkInfo.get("BundleFramework");
        printFrameworkBundle("BundleFramework", version);
    }

    bundleInformation.remove("BundleFramework");

    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 Map<String, String> getFromDatabase() {

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

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

    data.put("BundleFramework", version0);
    data.put("Bundle-A", version1);
    data.put("Bundle-B", version2);

    return data;
}

Кто-нибудь может мне помочь с этим? Я использую базу данных Nosql, поэтому у меня не может быть триггера.

Обновленный код:-

Ниже мой полный код

public class App {

    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 makeCall(Map<String, String> test) {
        System.out.println(test);
    }


    private static void getAttributesFromDatabase() {

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

        bundleInformation = getFromDatabase();

        if(!bundleInformation.get("Framework").equals(frameworkInfo.get("Framework"))) {
            frameworkInfo.put("Framework", bundleInformation.get("Framework")); 
            String version = frameworkInfo.get("Framework");
            printFrameworkBundle("Framework", version);
        }

        bundleInformation.remove("Framework");

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

        if(oldBundleList != null) {
            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) + "}");
                } 
                makeCall(newBundleList);
            }
        } else {
            makeCall(bundleList);
        }
    }

    private static void printFrameworkBundle(String string, String version) {
        System.out.println(string+" - "+version);       
    }

    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("Framework", version0);
        hello.put("BundleA", version1);
        hello.put("BundleB", version2);

        return hello;
    }

    /**
     * This is a simple which will call the logHistogramInfo method after every
     * X Milliseconds
     */
    private static void loggingAfterEveryXMilliseconds() {
        new Thread() {
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException ex) {

                    }
                    getAttributesFromDatabase();
                }
            }
        }.start();
    }
}

1 ответ

Решение

Использование String#equals() для сравнения строк. Не равно != скорее всего, вернет true, даже если две строки эквивалентны по содержанию. Итак, измените свой if состояние как

if(!(BundleFrameworkInfo.get("BundleFramework") != null &&
   BundleFrameworkInfo.get("BundleFramework").equals(bundleList.get("BundleFramework"))))

Ваш остальной код довольно запутанный. Например,

if(!bundleList.isEmpty()) {
    oldBundleList = bundleList;
    bundleList = bundleList; // what would self-assigning achieve?
}

Кроме того, так как всякий раз, когда bundleList не пустой вы устанавливаете oldBundleList к bundleList, Итак, предполагая Maps.difference() работает как положено, он не должен возвращать никаких различий вообще.

РЕДАКТИРОВАТЬ: (согласно обновленному коду OP)

Изменить последнюю часть getAttributesFromDatabase() как

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

if(!oldBundleList.isEmpty()) {
    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);
    }
} else {
    process(bundleList);
}

РЕДАКТИРОВАТЬ: (избыточный код)

У вас много лишних / пустых Map творения. Например,

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

// initialize directly
Map<String, String> bundleInformation = getFromDatabase();

То же самое касается переменных-членов bundleList а также oldBundleList,

Другие вопросы по тегам