2013-08-21 2 views
0

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

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

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() работает, как и ожидалось, он не должен возвращать никаких различий вообще.

EDIT: (в соответствии с обновленным кодом ФПА в)

Изменения последней части 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); 
} 

EDIT: (избыточный код)

You имеют много избыточных/пустых Map творения. Например,

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

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

То же самое с переменными-членами bundleList и oldBundleList.

+0

: Да, хорошо поймать .. Я добавил, что, но все же он вызовет метод процесса второй раз, если нет изменений в версии этих пакетов. Если вы хотите, вы можете попробовать запустить его также. – ferhan

+0

Держись .. Я как-то испортил .. Позвольте мне изменить код сразу для вас .. – ferhan

+0

Я только что скорректировал свой код .. Дайте мне знать, если еще не ясно. – ferhan

 Смежные вопросы

  • Нет связанных вопросов^_^