eventTransformations = loadEventTransformations();
}
- public void reloadProperties() {
+ /**
+ * Reload application settings.
+ */
+ public void reload() {
try {
properties.load(configurationFileLocation);
properties.refresh();
import java.nio.file.Paths;
import java.time.Duration;
import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.locks.ReentrantLock;
@SpringBootApplication(exclude = {GsonAutoConfiguration.class, SecurityAutoConfiguration.class})
public class VesApplication {
private static ConfigUpdater configUpdater;
private static DMaaPEventPublisher eventPublisher;
private static ApplicationConfigurationListener applicationConfigurationListener;
+ private static ReentrantLock applicationLock = new ReentrantLock();
public static void main(String[] args) {
+ applicationLock.lock();
+ try {
+ startApplication(args);
+ startListeningForApplicationConfigurationStoredInConsul();
+ } finally {
+ applicationLock.unlock();
+ }
+ }
+
+ private static void startApplication(String[] args) {
SpringApplication app = new SpringApplication(VesApplication.class);
applicationSettings = new ApplicationSettings(args, CLIUtils::processCmdLine);
- init();
-
- applicationConfigurationListener = startListeningForApplicationConfigurationStoredInConsul();
-
+ configUpdater = ConfigUpdaterFactory.create(
+ applicationSettings.configurationFileLocation(),
+ Paths.get(applicationSettings.dMaaPConfigurationFileLocation()));
+ eventPublisher = new DMaaPEventPublisher(getDmaapConfig());
app.setAddCommandLineProperties(true);
context = app.run();
}
public static void restartApplication() {
Thread thread = new Thread(() -> {
- context.close();
- applicationSettings.reloadProperties();
- applicationConfigurationListener.reload(Duration.ofMinutes(applicationSettings.configurationUpdateFrequency()));
- init();
- context = SpringApplication.run(VesApplication.class);
+ try {
+ applicationLock.lock();
+ reloadApplicationResources();
+ reloadSpringContext();
+ } finally {
+ applicationLock.unlock();
+ }
});
thread.setDaemon(false);
thread.start();
}
- private static void init() {
- configUpdater = ConfigUpdaterFactory.create(
- applicationSettings.configurationFileLocation(),
+ private static void reloadApplicationResources() {
+ applicationSettings.reload();
+ eventPublisher.reload(getDmaapConfig());
+ configUpdater.setPaths(applicationSettings.configurationFileLocation(),
Paths.get(applicationSettings.dMaaPConfigurationFileLocation()));
- eventPublisher = new DMaaPEventPublisher(getDmaapConfig());
+ applicationConfigurationListener.reload(Duration.ofMinutes(applicationSettings.configurationUpdateFrequency()));
}
- private static ApplicationConfigurationListener startListeningForApplicationConfigurationStoredInConsul() {
+ private static void reloadSpringContext() {
+ context.close();
+ context = SpringApplication.run(VesApplication.class);
+ }
+
+ private static void startListeningForApplicationConfigurationStoredInConsul() {
ConfigurationHandler cbsHandler = new ConfigurationHandler(new CbsClientConfigurationProvider(), configUpdater);
ApplicationConfigurationListener applicationConfigProvider = new ApplicationConfigurationListener(Duration.ofMinutes(DEFAULT_CONFIGURATION_FETCH_PERIOD), cbsHandler);
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
scheduledThreadPoolExecutor.execute(applicationConfigProvider);
-
- return applicationConfigProvider;
+ applicationConfigurationListener = applicationConfigProvider;
}
private static Map<String, PublisherConfig> getDmaapConfig() {
public class DMaaPEventPublisher {
private static final int PENDING_MESSAGE_LOG_THRESHOLD = 100;
private static final Logger log = LoggerFactory.getLogger(DMaaPEventPublisher.class);
- private final DMaaPPublishersCache publishersCache;
+ private DMaaPPublishersCache publishersCache;
private final Logger outputLogger = LoggerFactory.getLogger("org.onap.dcae.common.output");
DMaaPEventPublisher(DMaaPPublishersCache publishersCache) {
this(new DMaaPPublishersCache(dMaaPConfig));
}
+ /**
+ * Reload Dmaap configuration
+ * @param dmaapConfiguration Dmaap configuration
+ */
+ public void reload(Map<String, PublisherConfig> dmaapConfiguration){
+ this.publishersCache = new DMaaPPublishersCache(dmaapConfiguration);
+ }
+
public void sendEvent(VesEvent vesEvent, String dmaapId){
clearVesUniqueIdFromEvent(vesEvent);
publishersCache.getPublisher(dmaapId)
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-class ConfigFilesFacade {
+/**
+ * ConfigFilesFacade is used for reading and writing application properties and dmaap configuration.
+ */
+public class ConfigFilesFacade {
private static final Logger log = LoggerFactory.getLogger(ConfigFilesFacade.class);
- private final Path dMaaPConfigPath;
- private final Path propertiesPath;
+ private Path dmaapConfigPath;
+ private Path propertiesPath;
ConfigFilesFacade(Path propertiesPath, Path dMaaPConfigPath) {
this.propertiesPath = propertiesPath;
- this.dMaaPConfigPath = dMaaPConfigPath;
+ this.dmaapConfigPath = dMaaPConfigPath;
+ }
+
+ /**
+ * Set new paths
+ * @param propertiesFile application property file
+ * @param dmaapConfigFile dmaap configuration file
+ */
+ public void setPaths(Path propertiesFile, Path dmaapConfigFile) {
+ this.propertiesPath = propertiesFile;
+ this.dmaapConfigPath = dmaapConfigFile;
}
Try<Map<String, String>> readCollectorProperties() {
}
Try<JSONObject> readDMaaPConfiguration() {
- log.info(f("Reading DMaaP configuration from file: '%s'", dMaaPConfigPath));
- return readFile(dMaaPConfigPath)
+ log.info(f("Reading DMaaP configuration from file: '%s'", dmaapConfigPath));
+ return readFile(dmaapConfigPath)
.recover(FileNotFoundException.class, __ -> "{}")
- .mapFailure(enhanceError("Unable to read DMaaP configuration from file '%s'", dMaaPConfigPath))
+ .mapFailure(enhanceError("Unable to read DMaaP configuration from file '%s'", dmaapConfigPath))
.flatMap(Conversions::toJson)
.onFailure(logError(log))
.peek(props -> log.info(f("Read following DMaaP properties: '%s'", props)));
}
Try<Void> writeDMaaPConfiguration(JSONObject dMaaPConfiguration) {
- log.info(f("Writing DMaaP configuration '%s' into file '%s'", dMaaPConfiguration, dMaaPConfigPath));
- return writeFile(dMaaPConfigPath, indentConfiguration(dMaaPConfiguration.toString()))
- .mapFailure(enhanceError("Could not save new DMaaP configuration to path '%s'", dMaaPConfigPath))
+ log.info(f("Writing DMaaP configuration '%s' into file '%s'", dMaaPConfiguration, dmaapConfigPath));
+ return writeFile(dmaapConfigPath, indentConfiguration(dMaaPConfiguration.toString()))
+ .mapFailure(enhanceError("Could not save new DMaaP configuration to path '%s'", dmaapConfigPath))
.onFailure(logError(log))
.peek(__ -> log.info("Written successfully"));
}
private String indentConfiguration(String configuration) {
return new JSONObject(configuration).toString(4);
}
-}
\ No newline at end of file
+}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.nio.file.Path;
+
public class ConfigUpdater {
private static final Logger log = LoggerFactory.getLogger(ConfigUpdater.class);
this.isApplicationRestartNeeded = false;
}
+ /**
+ * Set new paths
+ * @param propertiesFile application property file
+ * @param dmaapConfigFile dmaap configuration file
+ */
+ public void setPaths(Path propertiesFile, Path dmaapConfigFile){
+ this.configFilesFacade.setPaths(propertiesFile, dmaapConfigFile);
+
+ }
public synchronized void updateConfig(Option<JSONObject> appConfig) {
appConfig.peek(this::handleUpdate).onEmpty(logSkipMessage());
}