/// <summary> /// Loads the routerdb into ram and starts the file monitor that automatically checks /// for updates in the routerdb and reloads when necessary. /// </summary> public static void initialize(IConfiguration configuration) { var paths = configuration.GetSection("Paths"); using (var stream = new FileInfo(paths.GetValue <string>("RouterdbFile")).OpenRead()) { routerDb = RouterDb.Deserialize(stream); } router = new Router(routerDb); monitor = new FilesMonitor <FileInfo>((f) => { using (var stream = new FileInfo(paths.GetValue <string>("RouterdbFile")).OpenRead()) { routerDb = RouterDb.Deserialize(stream); } router = new Router(routerDb); return(true); }, new FileInfo(paths.GetValue <string>("RouterdbFile"))); monitor.Start(); monitor.AddFile(paths.GetValue <string>("RouterdbFile")); }
/// <summary> /// Initializes all routing instance from the configuration in the configuration file. /// </summary> public static void BootFromConfiguration(string path) { try { // register vehicle profiles. Vehicle.RegisterVehicles(); // load all .routerdb files. var dataDirectory = new DirectoryInfo(path); if (!dataDirectory.Exists) { throw new DirectoryNotFoundException( string.Format("Configured data directory doesn't exist: {0}", dataDirectory.FullName)); } Logger.Log("Bootstrapper", TraceEventType.Information, "Loading all routerdb's from path: {0}", dataDirectory.FullName); // load all relevant files. var routingFiles = dataDirectory.GetFiles("*.routerdb").Concat( dataDirectory.GetFiles("*.multimodaldb")); if (routingFiles.Count() == 0) { throw new DirectoryNotFoundException( string.Format("No .routerdb files found in {0}", dataDirectory.FullName)); } // load each routerdb on other threads. foreach (var file in routingFiles) { var thread = new Thread((state) => { var localFile = state as FileInfo; if (Bootstrapper.LoadInstance(localFile)) { var monitor = new FilesMonitor <FileInfo>((f) => { return(Bootstrapper.LoadInstance(f)); }, localFile); monitor.Start(); monitor.AddFile(file.FullName); _fileMonitors.Add(monitor); } }); thread.Start(file); } // check if there are folder with OSM-XML or OSM-PBF file. var subDirs = dataDirectory.EnumerateDirectories(); foreach (var subDir in subDirs) { var osmFiles = subDir.EnumerateFiles("*.osm").Concat( subDir.EnumerateFiles("*.osm.pbf")).ToArray(); if (osmFiles.Length > 0) { var thread = new Thread((state) => { var localDirectory = state as DirectoryInfo; if (Bootstrapper.LoadInstanceFromFolder(localDirectory)) { var monitor = new FilesMonitor <DirectoryInfo>((f) => { return(Bootstrapper.LoadInstanceFromFolder(f)); }, localDirectory); monitor.Start(); // add osm and osm-pbf files. foreach (var osmFile in osmFiles) { monitor.AddFile(osmFile.FullName); } foreach (var luaFile in subDir.EnumerateFiles("*.lua")) { monitor.AddFile(luaFile.FullName); } _fileMonitors.Add(monitor); } }); thread.Start(subDir); } } } catch (Exception ex) { Logger.Log("Bootstrapper", TraceEventType.Critical, "Failed to start service: {0}", ex.ToInvariantString()); } }