Imports System.ServiceModel Imports System.ServiceProcess Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Database Imports DigitalData.Modules Imports System.ServiceModel.Description Imports DigitalData.Modules.Config Imports System.ServiceModel.Channels Public Class WindowsService Inherits ServiceBase Private ServiceHost As ServiceHost(Of EDMIService) Private LogConfig As LogConfig Private LogConfigScheduler As LogConfig Private Logger As Logger Private Firebird As Firebird Private MSSQL_ECM As MSSQLServer Private MSSQL_IDB As MSSQLServer Private MSSQL_Config As MSSQLServer Private ConfigManager As ConfigManager(Of Config) Private Config As Config Private Filesystem As Filesystem.File Private GlobalState As GlobalState Private Scheduler As Scheduler Public Sub New() ServiceName = SERVICE_NAME End Sub Public Shared Sub Main() Run(New WindowsService()) End Sub Protected Overrides Sub OnStart(args As String()) Try ' Init Dim oServicePath As String = AppDomain.CurrentDomain.BaseDirectory Dim oServiceVersion As String = My.Application.Info.Version.ToString() ' Initializing Logger LogConfig = New LogConfig(LogConfig.PathType.CustomPath, IO.Path.Combine(oServicePath, "Log"), FileKeepRangeInDays:=3) LogConfigScheduler = New LogConfig(LogConfig.PathType.CustomPath, IO.Path.Combine(oServicePath, "Log"), Suffix:="Scheduler", FileKeepRangeInDays:=3) Logger = LogConfig.GetLogger() ' Log Initial Logger.Info("Service [{0}] is starting...", SERVICE_DISPLAY_NAME) Logger.Info("ServiceDirectory: [{0}]", oServicePath) Logger.Info("Version: [{0}]", oServiceVersion) ' Initializing Config Logger.Info("Loading Config") ConfigManager = New ConfigManager(Of Config)(LogConfig, oServicePath) Config = ConfigManager.Config ' Setup Reload-timer for config Dim oTimer As New Timers.Timer(60000) AddHandler oTimer.Elapsed, AddressOf ReloadTimer_Tick oTimer.Start() ' Setting Debug Flag Logger.Info("Setting DEBUG Flag to [{0}]", ConfigManager.Config.Debug) LogConfig.Debug = ConfigManager.Config.Debug LogConfigScheduler.Debug = ConfigManager.Config.Debug Logger.Info("Connecting to Databases..") Firebird = StartFirebird() MSSQL_ECM = GetMSSQL_ECM(LogConfig) MSSQL_IDB = GetMSSQL_IDB(LogConfig) MSSQL_Config = GetMSSQL_Config(LogConfig) Logger.Info("Connection to Databases established!") Logger.Debug("Initializing EDMI Functions") Filesystem = New Filesystem.File(LogConfig) GlobalState = New GlobalState(LogConfig, MSSQL_IDB, MSSQL_ECM) Dim oMSSQLServer = GetMSSQL_Config(LogConfigScheduler) Scheduler = New Scheduler(LogConfigScheduler, oMSSQLServer, GlobalState.TableStore) Logger.Info("Loading Global Data") GlobalState.LoadObjectStores() GlobalState.LoadConnections() GlobalState.LoadDoctypes() GlobalState.LoadClientConfig(Config) Logger.Info("Starting Scheduler") Scheduler.Start() Logger.Info("Preparing WCF ServiceHost") EDMIService.MSSQL_ECM = MSSQL_ECM EDMIService.MSSQL_IDB = MSSQL_IDB EDMIService.Firebird = Firebird EDMIService.LogConfig = LogConfig EDMIService.AppConfig = Config EDMIService.Filesystem = Filesystem EDMIService.GlobalState = GlobalState EDMIService.Scheduler = Scheduler Logger.Info("Starting WCF ServiceHost") Dim oBaseAddresses() As Uri = {New Uri(SERVICE_BASE_ADDRESS)} ServiceHost = New ServiceHost(Of EDMIService)(oBaseAddresses) ServiceHost.EnableMetadataExchange(False) Logger.Debug("Listing Endpoints:") For Each oEndpoint In ServiceHost.Description.Endpoints Logger.Debug("Name: {0}", oEndpoint.Name) Logger.Debug("Address: {0}", oEndpoint.Address.ToString) Logger.Debug("Listen Uri: {0}", oEndpoint.ListenUri.AbsoluteUri) Logger.Debug("Binding: {0}", oEndpoint.Binding.Name) Logger.Debug("Contract: {0}", oEndpoint.Contract.Name) Next Logger.Debug("Starting WFC ServiceHost..") ServiceHost.Open() Logger.Debug("WCF ServiceHost started!") Logger.Info("Service {0} successfully started!", SERVICE_DISPLAY_NAME) Catch ex As Exception Logger.Warn("Unexpected Error while starting the service: {0}", ex.Message) Logger.Error(ex) GracefullyStop() End Try End Sub Private Sub ReloadTimer_Tick() If ConfigManager.Reload() = False Then Logger.Warn("Could not reload config, check the service and config file.") End If Config = ConfigManager.Config LogConfig.Debug = ConfigManager.Config.Debug End Sub Private Function StartFirebird() As Firebird Logger.Debug("Connecting to Firebird") If Config.Firebird_Datasource = String.Empty Then Logger.Info("Firebird database not configured. Skipping.") Return Nothing End If Try Dim oFirebird = New Firebird( LogConfig, Config.Firebird_Datasource, Config.Firebird_DatabaseName, Config.Firebird_DatabaseUser, Config.Firebird_DatabasePassword ) Logger.Info("Database connection established.") Return oFirebird Catch ex As Exception Logger.Warn("StartFirebird: Could not connect to firebird database.") Logger.Error(ex) Return Nothing End Try End Function Private Function GetMSSQL_ECM(pLogConfig As LogConfig) As MSSQLServer Logger.Debug("Connecting to ECM MSSQL") If Config.ConnectionString_ECM = String.Empty Then Logger.Warn("Configuration for ConnectionString_ECM is missing.") Throw New ArgumentNullException("ConnectionString_ECM") End If Dim oMSSQL = New MSSQLServer(pLogConfig, Config.ConnectionString_ECM) Logger.Info("Database connection to ECM Database established.") Return oMSSQL End Function Private Function GetMSSQL_IDB(pLogConfig As LogConfig) As MSSQLServer Logger.Debug("Connecting to IDB MSSQL") If Config.ConnectionString_IDB = String.Empty Then Logger.Warn("Configuration for ConnectionString_IDB is missing.") Throw New ArgumentNullException("ConnectionString_IDB") End If Dim oMSSQL = New MSSQLServer(pLogConfig, Config.ConnectionString_IDB) Logger.Info("Database connection to IDB Database established.") Return oMSSQL End Function Private Function GetMSSQL_Config(pLogConfig As LogConfig) As MSSQLServer Logger.Debug("Connecting to Config MSSQL") If Config.ConnectionString_Config = String.Empty Then Logger.Warn("Configuration for ConnectionString_Config is missing.") Throw New ArgumentNullException("ConnectionString_Config") End If Dim oMSSQL = New MSSQLServer(pLogConfig, Config.ConnectionString_Config) Logger.Info("Database connection to Config Database established.") Return oMSSQL End Function Protected Overrides Sub OnStop() GracefullyStop() End Sub Private Sub GracefullyStop() Logger.Info("Service {0} is stopping!", SERVICE_DISPLAY_NAME) If ServiceHost IsNot Nothing Then ServiceHost.Close() ServiceHost = Nothing End If Scheduler.Stop() End Sub End Class