コード例 #1
0
 /// <summary>
 /// Initializes the type container.
 /// </summary>
 /// <param name="container">The container.</param>
 private void InitializeTypeContainer(IContainer container)
 {
     TypeContainer        = container ?? throw new ArgumentNullException(Common.Strings.TypeContainerCantBeNull);
     _logger              = TypeContainer.Resolve <ILogger>();
     _configurationReader = TypeContainer.Resolve <IConfigurationReader>();
     _jniBridgeManager    = TypeContainer.Resolve <IJniBridgeManager>();
 }
コード例 #2
0
 /// <summary>
 /// Removes the stale proxies if any.
 /// </summary>
 private void RemoveStaleProxiesIfAny()
 {
     new Thread(() => {
         var builder = TypeContainer.Resolve <IBuilder>();
         if (Directory.Exists(builder.StaleProxyLocation))
         {
             try {
                 var staleFiles = Directory.GetFiles(builder.StaleProxyLocation);
                 Array.ForEach(staleFiles, File.Delete);
             } catch {
                 // Safe to ignore exception here
             }
         }
     }).Start();
 }
コード例 #3
0
 /// <summary>
 /// Sets up service.
 /// </summary>
 private void SetUpService()
 {
     _configurationReader = TypeContainer.Resolve <IConfigurationReader>();
     _defaultParser       = TypeContainer.Resolve <IParser>();
     _defaultBuilder      = TypeContainer.Resolve <IBuilder>();
     _dataService         = TypeContainer.Resolve <IDataService>();
     _messenger           = TypeContainer.Resolve <IMessenger>();
     _perfCounters        = TypeContainer.Resolve <IPerfCounters>();
     ExecutionResult.AttachPerfCounters(_perfCounters);
     ExecutionResult.AttachLogger(_logger);
     HostManager                 = TypeContainer.Resolve <IServiceHostManager>();
     _messenger.Notify          += MessengerNotification;
     _configFileMonitor.Changed += (s, e) => ReloadAndApplyConfigChanges();
     Configure();
 }
コード例 #4
0
 public CollectTaskInvoker(CollectTaskState state)
 {
     this.ScriptEngine = new V8ScriptEngine();
     AddHostObject("lib", new HostTypeCollection("mscorlib", "System.Core"));
     AddHostObject("debug", TypeContainer.Resolve <DebugModule>());
     AddHostObject("log", TypeContainer.Resolve <LoggerModule>());
     AddHostObject("http", TypeContainer.Resolve <HttpModule>());
     AddHostObject("html", TypeContainer.Resolve <HtmlModule>());
     this.ScriptEngine.AddHostObject("state", state);
     this.ScriptEngine.AddHostObject("task", TypeContainer.Resolve <CollectTaskAccessProxy>());
     this.ScriptEngine.AddHostType("Array", typeof(JSArray));
     this.ScriptEngine.Execute(ResourceManager.ReadResource("Snail.Collector.JsExtends.DateExtend.js"));
     this.ScriptEngine.Execute(ResourceManager.ReadResource("Snail.Collector.JsExtends.ObjectPersistence.js"));
     this.ScriptEngine.Execute(ResourceManager.ReadResource("Snail.Collector.JsExtends.StringExtend.js"));
     this.ScriptEngine.Execute(ResourceManager.ReadResource("Snail.Collector.JsExtends.Unity.js"));
 }
コード例 #5
0
        /// <summary>
        /// Processes the dropped file helper.
        /// </summary>
        private void ProcessDroppedFileHelper()
        {
            var buffer           = string.Empty;
            var alreadyProcessed = new List <Guid>();
            var result           = ExecutionResult.Empty;
            var config           = (CustomConfigReader)_configurationReader.Configuration;

            if (_filesToProcess.Count > 0)
            {
                _protectMutex.WaitOne();
                var javaParserFactory = TypeContainer.Resolve <IJavaParserFactory>();
                _tmrProcessFile.Enabled = false;
                Parallel.ForEach(_filesToProcess, (item) => {
                    try {
                        using (var testStream = new FileStream(item.Value.Key, FileMode.Open, FileAccess.Read, FileShare.Read)) {
                            //  First step is to add selected JAR to ClassPath in JVM
                            result = _jniBridgeManager.AddPath(item.Value.Key, ref buffer);
                            alreadyProcessed.Add(item.Key);                             // Let's mark it as processed
                            // Second step is to extract information on methods in JAR (if this step fails, it's useless to continue)

                            if (_jniBridgeManager.SerializeMethodsInJar(item.Value.Key, item.Value.Value).IsSuccess)
                            {
                                // Third step is to extract method metadata information (required to call JNIBridge)
                                var res = javaParserFactory.ExtractJniMethodDefinition(item.Value.Key);
                                _dataService.RemovePreviousRegistrationIfAny(Path.GetFileName(item.Value.Key.Replace(".jar", ".dll")));
                                // Fourth step is to register dynamic library information (to be created in next step)
                                if (_dataService.RegisterLibrary(item.Value.Key, _configurationReader, res.Tag as Dictionary <string, JniMetadata>).IsSuccess)
                                {
                                    // Final steps are produce CSharp proxies and build dynamic assemblies
                                    if ((result = _defaultParser.ParseAndProduceCSharpFile(item.Value.Value)).IsSuccess)
                                    {
                                        var codeSnippets = result.Tag as Dictionary <string, StringBuilder>;
                                        result           = _defaultBuilder.BuildProxyAssembly(codeSnippets, item.Value.Value, config.dotNetOptions.workingFolder);
                                    }
                                }
                            }
                        }
                    } catch (Exception ex) {
                        _logger.Log(ex);
                    }
                });
                alreadyProcessed.ForEach(_ => _filesToProcess.Remove(_));
                _tmrProcessFile.Enabled = true;
                _protectMutex.ReleaseMutex();
            }
        }
コード例 #6
0
ファイル: Program.cs プロジェクト: 329277920/Snail.Collector
        /// <summary>
        /// 执行任务
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            ApplicationStart();

            //args = new string[] { "add", "-file", "Script/xxx/100.js", "-id", "100", "-name", "xxx" };
            //args = new string[] { "run", "-id", "100" };

            // args = new string[] { "add", "-file", "Script/demo-index.js", "-id", "10", "-name", "广点通-后台数据" };
            // args = new string[] { "run", "-id", "10", "-repeat", "10", "-delay", "01:00:00" };

            args = new string[] { "test", "-file", @"D:\Projects\Snail.Collector\Snail.Collector\Script\manhua\300-test.js" };

            if (args == null || args.Length == 0)
            {
                InputPromptMessage();
                return;
            }

            var command = TypeContainer.Resolve <ICommand>($"task_{args[0]}");

            if (command == null)
            {
                InputPromptMessage();
                return;
            }
            try
            {
                command.Execute(args.Skip(1).ToArray());
            }
            catch (GeneralException glEx)
            {
                Console.WriteLine(glEx.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
コード例 #7
0
 /// <summary>
 /// 写入普通日志
 /// </summary>
 /// <param name="message">日志内容</param>
 public void info(string message)
 {
     TypeContainer.Resolve <ILogger>().Info(message);
 }
コード例 #8
0
 /// <summary>
 /// 写入异常日志
 /// </summary>
 /// <param name="message">日志内容</param>
 /// <param name="ex">异常对象</param>
 public void error(string message, Exception ex = null)
 {
     TypeContainer.Resolve <ILogger>().Error(message, ex);
 }
コード例 #9
0
        public void Execute(params string[] args)
        {
            var parameters = new RunCommandArgs();

            parameters.Parse(args);
            if (!parameters.Success)
            {
                throw new GeneralException(parameters.Error ?? this.PromptMessage);
            }
            var collect = this._collectRepository.SelectSingle(parameters.CollectId);

            if (collect == null)
            {
                throw new GeneralException($"未找到id为:{parameters.CollectId}的任务。");
            }
            Console.WriteLine($"准备执行任务:{collect.Name}");
            CancellationTokenSource cts = new CancellationTokenSource();
            var task = Task.Factory.StartNew(() =>
            {
                for (var idx = 1; idx <= parameters.Repeat; idx++)
                {
                    if (cts.Token.IsCancellationRequested)
                    {
                        break;
                    }
                    try
                    {
                        using (var taskRuntime = TypeContainer.Resolve <CollectTaskRuntime>())
                        {
                            int consolePosition = Console.CursorTop;
                            taskRuntime.OnCollectTaskInvokeComplete += (sender, e) =>
                            {
                                if (!e.Success)
                                {
                                    var message = $"执行失败({e.Task.CollectId}-{e.Task.Id}),地址:{e.Task.Uri}";
                                    if (e.Error != null && e.Error.Message != null && e.Error.Message.StartsWith("Error: UserError:"))
                                    {
                                        message += ("\r\n" + e.Error.Message);
                                        this._logger.Error(message);
                                        return;
                                    }
                                    this._logger.Error(message, e.Error);
                                }
                                else
                                {
                                    var refTaskRuntime = sender as CollectTaskRuntime;
                                    lock (taskRuntime)
                                    {
                                        Console.SetCursorPosition(0, consolePosition);
                                        Console.WriteLine($"正在执行任务数:{refTaskRuntime.State.RunningTaskCount.ToString().PadLeft(10, ' ')}");
                                        Console.WriteLine($"正常完成任务数:{refTaskRuntime.State.CompleteTaskCount.ToString().PadLeft(10, ' ')}");
                                        Console.WriteLine($"执行异常任务数:{refTaskRuntime.State.ErrorTaskCount.ToString().PadLeft(10, ' ')}");
                                        Console.WriteLine($"新增任务数:{refTaskRuntime.State.NewTaskCount.ToString().PadLeft(10, ' ')}");
                                        Console.WriteLine($"新增文件数:{refTaskRuntime.State.NewFileCount.ToString().PadLeft(10, ' ')}");
                                        Console.WriteLine($"新增内容数:{refTaskRuntime.State.NewContentCount.ToString().PadLeft(10, ' ')}");
                                    }
                                }
                            };
                            taskRuntime.Start(cts.Token, collect);
                        }
                        Console.WriteLine($"{DateTime.Now} - 已完成一次。");
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"{DateTime.Now} - 启动异常。");
                        this._logger.Error($"任务:{parameters.CollectId},启动异常。", ex);
                    }
                    finally
                    {
                        if (idx < parameters.Repeat)
                        {
                            Console.WriteLine($"{DateTime.Now} - 将在{parameters.Delay.TotalSeconds} 秒后重新执行。");
                            Thread.Sleep((int)parameters.Delay.TotalMilliseconds);
                        }
                    }
                }
                Console.WriteLine($"{DateTime.Now} - 已结束。");
            });

            Console.ReadKey();
            cts.Cancel();
            while (!task.IsCompleted)
            {
                Thread.Sleep(1000);
            }
        }