Runner.cs 10.5 KB
Newer Older
cdy816's avatar
cdy816 已提交
1 2 3 4 5 6 7 8
//==============================================================
//  Copyright (C) 2019  Inc. All rights reserved.
//
//==============================================================
//  Create by 种道洋 at 2019/12/27 18:45:02.
//  Version 1.0
//  种道洋
//==============================================================
9
using Cdy.Tag.Driver;
cdy816's avatar
cdy816 已提交
10
using System;
cdy816's avatar
cdy816 已提交
11
using System.Collections.Generic;
12 13
using System.Diagnostics;
using System.Linq;
cdy816's avatar
cdy816 已提交
14
using System.Text;
15
using System.Threading.Tasks;
cdy816's avatar
cdy816 已提交
16 17 18 19 20 21 22 23 24 25 26

namespace Cdy.Tag
{
    /// <summary>
    /// 
    /// </summary>
    public class Runner
    {

        #region ... Variables  ...

cdy816's avatar
cdy816 已提交
27 28 29 30 31
        public static string CurrentDatabase = "";

        public static string CurrentDatabaseVersion = "";

        public static string CurrentDatabaseLastUpdateTime = "";
32

33 34 35 36 37 38 39 40
        /// <summary>
        /// 
        /// </summary>
        public static Runner RunInstance = new Runner();

        /// <summary>
        /// 
        /// </summary>
cdy816's avatar
cdy816 已提交
41
        private string mDatabaseName = "local";
42 43 44

        private Database mDatabase;

cdy816's avatar
cdy816 已提交
45 46
        private RealDatabase mRealDatabase;

47 48 49 50
        private HisDatabase mHisDatabase;

        private RealEnginer realEnginer;

51
        private HisEnginer2 hisEnginer;
52

53
        private CompressEnginer2 compressEnginer;
54

55
        private SeriseEnginer2 seriseEnginer;
56 57 58 59 60

        private DataFileManager mHisFileManager;

        private QuerySerivce querySerivce;

61 62
        private SecurityRunner mSecurityRunner;

63 64
        private bool mIsStarted = false;

cdy816's avatar
cdy816 已提交
65 66 67 68 69 70 71 72
        #endregion ...Variables...

        #region ... Events     ...

        #endregion ...Events...

        #region ... Constructor...

cdy816's avatar
cdy816 已提交
73 74 75 76 77 78 79
        /// <summary>
        /// 
        /// </summary>
        static Runner()
        {
            //注册日志
            ServiceLocator.Locator.Registor<ILog>(new ConsoleLogger());
80 81 82

            //注册线性转换器
            ValueConvertManager.manager.Registor(new LinerConvert());
cdy816's avatar
cdy816 已提交
83 84
        }

cdy816's avatar
cdy816 已提交
85 86 87 88
        #endregion ...Constructor...

        #region ... Properties ...

89 90 91 92 93
        /// <summary>
        /// 数据库存访路径
        /// </summary>
        public string DatabasePath { get; set; }

cdy816's avatar
cdy816 已提交
94 95 96 97 98
        /// <summary>
        /// 
        /// </summary>
        public Database Database { get { return mDatabase; } }

99 100 101 102 103 104 105 106 107 108 109
        /// <summary>
        /// 
        /// </summary>
        public bool IsStarted
        {
            get
            {
                return mIsStarted;
            }
        }

cdy816's avatar
cdy816 已提交
110 111 112 113 114
        #endregion ...Properties...

        #region ... Methods    ...

        /// <summary>
115 116 117 118 119 120 121
        /// 
        /// </summary>
        private void InitPath()
        {
            PathHelper.helper.CheckDataPathExist();
        }
        
cdy816's avatar
cdy816 已提交
122 123 124 125 126 127 128 129 130 131
        /// <summary>
        /// 
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private bool CheckDatabaseExist(string name)
        {
            return System.IO.File.Exists(PathHelper.helper.GetDataPath(name, name + ".db"));
        }

132 133 134
        /// <summary>
        /// 
        /// </summary>
cdy816's avatar
cdy816 已提交
135
        private void LoadDatabase()
136
        {
137 138
            Stopwatch sw = new Stopwatch();
            sw.Start();
cdy816's avatar
cdy816 已提交
139 140 141
            this.mDatabase = new DatabaseSerise().Load(mDatabaseName);
            this.mRealDatabase = this.mDatabase.RealDatabase;
            this.mHisDatabase = this.mDatabase.HisDatabase;
cdy816's avatar
cdy816 已提交
142 143 144
            CurrentDatabaseVersion = this.mRealDatabase.Version;
            CurrentDatabase = mRealDatabase.Name;
            CurrentDatabaseLastUpdateTime = mRealDatabase.UpdateTime;
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
            sw.Stop();
            LoggerService.Service.Info("LoadDatabase", "load " +mDatabaseName +" take " + sw.ElapsedMilliseconds.ToString() +" ms");
        }

        /// <summary>
        /// 重新加载数据库
        /// </summary>
        public void ReStartDatabase()
        {

            LoggerService.Service.Info("ReStartDatabase", "start to restart database.",ConsoleColor.DarkYellow);

            Stopwatch sw = new Stopwatch();
            sw.Start();

            var db = new DatabaseSerise().Load(mDatabaseName);
            List<Tagbase> ltmp = new List<Tagbase>();
            List<HisTag> htmp = new List<HisTag>();
            foreach(var vv in db.RealDatabase.Tags.Where(e=>this.mRealDatabase.Tags.ContainsKey(e.Key)))
            {
                ltmp.Add(vv.Value);
            }

            foreach(var vv in ltmp)
            {
                if(db.HisDatabase.HisTags.ContainsKey(vv.Id))
                {
                    htmp.Add(db.HisDatabase.HisTags[vv.Id]);
                }
            }

            LoggerService.Service.Info("ReStartDatabase", "reload " + mDatabaseName + " take " + sw.ElapsedMilliseconds.ToString() + " ms");
            compressEnginer.WaitForReady();

            sw.Reset();
            sw.Start();
            hisEnginer.Pause();
            
            realEnginer.Lock();
            realEnginer.ReLoadTags(ltmp,db.RealDatabase);
            realEnginer.UnLock();

            hisEnginer.ReLoadTags(htmp, db.HisDatabase);
            compressEnginer.ReSizeTagCompress(htmp);

            hisEnginer.Resume();

            this.mDatabase = db;
            this.mRealDatabase = db.RealDatabase;
            this.mHisDatabase = db.HisDatabase;

            CurrentDatabaseVersion = db.Version;
            CurrentDatabase = db.Name;
            CurrentDatabaseLastUpdateTime = mRealDatabase.UpdateTime;
            sw.Stop();
            LoggerService.Service.Info("ReStartDatabase", "ReInit" + mDatabaseName + " take " + sw.ElapsedMilliseconds.ToString() + " ms");


            LoggerService.Service.Info("ReStartDatabase", "start to restart database finish.", ConsoleColor.DarkYellow);
204 205 206 207
        }

        /// <summary>
        /// 
cdy816's avatar
cdy816 已提交
208 209
        /// </summary>
        /// <param name="database"></param>
cdy816's avatar
cdy816 已提交
210
        private async Task<bool> InitAsync(string database)
211
        {
cdy816's avatar
cdy816 已提交
212

213 214 215 216 217 218 219 220 221 222 223
            if (System.IO.Path.IsPathRooted(database))
            {
                this.mDatabaseName = System.IO.Path.GetFileNameWithoutExtension(database);
                this.DatabasePath = System.IO.Path.GetDirectoryName(database);
            }
            else
            {
                this.mDatabaseName = database;
            }
            InitPath();

cdy816's avatar
cdy816 已提交
224 225
            CPUAssignHelper.Helper.Init();

cdy816's avatar
cdy816 已提交
226 227 228
            if (CheckDatabaseExist(mDatabaseName))
            {
                LoadDatabase();
cdy816's avatar
cdy816 已提交
229

cdy816's avatar
cdy816 已提交
230 231
                mHisFileManager = new DataFileManager(mDatabaseName);
                mHisFileManager.TagCountOneFile = mHisDatabase.Setting.TagCountOneFile;
232

cdy816's avatar
cdy816 已提交
233 234 235
                var task = mHisFileManager.Int();
                realEnginer = new RealEnginer(mRealDatabase);
                realEnginer.Init();
236

237
                hisEnginer = new HisEnginer2(mHisDatabase, realEnginer);
cdy816's avatar
cdy816 已提交
238
                hisEnginer.MergeMemoryTime = mHisDatabase.Setting.DataBlockDuration * 60;
239
                hisEnginer.LogManager = new LogManager2() { Database = mDatabaseName };
cdy816's avatar
cdy816 已提交
240
                hisEnginer.Init();
241

242
                compressEnginer = new CompressEnginer2();
cdy816's avatar
cdy816 已提交
243
                compressEnginer.TagCountOneFile = mHisDatabase.Setting.TagCountOneFile;
244

245
                seriseEnginer = new SeriseEnginer2() { DatabaseName = database };
cdy816's avatar
cdy816 已提交
246 247 248 249
                seriseEnginer.FileDuration = mHisDatabase.Setting.FileDataDuration;
                seriseEnginer.BlockDuration = mHisDatabase.Setting.DataBlockDuration;
                seriseEnginer.TagCountOneFile = mHisDatabase.Setting.TagCountOneFile;
                seriseEnginer.DataSeriser = mHisDatabase.Setting.DataSeriser;
250

cdy816's avatar
cdy816 已提交
251
                querySerivce = new QuerySerivce(this.mDatabaseName);
252

253 254
                mSecurityRunner = new SecurityRunner() { Document = mDatabase.Security };

cdy816's avatar
cdy816 已提交
255
                RegistorInterface();
256

cdy816's avatar
cdy816 已提交
257
                DriverManager.Manager.Init(realEnginer);
cdy816's avatar
cdy816 已提交
258

cdy816's avatar
cdy816 已提交
259 260
                HisQueryManager.Instance.Registor(mDatabaseName);

cdy816's avatar
cdy816 已提交
261 262 263 264 265 266 267 268 269 270
                await task;

                return true;
            }
            else
            {
                LoggerService.Service.Erro("Runner", string.Format(DBRuntime.Res.Get("databasenotexist"), mDatabaseName));
                return false;
            }
           
271 272 273 274 275 276 277 278 279 280

        }

        /// <summary>
        /// 
        /// </summary>
        private void RegistorInterface()
        {
            ServiceLocator.Locator.Registor<IRealData>(realEnginer);
            ServiceLocator.Locator.Registor<IRealDataNotify>(realEnginer);
281
            ServiceLocator.Locator.Registor<IRealDataNotifyForProducter>(realEnginer);
282 283 284
            ServiceLocator.Locator.Registor<IRealTagConsumer>(realEnginer);
            ServiceLocator.Locator.Registor<IRealTagProduct>(realEnginer);

285 286 287
            ServiceLocator.Locator.Registor<IHisEngine2>(hisEnginer);
            ServiceLocator.Locator.Registor<IDataCompress2>(compressEnginer);
            ServiceLocator.Locator.Registor<IDataSerialize2>(seriseEnginer);
288 289

            ServiceLocator.Locator.Registor<IHisQuery>(querySerivce);
cdy816's avatar
tt  
cdy816 已提交
290

cdy816's avatar
cdy816 已提交
291
            ServiceLocator.Locator.Registor<ITagManager>(mRealDatabase);
292 293

            ServiceLocator.Locator.Registor<IRuntimeSecurity>(mSecurityRunner);
294 295
        }

296 297 298 299 300 301 302 303 304
        /// <summary>
        /// 
        /// </summary>
        public void ReStart()
        {
            Stop();
            Start();
        }

305 306 307
        /// <summary>
        /// 
        /// </summary>
308
        public void Start(int port = 14330)
cdy816's avatar
cdy816 已提交
309
        {
310 311
            StartAsync("local");
        }
cdy816's avatar
cdy816 已提交
312

313 314 315 316
        /// <summary>
        /// 启动
        /// </summary>
        /// <param name="database"></param>
317
        public async void StartAsync(string database,int port = 14330)
318
        {
319
            LoggerService.Service.Info("Runner", " 数据库 " + database+" 开始启动");
cdy816's avatar
cdy816 已提交
320 321 322 323 324
            var re = await InitAsync(database);
            if (!re)
            {
                return;
            }
325
            DBRuntime.Api.DataService.Service.Start(port);
326 327 328
            seriseEnginer.Start();
            compressEnginer.Start();
            hisEnginer.Start();
cdy816's avatar
cdy816 已提交
329
            //mSecurityRunner.Start();
cdy816's avatar
cdy816 已提交
330
            DriverManager.Manager.Start();
331

332
            mIsStarted = true;
333
            LoggerService.Service.Info("Runner", " 数据库 " + database + " 启动完成");
cdy816's avatar
cdy816 已提交
334 335 336 337 338 339
        }


        /// <summary>
        /// 停止
        /// </summary>
340 341
        public  void Stop()
        {
342
            DBRuntime.Api.DataService.Service.Stop();
343
            hisEnginer.Stop();
344
            DriverManager.Manager.Stop();
345 346
            compressEnginer.Stop();
            seriseEnginer.Stop();
cdy816's avatar
cdy816 已提交
347
           // mSecurityRunner.Stop();
348
            mIsStarted = false;
cdy816's avatar
cdy816 已提交
349 350 351 352 353 354 355 356 357 358
        }


        #endregion ...Methods...

        #region ... Interfaces ...

        #endregion ...Interfaces...
    }
}