diff --git a/ZeroLevel.EventServer/EventRepository.cs b/ZeroLevel.EventServer/EventRepository.cs new file mode 100644 index 0000000..5e0c1c6 --- /dev/null +++ b/ZeroLevel.EventServer/EventRepository.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Data.SQLite; +using System.Text; +using System.Threading; +using ZeroLevel.SqLite; + +namespace ZeroLevel.EventServer +{ + public class EventRepository + :BaseSqLiteDB + { + private readonly SQLiteConnection _db; + private readonly ReaderWriterLockSlim _rwLock = new ReaderWriterLockSlim(); + private readonly string _tableName; + + public EventRepository() + { + _tableName = "events"; + + var path = PrepareDb($"{_tableName}.db"); + _db = new SQLiteConnection($"Data Source={path};Version=3;"); + _db.Open(); + + Execute($"CREATE TABLE IF NOT EXISTS {_tableName} (id INTEGER PRIMARY KEY AUTOINCREMENT, key TEXT, body BLOB)", _db); + Execute($"CREATE INDEX IF NOT EXISTS key_index ON {_tableName} (key)", _db); + } + } +} diff --git a/ZeroLevel.EventServer/EventService.cs b/ZeroLevel.EventServer/EventService.cs new file mode 100644 index 0000000..8762bbb --- /dev/null +++ b/ZeroLevel.EventServer/EventService.cs @@ -0,0 +1,61 @@ +using ZeroLevel.Network; +using ZeroLevel.Services.Applications; + +namespace ZeroLevel.EventServer +{ + public class EventService + : BaseZeroService + { + public EventService() + { + } + + protected override void StartAction() + { + var host = UseHost(); + this.AutoregisterInboxes(host); + host.OnConnect += Host_OnConnect; + host.OnDisconnect += Host_OnDisconnect; + } + + private void Host_OnDisconnect(ISocketClient obj) + { + Log.Info($"Client '{obj.Endpoint.Address}:{obj.Endpoint.Port}' disconnected"); + } + + private void Host_OnConnect(IClient obj) + { + Log.Info($"Client '{obj.Socket.Endpoint.Address}:{obj.Socket.Endpoint.Port}' connected"); + } + + protected override void StopAction() + { + } + + #region Inboxes + [ExchangeReplier("onetime")] + public long OneTimeHandler(ISocketClient client, OneTimeEvent e) + { + return 0; + } + + [ExchangeReplier("periodic")] + public long PeriodicHandler(ISocketClient client, PeriodicTimeEvent e) + { + return 0; + } + + [ExchangeReplier("eventtrigger")] + public long AfterEventHandler(ISocketClient client, EventAfterEvent e) + { + return 0; + } + + [ExchangeReplier("eventstrigger")] + public long AfterEventsHandler(ISocketClient client, EventAfterEvents e) + { + return 0; + } + #endregion + } +} diff --git a/ZeroLevel.EventServer/Model/BaseEvent.cs b/ZeroLevel.EventServer/Model/BaseEvent.cs new file mode 100644 index 0000000..1ba11bd --- /dev/null +++ b/ZeroLevel.EventServer/Model/BaseEvent.cs @@ -0,0 +1,8 @@ +namespace ZeroLevel.EventServer.Model +{ + public abstract class BaseEvent + { + public string ServiceKey { get; set; } + public string Inbox { get; set; } + } +} diff --git a/ZeroLevel.EventServer/Model/Condition.cs b/ZeroLevel.EventServer/Model/Condition.cs new file mode 100644 index 0000000..0a7f365 --- /dev/null +++ b/ZeroLevel.EventServer/Model/Condition.cs @@ -0,0 +1,23 @@ +namespace ZeroLevel.EventServer.Model +{ + public enum Condition + : int + { + /// + /// В любом случае + /// + None = 0, + /// + /// Если хотя бы одно событие успешно обработано + /// + OneSuccessfull = 1, + /// + /// Если обработаны все события + /// + AllSuccessfull = 2, + /// + /// Если хотя бы одно событие не обработано + /// + AnyFault = 3 + } +} diff --git a/ZeroLevel.EventServer/Model/EventAfterEvent.cs b/ZeroLevel.EventServer/Model/EventAfterEvent.cs new file mode 100644 index 0000000..3df207f --- /dev/null +++ b/ZeroLevel.EventServer/Model/EventAfterEvent.cs @@ -0,0 +1,10 @@ +namespace ZeroLevel.EventServer.Model +{ + public class EventAfterEvent + : BaseEvent + { + public long EventId { get; set; } + + public Condition Confition { get; set; } + } +} diff --git a/ZeroLevel.EventServer/Model/EventAfterEvents.cs b/ZeroLevel.EventServer/Model/EventAfterEvents.cs new file mode 100644 index 0000000..9229d1a --- /dev/null +++ b/ZeroLevel.EventServer/Model/EventAfterEvents.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace ZeroLevel.EventServer.Model +{ + public class EventAfterEvents + : BaseEvent + { + public IEnumerable EventIds { get; set; } + + public Condition Confition { get; set; } + } +} diff --git a/ZeroLevel.EventServer/Model/EventInfoRecord.cs b/ZeroLevel.EventServer/Model/EventInfoRecord.cs new file mode 100644 index 0000000..207e339 --- /dev/null +++ b/ZeroLevel.EventServer/Model/EventInfoRecord.cs @@ -0,0 +1,13 @@ +namespace ZeroLevel.EventServer +{ + public class EventInfoRecord + { + public long EventId { get; set; } + + public string ServiceKey { get; set; } + // OR + public string ServiceEndpoint { get; set; } + + public string Inbox { get; set; } + } +} diff --git a/ZeroLevel.EventServer/Model/EventResult.cs b/ZeroLevel.EventServer/Model/EventResult.cs new file mode 100644 index 0000000..406a0c0 --- /dev/null +++ b/ZeroLevel.EventServer/Model/EventResult.cs @@ -0,0 +1,10 @@ +namespace ZeroLevel.EventServer.Model +{ + public class EventResult + { + public long EventId; + public EventResultState State; + public long StartTimestamp; + public long EndTimestamp; + } +} diff --git a/ZeroLevel.EventServer/Model/EventResultState.cs b/ZeroLevel.EventServer/Model/EventResultState.cs new file mode 100644 index 0000000..7c418b5 --- /dev/null +++ b/ZeroLevel.EventServer/Model/EventResultState.cs @@ -0,0 +1,9 @@ +namespace ZeroLevel.EventServer.Model +{ + public enum EventResultState + { + InProgress, + Success, + Unsuccess + } +} diff --git a/ZeroLevel.EventServer/Model/EventType.cs b/ZeroLevel.EventServer/Model/EventType.cs new file mode 100644 index 0000000..85f2688 --- /dev/null +++ b/ZeroLevel.EventServer/Model/EventType.cs @@ -0,0 +1,11 @@ +namespace ZeroLevel.EventServer.Model +{ + public enum EventType + : int + { + OneType = 0, + Periodic = 1, + EventTrigger = 2, + EventsTrigger = 3 + } +} diff --git a/ZeroLevel.EventServer/Model/OneTimeEvent.cs b/ZeroLevel.EventServer/Model/OneTimeEvent.cs new file mode 100644 index 0000000..590c6b5 --- /dev/null +++ b/ZeroLevel.EventServer/Model/OneTimeEvent.cs @@ -0,0 +1,10 @@ +using System; + +namespace ZeroLevel.EventServer.Model +{ + public class OneTimeEvent + : BaseEvent + { + public TimeSpan Period { get; set; } + } +} diff --git a/ZeroLevel.EventServer/Model/PeriodicTimeEvent.cs b/ZeroLevel.EventServer/Model/PeriodicTimeEvent.cs new file mode 100644 index 0000000..c165591 --- /dev/null +++ b/ZeroLevel.EventServer/Model/PeriodicTimeEvent.cs @@ -0,0 +1,10 @@ +using System; + +namespace ZeroLevel.EventServer.Model +{ + public class PeriodicTimeEvent + : BaseEvent + { + public TimeSpan Period { get; set; } + } +} diff --git a/ZeroLevel.EventServer/Program.cs b/ZeroLevel.EventServer/Program.cs new file mode 100644 index 0000000..62d2c7c --- /dev/null +++ b/ZeroLevel.EventServer/Program.cs @@ -0,0 +1,15 @@ +namespace ZeroLevel.EventServer +{ + class Program + { + static void Main(string[] args) + { + Bootstrap.Startup(args, configuration: () => Configuration.ReadOrEmptySetFromIniFile("config.ini")) + .EnableConsoleLog() + .UseDiscovery() + .Run() + .WaitWhileStatus(ZeroServiceStatus.Running); + Bootstrap.Shutdown(); + } + } +} diff --git a/ZeroLevel.EventServer/ZeroLevel.EventServer.csproj b/ZeroLevel.EventServer/ZeroLevel.EventServer.csproj new file mode 100644 index 0000000..c57316f --- /dev/null +++ b/ZeroLevel.EventServer/ZeroLevel.EventServer.csproj @@ -0,0 +1,23 @@ + + + + Exe + netcoreapp3.1 + + + + + + + + + + + + + + Always + + + + diff --git a/ZeroLevel.EventServer/config.ini b/ZeroLevel.EventServer/config.ini new file mode 100644 index 0000000..7fc2d70 --- /dev/null +++ b/ZeroLevel.EventServer/config.ini @@ -0,0 +1 @@ +discovery=localhost:9030 diff --git a/ZeroLevel.sln b/ZeroLevel.sln index 094539c..8b3c521 100644 --- a/ZeroLevel.sln +++ b/ZeroLevel.sln @@ -39,7 +39,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZeroLevel.Logger", "ZeroLev EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZeroLevel.WPF", "ZeroLevel.WPF\ZeroLevel.WPF.csproj", "{0D70D688-1E21-4E9D-AA49-4D255DF27D8D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZeroLevel.SqLite", "ZeroLevel.SqLite\ZeroLevel.SqLite.csproj", "{5B545DD6-8573-4CDD-B32D-9B0AA2AC2F9A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZeroLevel.SqLite", "ZeroLevel.SqLite\ZeroLevel.SqLite.csproj", "{5B545DD6-8573-4CDD-B32D-9B0AA2AC2F9A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZeroLevel.EventServer", "ZeroLevel.EventServer\ZeroLevel.EventServer.csproj", "{F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -255,6 +257,18 @@ Global {5B545DD6-8573-4CDD-B32D-9B0AA2AC2F9A}.Release|x64.Build.0 = Release|Any CPU {5B545DD6-8573-4CDD-B32D-9B0AA2AC2F9A}.Release|x86.ActiveCfg = Release|Any CPU {5B545DD6-8573-4CDD-B32D-9B0AA2AC2F9A}.Release|x86.Build.0 = Release|Any CPU + {F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}.Debug|x64.ActiveCfg = Debug|Any CPU + {F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}.Debug|x64.Build.0 = Debug|Any CPU + {F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}.Debug|x86.ActiveCfg = Debug|Any CPU + {F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}.Debug|x86.Build.0 = Debug|Any CPU + {F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}.Release|Any CPU.Build.0 = Release|Any CPU + {F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}.Release|x64.ActiveCfg = Release|Any CPU + {F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}.Release|x64.Build.0 = Release|Any CPU + {F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}.Release|x86.ActiveCfg = Release|Any CPU + {F8116106-48FD-4F1B-A1D2-63FE81DAFD8E}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ZeroLevel/Services/BaseZeroService.cs b/ZeroLevel/Services/BaseZeroService.cs index fdb99bd..281b599 100644 --- a/ZeroLevel/Services/BaseZeroService.cs +++ b/ZeroLevel/Services/BaseZeroService.cs @@ -133,34 +133,37 @@ namespace ZeroLevel.Services.Applications #region Network - public void UseDiscovery() + public bool UseDiscovery() { if (_state == ZeroServiceStatus.Running || _state == ZeroServiceStatus.Initialized) { ReadServiceInfo(); - _exhange.UseDiscovery(); + return _exhange.UseDiscovery(); } + return false; } - public void UseDiscovery(string endpoint) + public bool UseDiscovery(string endpoint) { if (_state == ZeroServiceStatus.Running || _state == ZeroServiceStatus.Initialized) { ReadServiceInfo(); - _exhange.UseDiscovery(endpoint); + return _exhange.UseDiscovery(endpoint); } + return false; } - public void UseDiscovery(IPEndPoint endpoint) + public bool UseDiscovery(IPEndPoint endpoint) { if (_state == ZeroServiceStatus.Running || _state == ZeroServiceStatus.Initialized) { ReadServiceInfo(); - _exhange.UseDiscovery(endpoint); + return _exhange.UseDiscovery(endpoint); } + return false; } public IRouter UseHost() diff --git a/ZeroLevel/Services/Config/Configuration.cs b/ZeroLevel/Services/Config/Configuration.cs index 0f10be4..37fe605 100644 --- a/ZeroLevel/Services/Config/Configuration.cs +++ b/ZeroLevel/Services/Config/Configuration.cs @@ -2,8 +2,6 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Reflection; using ZeroLevel.Services.Config; using ZeroLevel.Services.Config.Implementation; using ZeroLevel.Services.Reflection; @@ -137,52 +135,257 @@ namespace ZeroLevel /// Creating a configuration from the AppSettings section of the app.config or web.config file /// /// Configuration - public static IConfiguration ReadFromApplicationConfig() { return new ApplicationConfigReader().ReadConfiguration(); } + public static IConfiguration ReadFromApplicationConfig() + { + try + { + return new ApplicationConfigReader().ReadConfiguration(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadFromApplicationConfig] Can't read app.config file"); + throw; + } + } + public static IConfiguration ReadOrEmptyFromApplicationConfig() + { + try + { + return new ApplicationConfigReader().ReadConfiguration(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadOrEmptyFromApplicationConfig] Can't read app.config file"); + } + return _empty; + } /// /// Creating a configuration from the AppSettings section of the app.config file or web.config, is supplemented by the 'ConnectionStrings' section /// /// Configuration - public static IConfigurationSet ReadSetFromApplicationConfig() { return new ApplicationConfigReader().ReadConfigurationSet(); } + public static IConfigurationSet ReadSetFromApplicationConfig() + { + try + { + return new ApplicationConfigReader().ReadConfigurationSet(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadSetFromApplicationConfig] Can't read app.config file"); + throw; + } + } + public static IConfigurationSet ReadOrEmptySetFromApplicationConfig() + { + try + { + return new ApplicationConfigReader().ReadConfigurationSet(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadOrEmptySetFromApplicationConfig] Can't read app.config file"); + } + return _emptySet; + } /// /// Creating a configuration from the AppSettings section of the app.config or web.config file /// /// Configuration - public static IConfiguration ReadFromApplicationConfig(string configFilePath) { return new ApplicationConfigReader(configFilePath).ReadConfiguration(); } + public static IConfiguration ReadFromApplicationConfig(string configFilePath) + { + try + { + return new ApplicationConfigReader(configFilePath).ReadConfiguration(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadFromApplicationConfig] Can't read config file '{configFilePath}'"); + throw; + } + } + public static IConfiguration ReadOrEmptyFromApplicationConfig(string configFilePath) + { + try + { + return new ApplicationConfigReader(configFilePath).ReadConfiguration(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadOrEmptyFromApplicationConfig] Can't read config file '{configFilePath}'"); + } + return _empty; + } /// /// Creating a configuration from the AppSettings section of the app.config file or web.config, is supplemented by the 'ConnectionStrings' section /// /// Configuration - public static IConfigurationSet ReadSetFromApplicationConfig(string configFilePath) { return new ApplicationConfigReader(configFilePath).ReadConfigurationSet(); } + public static IConfigurationSet ReadSetFromApplicationConfig(string configFilePath) + { + try + { + return new ApplicationConfigReader(configFilePath).ReadConfigurationSet(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadSetFromApplicationConfig] Can't read config file '{configFilePath}'"); + throw; + } + } + public static IConfigurationSet ReadOrEmptySetFromApplicationConfig(string configFilePath) + { + try + { + return new ApplicationConfigReader(configFilePath).ReadConfigurationSet(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadOrEmptySetFromApplicationConfig] Can't read config file '{configFilePath}'"); + } + return _emptySet; + } /// /// Create configuration from ini file /// /// Path to the ini file /// Configuration - public static IConfiguration ReadFromIniFile(string path) { return new IniFileReader(path).ReadConfiguration(); } + public static IConfiguration ReadFromIniFile(string path) + { + try + { + return new IniFileReader(path).ReadConfiguration(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadFromIniFile] Can't read config file '{path}'"); + throw; + } + } + public static IConfiguration ReadOrEmptyFromIniFile(string path) + { + try + { + return new IniFileReader(path).ReadConfiguration(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadOrEmptyFromIniFile] Can't read config file '{path}'"); + } + return _empty; + } /// /// Creating a configuration from an ini file, including sections /// /// Path to the ini file /// Configuration - public static IConfigurationSet ReadSetFromIniFile(string path) { return new IniFileReader(path).ReadConfigurationSet(); } + public static IConfigurationSet ReadSetFromIniFile(string path) + { + try + { + return new IniFileReader(path).ReadConfigurationSet(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadSetFromIniFile] Can't read config file '{path}'"); + throw; + } + } + public static IConfigurationSet ReadOrEmptySetFromIniFile(string path) + { + try + { + return new IniFileReader(path).ReadConfigurationSet(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadOrEmptySetFromIniFile] Can't read config file '{path}'"); + } + return _emptySet; + } /// /// Creating configuration from command line parameters /// /// Command line parameters /// Configuration - public static IConfiguration ReadFromCommandLine(string[] args) { return new CommandLineReader(args).ReadConfiguration(); } + public static IConfiguration ReadFromCommandLine(string[] args) + { + try + { + return new CommandLineReader(args).ReadConfiguration(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadFromCommandLine] Can't read command line args"); + throw; + } + } + public static IConfiguration ReadOrEmptyFromCommandLine(string[] args) + { + try + { + return new CommandLineReader(args).ReadConfiguration(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadOrEmptyFromCommandLine] Can't read command line args"); + } + return _empty; + } - public static IConfigurationSet ReadBinary(IBinaryReader reader) + public static IConfiguration ReadFromBinaryReader(IBinaryReader reader) { - return reader.Read(); + try + { + return reader.Read(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadFromBinaryReader] Can't read config from binaryReader"); + throw; + } + } + public static IConfiguration ReadOrEmptyFromBinaryReader(IBinaryReader reader) + { + try + { + return reader.Read(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadOrEmptyFromBinaryReader] Can't read config from binaryReader"); + } + return _empty; } + public static IConfigurationSet ReadSetFromBinaryReader(IBinaryReader reader) + { + try + { + return reader.Read(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadSetFromBinaryReader] Can't read config from binaryReader"); + throw; + } + } + public static IConfigurationSet ReadSetOrEmptyFromBinaryReader(IBinaryReader reader) + { + try + { + return reader.Read(); + } + catch (Exception ex) + { + Log.Error(ex, $"[Configuration.ReadSetOrEmptyFromBinaryReader] Can't read config from binaryReader"); + } + return _emptySet; + } #endregion Read configuration #region Write configuration diff --git a/ZeroLevel/Services/IZeroService.cs b/ZeroLevel/Services/IZeroService.cs index 34b3fcb..6373e71 100644 --- a/ZeroLevel/Services/IZeroService.cs +++ b/ZeroLevel/Services/IZeroService.cs @@ -15,10 +15,10 @@ namespace ZeroLevel ZeroServiceInfo ServiceInfo { get; } - void UseDiscovery(); - void UseDiscovery(string url); - void UseDiscovery(IPEndPoint endpoint); - + bool UseDiscovery(); + bool UseDiscovery(string url); + bool UseDiscovery(IPEndPoint endpoint); + IRouter UseHost(); IRouter UseHost(int port); IRouter UseHost(IPEndPoint endpoint); diff --git a/ZeroLevel/Services/Network/Contracts/IExchange.cs b/ZeroLevel/Services/Network/Contracts/IExchange.cs index 1480c9d..440885b 100644 --- a/ZeroLevel/Services/Network/Contracts/IExchange.cs +++ b/ZeroLevel/Services/Network/Contracts/IExchange.cs @@ -6,9 +6,9 @@ namespace ZeroLevel.Network public interface IExchange : IClientSet, IDisposable { - void UseDiscovery(); - void UseDiscovery(string endpoint); - void UseDiscovery(IPEndPoint endpoint); + bool UseDiscovery(); + bool UseDiscovery(string endpoint); + bool UseDiscovery(IPEndPoint endpoint); IRouter UseHost(); IRouter UseHost(int port); diff --git a/ZeroLevel/Services/Network/Exchange.cs b/ZeroLevel/Services/Network/Exchange.cs index f9a24c7..ccef053 100644 --- a/ZeroLevel/Services/Network/Exchange.cs +++ b/ZeroLevel/Services/Network/Exchange.cs @@ -431,45 +431,31 @@ namespace ZeroLevel.Network private static TimeSpan _update_discovery_table_period = TimeSpan.FromSeconds(15); private static TimeSpan _register_in_discovery_table_period = TimeSpan.FromSeconds(15); - public void UseDiscovery() + private bool _UseDiscovery(Func epf) { + if (epf == null) return false; try { - var discoveryEndpoint = Configuration.Default.First("discovery"); - _user_aliases.Set(BaseSocket.DISCOVERY_ALIAS, NetUtils.CreateIPEndPoint(discoveryEndpoint)); + var ep = epf.Invoke(); + _user_aliases.Set(BaseSocket.DISCOVERY_ALIAS, ep); RestartDiscoveryTasks(); + return true; } catch (Exception ex) { - Log.Error(ex, "[Exchange.UseDiscovery]"); + Log.Error(ex, $"[Exchange.UseDiscovery]"); } + return false; } - public void UseDiscovery(string discoveryEndpoint) - { - try - { - _user_aliases.Set(BaseSocket.DISCOVERY_ALIAS, NetUtils.CreateIPEndPoint(discoveryEndpoint)); - RestartDiscoveryTasks(); - } - catch (Exception ex) - { - Log.Error(ex, "[Exchange.UseDiscovery]"); - } - } + public bool UseDiscovery() => + _UseDiscovery(() => NetUtils.CreateIPEndPoint(Configuration.Default.First("discovery"))); - public void UseDiscovery(IPEndPoint discoveryEndpoint) - { - try - { - _user_aliases.Set(BaseSocket.DISCOVERY_ALIAS, discoveryEndpoint); - RestartDiscoveryTasks(); - } - catch (Exception ex) - { - Log.Error(ex, "[Exchange.UseDiscovery]"); - } - } + public bool UseDiscovery(string discoveryEndpoint) => + _UseDiscovery(() => NetUtils.CreateIPEndPoint(discoveryEndpoint)); + + public bool UseDiscovery(IPEndPoint discoveryEndpoint) => + _UseDiscovery(() => discoveryEndpoint); private void RestartDiscoveryTasks() {