use of org.structr.api.service.InitializationCallback in project structr by structr.
the class Services method doInitialize.
private void doInitialize() {
configurationClass = Settings.Configuration.getValue();
configuredServiceNames = Settings.Services.getValue();
// create set of configured services
configuredServiceClasses.addAll(Arrays.asList(configuredServiceNames.split("[ ,]+")));
if (!isTesting()) {
// read license
licenseManager = new StructrLicenseManager(Settings.getBasePath() + "license.key");
}
// if configuration is not yet established, instantiate it
// this is the place where the service classes get the
// opportunity to modify the default configuration
getConfigurationProvider();
// do simple heap size check
final Runtime runtime = Runtime.getRuntime();
final long max = runtime.maxMemory() / 1024 / 1024 / 1024;
final int processors = runtime.availableProcessors();
logger.info("{} processors available, {} GB max heap memory", processors, max);
if (max < 8) {
logger.warn("Maximum heap size is smaller than recommended, this can lead to problems with large databases!");
logger.warn("Please configure AT LEAST 8 GBs of heap memory using -Xmx8g.");
}
logger.info("Starting services..");
// initialize other services
for (final String serviceClassName : configuredServiceClasses) {
Class serviceClass = getServiceClassForName(serviceClassName);
if (serviceClass != null) {
startService(serviceClass);
}
}
logger.info("{} service(s) processed", serviceCache.size());
logger.info("Registering shutdown hook.");
// register shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
shutdown();
}
});
// read permissions for ownerless nodes
final String configForOwnerlessNodes = Settings.OwnerlessNodes.getValue();
if (StringUtils.isNotBlank(configForOwnerlessNodes)) {
for (final String permission : configForOwnerlessNodes.split("[, ]+")) {
final String trimmed = permission.trim();
if (StringUtils.isNotBlank(trimmed)) {
final Permission val = Permissions.valueOf(trimmed);
if (val != null) {
permissionsForOwnerlessNodes.add(val);
} else {
logger.warn("Invalid permisson {}, ignoring.", trimmed);
}
}
}
} else {
// default
permissionsForOwnerlessNodes.add(Permission.read);
}
// a configuration file, i.e. when this is NOT this first start.
try {
final ExecutorService service = Executors.newSingleThreadExecutor();
service.submit(new Runnable() {
@Override
public void run() {
// wait a second
try {
Thread.sleep(100);
} catch (Throwable ignore) {
}
// call initialization callbacks from a different thread
for (final InitializationCallback callback : singletonInstance.callbacks) {
callback.initializationDone();
}
}
}).get();
} catch (Throwable t) {
logger.warn("Exception while executing post-initialization tasks", t);
}
// Don't use logger here because start/stop scripts rely on this line.
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.ms").format(new Date()) + " ---------------- Initialization complete ----------------");
setOverridingSchemaTypesAllowed(false);
initializationDone = true;
}
Aggregations