Вызовите метод в первый раз, а затем вызывайте его снова, когда есть какие-либо изменения в данных
Каков наилучший способ решить эту проблему? Я хочу вызвать определенный метод в первый раз, когда я запускаю свое приложение, но во второй раз его следует вызывать только тогда, когда есть какие-либо изменения. Если изменений нет, я не хочу вызывать этот метод.
Ниже приведен метод, который будет вызываться из моего основного приложения. И в методе ниже, я извлекаю данные из базы данных. Впервые, после извлечения данных из базы данных, карта будет выглядеть примерно так:
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
,