ntminer 6 years ago
parent
commit
0d4059400f

+ 2 - 2
src/AppModels/Vms/ServerMessagesViewModel.cs

@@ -40,10 +40,10 @@ namespace NTMiner.Vms {
             });
             this.Clear = new DelegateCommand(() => {
                 this.ShowDialog(new DialogWindowViewModel(message: "确定清空吗?", title: "确认", onYes: () => {
-                    VirtualRoot.LocalServerMessageSet.Clear();
+                    VirtualRoot.Execute(new ClearServerMessages());
                 }));
             });
-            VirtualRoot.BuildEventPath<ServerMessageClearedEvent>("清空了本地存储的服务器消息后刷新Vm内存", LogEnum.DevConsole,
+            VirtualRoot.BuildEventPath<ServerMessagesClearedEvent>("清空了本地存储的服务器消息后刷新Vm内存", LogEnum.DevConsole,
                 action: message => {
                     bool needInitQueryResuts = _queyResults != _serverMessageVms;
                     Init();

+ 1 - 2
src/NTMinerRpcClient/OfficialServer.partials.ServerMessageServiceFace.cs

@@ -16,13 +16,12 @@ namespace NTMiner {
                     GetServerMessagesAsync(LocalServerMessageSetTimestamp, (response, e) => {
                         if (response.IsSuccess() && response.Data.Count > 0) {
                             DateTime dateTime = LocalServerMessageSetTimestamp;
-                            LinkedList<IServerMessage> data = new LinkedList<IServerMessage>();
+                            LinkedList<ServerMessageData> data = new LinkedList<ServerMessageData>();
                             foreach (var item in response.Data.OrderBy(a => a.Timestamp)) {
                                 if (item.Timestamp > dateTime) {
                                     LocalServerMessageSetTimestamp = item.Timestamp;
                                 }
                                 data.AddLast(item);
-                                VirtualRoot.LocalServerMessageSet.AddOrUpdate(item);
                             }
                             VirtualRoot.RaiseEvent(new NewServerMessageLoadedEvent(data));
                         }

+ 8 - 2
src/NTMinerServices/Controllers/ServerMessageController.cs

@@ -24,7 +24,13 @@ namespace NTMiner.Controllers {
                 if (!request.IsValid(User, Sign, Timestamp, ClientIp, out ResponseBase response)) {
                     return response;
                 }
-                HostRoot.Instance.ServerMessageSet.AddOrUpdate(request.Data);
+                var entity = HostRoot.Instance.ServerMessageSet.FirstOrDefault(a => a.Id == request.Data.Id);
+                if (entity != null) {
+                    VirtualRoot.Execute(new UpdateServerMessageCommand(request.Data));
+                }
+                else {
+                    VirtualRoot.Execute(new AddServerMessageCommand(request.Data));
+                }
                 return ResponseBase.Ok();
             }
             catch (Exception e) {
@@ -41,7 +47,7 @@ namespace NTMiner.Controllers {
                 if (!request.IsValid(User, Sign, Timestamp, ClientIp, out ResponseBase response)) {
                     return response;
                 }
-                HostRoot.Instance.ServerMessageSet.Remove(request.Data);
+                VirtualRoot.Execute(new MarkDeleteServerMessageCommand(request.Data));
                 return ResponseBase.Ok();
             }
             catch (Exception e) {

+ 1 - 1
src/NTMinerServices/HostRoot.cs

@@ -146,7 +146,7 @@ namespace NTMiner {
             this.NTMinerFileSet = new NTMinerFileSet(this);
             this.OverClockDataSet = new OverClockDataSet(this);
             this.KernelOutputKeywordSet = new LocalKernelOutputKeywordSet(SpecialPath.LocalDbFileFullName);
-            this.ServerMessageSet = new LocalServerMessageSet(SpecialPath.LocalDbFileFullName);
+            this.ServerMessageSet = new ServerMessageSet(SpecialPath.LocalDbFileFullName, isServer: true);
         }
 
         public IUserSet UserSet { get; private set; }

+ 10 - 12
src/NTMinerlib/Messages.cs

@@ -138,6 +138,7 @@ namespace NTMiner {
     }
     #endregion
 
+    #region LocalMessage
     [MessageType(description: "记录了本地事件后")]
     public class LocalMessageAddedEvent : DomainEvent<ILocalMessage> {
         public LocalMessageAddedEvent(ILocalMessage source, List<ILocalMessage> removes) : base(source) {
@@ -151,22 +152,19 @@ namespace NTMiner {
     public class LocalMessageClearedEvent : EventBase {
         public LocalMessageClearedEvent() { }
     }
+    #endregion
 
-    [MessageType(description: "记录了服务器事件后")]
-    public class ServerMessageAddedEvent : DomainEvent<IServerMessage> {
-        public ServerMessageAddedEvent(IServerMessage source, List<IServerMessage> removes) : base(source) {
-            this.Removes = removes ?? new List<IServerMessage>();
-        }
-
-        public List<IServerMessage> Removes { get; private set; }
+    #region ServerMessage
+    [MessageType(description: "清空服务器消息集")]
+    public class ClearServerMessages : Cmd {
+        public ClearServerMessages() { }
     }
 
     [MessageType(description: "服务器消息集清空后")]
-    public class ServerMessageClearedEvent : EventBase {
-        public ServerMessageClearedEvent() { }
+    public class ServerMessagesClearedEvent : EventBase {
+        public ServerMessagesClearedEvent() { }
     }
 
-    #region ServerMessage
     [MessageType(description: "从服务器获取新的服务器消息")]
     public class LoadNewServerMessageCommand : Cmd {
         public LoadNewServerMessageCommand() { }
@@ -174,11 +172,11 @@ namespace NTMiner {
 
     [MessageType(description: "从服务器获取到新的服务器消息后")]
     public class NewServerMessageLoadedEvent : EventBase {
-        public NewServerMessageLoadedEvent(LinkedList<IServerMessage> data) {
+        public NewServerMessageLoadedEvent(LinkedList<ServerMessageData> data) {
             this.Data = data;
         }
 
-        public LinkedList<IServerMessage> Data { get; }
+        public LinkedList<ServerMessageData> Data { get; }
     }
 
     [MessageType(description: "添加服务器消息")]

+ 1 - 1
src/NTMinerlib/NTMinerlib.csproj

@@ -49,7 +49,7 @@
     <Compile Include="NTKeyword.cs" />
     <Compile Include="OutEnum.cs" />
     <Compile Include="ServerMessage\IServerMessageSet.cs" />
-    <Compile Include="ServerMessage\LocalServerMessageSet.cs" />
+    <Compile Include="ServerMessage\ServerMessageSet.cs" />
     <Compile Include="Ip\ILocalIpSet.cs" />
     <Compile Include="Ip\Impl\LocalIpSet.cs" />
     <Compile Include="Ip\Util.cs" />

+ 0 - 4
src/NTMinerlib/ServerMessage/IServerMessageSet.cs

@@ -4,10 +4,6 @@ using System.Collections.Generic;
 
 namespace NTMiner.ServerMessage {
     public interface IServerMessageSet : IEnumerable<IServerMessage> {
-        void Add(string provider, string messageType, string content);
-        void AddOrUpdate(IServerMessage entity);
-        void Remove(Guid id);
         List<IServerMessage> GetServerMessages(DateTime timeStamp);
-        void Clear();
     }
 }

+ 0 - 179
src/NTMinerlib/ServerMessage/LocalServerMessageSet.cs

@@ -1,179 +0,0 @@
-using LiteDB;
-using NTMiner.MinerServer;
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace NTMiner.ServerMessage {
-    public class LocalServerMessageSet : IServerMessageSet {
-        private readonly string _connectionString;
-        private readonly LinkedList<ServerMessageData> _records = new LinkedList<ServerMessageData>();
-
-        public LocalServerMessageSet(string dbFileFullName) {
-            if (!string.IsNullOrEmpty(dbFileFullName)) {
-                _connectionString = $"filename={dbFileFullName};journal=false";
-            }
-            VirtualRoot.BuildCmdPath<AddServerMessageCommand>(action: message => {
-
-                VirtualRoot.Execute(new LoadNewServerMessageCommand());
-            });
-            VirtualRoot.BuildCmdPath<UpdateServerMessageCommand>(action: message => {
-
-                VirtualRoot.Execute(new LoadNewServerMessageCommand());
-            });
-            VirtualRoot.BuildCmdPath<MarkDeleteServerMessageCommand>(action: message => {
-
-                VirtualRoot.Execute(new LoadNewServerMessageCommand());
-            });
-        }
-
-        public List<IServerMessage> GetServerMessages(DateTime timeStamp) {
-            if (string.IsNullOrEmpty(_connectionString)) {
-                return new List<IServerMessage>();
-            }
-            InitOnece();
-            return _records.Where(a => a.Timestamp >= timeStamp).Cast<IServerMessage>().ToList();
-        }
-
-        public void Add(string provider, string messageType, string content) {
-            InitOnece();
-            Add(Guid.Empty, provider, messageType, content, DateTime.MinValue);
-        }
-
-        private void Add(Guid id, string provider, string messageType, string content, DateTime timestamp) {
-            if (string.IsNullOrEmpty(_connectionString)) {
-                return;
-            }
-            InitOnece();
-            var data = new ServerMessageData {
-                Id = id == Guid.Empty ? Guid.NewGuid() : id,
-                Provider = provider,
-                MessageType = messageType,
-                Content = content,
-                Timestamp = timestamp == DateTime.MinValue ? DateTime.Now : timestamp
-            };
-            // TODO:批量持久化,异步持久化
-            List<IServerMessage> removes = new List<IServerMessage>();
-            lock (_locker) {
-                _records.AddFirst(data);
-                while (_records.Count > NTKeyword.ServerMessageSetCapacity) {
-                    var toRemove = _records.Last;
-                    removes.Add(toRemove.Value);
-                    _records.RemoveLast();
-                    using (LiteDatabase db = new LiteDatabase(_connectionString)) {
-                        var col = db.GetCollection<ServerMessageData>();
-                        col.Delete(toRemove.Value.Id);
-                    }
-                }
-            }
-            using (LiteDatabase db = new LiteDatabase(_connectionString)) {
-                var col = db.GetCollection<ServerMessageData>();
-                col.Insert(data);
-            }
-            VirtualRoot.RaiseEvent(new ServerMessageAddedEvent(data, removes));
-        }
-
-        public void AddOrUpdate(IServerMessage entity) {
-            if (string.IsNullOrEmpty(_connectionString)) {
-                return;
-            }
-            InitOnece();
-            if (entity.Id == Guid.Empty) {
-                Add(entity.Id, entity.Provider, entity.MessageType, entity.Content, entity.Timestamp);
-                return;
-            }
-            ServerMessageData exist;
-            lock (_locker) {
-                exist = _records.FirstOrDefault(a => a.Id == entity.Id);
-                if (exist != null) {
-                    exist.Update(entity);
-                }
-            }
-            if (exist != null) {
-                using (LiteDatabase db = new LiteDatabase(_connectionString)) {
-                    var col = db.GetCollection<ServerMessageData>();
-                    col.Upsert(exist);
-                }
-            }
-            else {
-                Add(entity.Id, entity.Provider, entity.MessageType, entity.Content, entity.Timestamp);
-            }
-        }
-
-        public void Remove(Guid id) {
-            if (string.IsNullOrEmpty(_connectionString)) {
-                return;
-            }
-            InitOnece();
-            ServerMessageData exist = null;
-            lock (_locker) {
-                exist = _records.FirstOrDefault(a => a.Id == id);
-                if (exist != null) {
-                    _records.Remove(exist);
-                }
-            }
-            if (exist != null) {
-                using (LiteDatabase db = new LiteDatabase(_connectionString)) {
-                    var col = db.GetCollection<ServerMessageData>();
-                    col.Delete(id);
-                }
-            }
-        }
-
-        public void Clear() {
-            if (string.IsNullOrEmpty(_connectionString)) {
-                return;
-            }
-            using (LiteDatabase db = new LiteDatabase(_connectionString)) {
-                lock (_locker) {
-                    _records.Clear();
-                }
-                db.DropCollection(nameof(ServerMessageData));
-            }
-            VirtualRoot.RaiseEvent(new ServerMessageClearedEvent());
-        }
-
-        private bool _isInited = false;
-        private readonly object _locker = new object();
-
-        private void InitOnece() {
-            if (_isInited) {
-                return;
-            }
-            Init();
-        }
-
-        private void Init() {
-            lock (_locker) {
-                if (!_isInited) {
-                    if (string.IsNullOrEmpty(_connectionString)) {
-                        return;
-                    }
-                    using (LiteDatabase db = new LiteDatabase(_connectionString)) {
-                        var col = db.GetCollection<ServerMessageData>();
-                        foreach (var item in col.FindAll().OrderBy(a => a.Timestamp)) {
-                            if (_records.Count < NTKeyword.ServerMessageSetCapacity) {
-                                _records.AddFirst(item);
-                            }
-                            else {
-                                col.Delete(_records.Last.Value.Id);
-                            }
-                        }
-                    }
-                    _isInited = true;
-                }
-            }
-        }
-
-        public IEnumerator<IServerMessage> GetEnumerator() {
-            InitOnece();
-            return _records.GetEnumerator();
-        }
-
-        IEnumerator IEnumerable.GetEnumerator() {
-            InitOnece();
-            return _records.GetEnumerator();
-        }
-    }
-}

+ 182 - 0
src/NTMinerlib/ServerMessage/ServerMessageSet.cs

@@ -0,0 +1,182 @@
+using LiteDB;
+using NTMiner.MinerServer;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace NTMiner.ServerMessage {
+    public class ServerMessageSet : IServerMessageSet {
+        private readonly string _connectionString;
+        private readonly LinkedList<ServerMessageData> _records = new LinkedList<ServerMessageData>();
+
+        private readonly bool _isServer;
+        public ServerMessageSet(string dbFileFullName, bool isServer) {
+            if (!string.IsNullOrEmpty(dbFileFullName)) {
+                _connectionString = $"filename={dbFileFullName};journal=false";
+            }
+            _isServer = isServer;
+            if (!_isServer) {
+                VirtualRoot.BuildEventPath<NewServerMessageLoadedEvent>("加载到新服务器消息后叠入服务器消息栈内存", LogEnum.DevConsole,
+                    action: message => {
+                        foreach (var item in message.Data) {
+                            _records.AddFirst(item);
+                        }
+                    });
+            }
+            VirtualRoot.BuildCmdPath<AddServerMessageCommand>(action: message => {
+                if (string.IsNullOrEmpty(_connectionString)) {
+                    return;
+                }
+                InitOnece();
+                var data = new ServerMessageData {
+                    Id = message.Input.Id == Guid.Empty ? Guid.NewGuid() : message.Input.Id,
+                    Provider = message.Input.Provider,
+                    MessageType = message.Input.MessageType,
+                    Content = message.Input.Content,
+                    Timestamp = message.Input.Timestamp == DateTime.MinValue ? DateTime.Now : message.Input.Timestamp,
+                    IsDeleted = false
+                };
+                if (_isServer) {
+                    // TODO:批量持久化,异步持久化
+                    lock (_locker) {
+                        _records.AddFirst(data);
+                        while (_records.Count > NTKeyword.ServerMessageSetCapacity) {
+                            var toRemove = _records.Last;
+                            _records.RemoveLast();
+                            using (LiteDatabase db = new LiteDatabase(_connectionString)) {
+                                var col = db.GetCollection<ServerMessageData>();
+                                col.Delete(toRemove.Value.Id);
+                            }
+                        }
+                    }
+                    using (LiteDatabase db = new LiteDatabase(_connectionString)) {
+                        var col = db.GetCollection<ServerMessageData>();
+                        col.Insert(data);
+                    }
+                }
+                else {
+
+                    VirtualRoot.Execute(new LoadNewServerMessageCommand());
+                }
+            });
+            VirtualRoot.BuildCmdPath<UpdateServerMessageCommand>(action: message => {
+                if (string.IsNullOrEmpty(_connectionString)) {
+                    return;
+                }
+                InitOnece();
+                if (_isServer) {
+                    ServerMessageData exist;
+                    lock (_locker) {
+                        exist = _records.FirstOrDefault(a => a.Id == message.Input.Id);
+                        if (exist != null) {
+                            exist.Update(message.Input);
+                        }
+                    }
+                    if (exist != null) {
+                        using (LiteDatabase db = new LiteDatabase(_connectionString)) {
+                            var col = db.GetCollection<ServerMessageData>();
+                            col.Upsert(exist);
+                        }
+                    }
+                }
+                else {
+
+                    VirtualRoot.Execute(new LoadNewServerMessageCommand());
+                }
+            });
+            VirtualRoot.BuildCmdPath<MarkDeleteServerMessageCommand>(action: message => {
+                if (string.IsNullOrEmpty(_connectionString)) {
+                    return;
+                }
+                InitOnece();
+                if (_isServer) {
+                    ServerMessageData exist = null;
+                    lock (_locker) {
+                        exist = _records.FirstOrDefault(a => a.Id == message.EntityId);
+                        if (exist != null) {
+                            _records.Remove(exist);
+                        }
+                    }
+                    if (exist != null) {
+                        using (LiteDatabase db = new LiteDatabase(_connectionString)) {
+                            var col = db.GetCollection<ServerMessageData>();
+                            col.Delete(message.EntityId);
+                        }
+                    }
+                }
+                else {
+
+                    VirtualRoot.Execute(new LoadNewServerMessageCommand());
+                }
+            });
+            VirtualRoot.BuildCmdPath<ClearServerMessages>(action: message => {
+                if (string.IsNullOrEmpty(_connectionString)) {
+                    return;
+                }
+                InitOnece();
+                // 服务端不应有清空消息的功能
+                if (_isServer) {
+                    return;
+                }
+                using (LiteDatabase db = new LiteDatabase(_connectionString)) {
+                    lock (_locker) {
+                        _records.Clear();
+                    }
+                    db.DropCollection(nameof(ServerMessageData));
+                }
+                VirtualRoot.RaiseEvent(new ServerMessagesClearedEvent());
+            });
+        }
+
+        public List<IServerMessage> GetServerMessages(DateTime timeStamp) {
+            if (string.IsNullOrEmpty(_connectionString)) {
+                return new List<IServerMessage>();
+            }
+            InitOnece();
+            return _records.Where(a => a.Timestamp >= timeStamp).Cast<IServerMessage>().ToList();
+        }
+
+        private bool _isInited = false;
+        private readonly object _locker = new object();
+
+        private void InitOnece() {
+            if (_isInited) {
+                return;
+            }
+            Init();
+        }
+
+        private void Init() {
+            lock (_locker) {
+                if (!_isInited) {
+                    if (string.IsNullOrEmpty(_connectionString)) {
+                        return;
+                    }
+                    using (LiteDatabase db = new LiteDatabase(_connectionString)) {
+                        var col = db.GetCollection<ServerMessageData>();
+                        foreach (var item in col.FindAll().OrderBy(a => a.Timestamp)) {
+                            if (_records.Count < NTKeyword.ServerMessageSetCapacity) {
+                                _records.AddFirst(item);
+                            }
+                            else {
+                                col.Delete(_records.Last.Value.Id);
+                            }
+                        }
+                    }
+                    _isInited = true;
+                }
+            }
+        }
+
+        public IEnumerator<IServerMessage> GetEnumerator() {
+            InitOnece();
+            return _records.GetEnumerator();
+        }
+
+        IEnumerator IEnumerable.GetEnumerator() {
+            InitOnece();
+            return _records.GetEnumerator();
+        }
+    }
+}

+ 1 - 1
src/NTMinerlib/VirtualRoot.cs

@@ -156,7 +156,7 @@ namespace NTMiner {
             SCommandBus = new DirectCommandBus(SMessageDispatcher);
             SEventBus = new DirectEventBus(SMessageDispatcher);
             LocalMessages = new LocalMessageSet(LocalMessageDbFileFullName);
-            LocalServerMessageSet = new LocalServerMessageSet(LocalMessageDbFileFullName);
+            LocalServerMessageSet = new ServerMessageSet(LocalMessageDbFileFullName, isServer: false);
         }
 
         private static IAppSettingSet _appSettingSet;