/// <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>(); }
/// <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(); }
/// <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(); }
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")); }
/// <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(); } }
/// <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()); } }
/// <summary> /// 写入普通日志 /// </summary> /// <param name="message">日志内容</param> public void info(string message) { TypeContainer.Resolve <ILogger>().Info(message); }
/// <summary> /// 写入异常日志 /// </summary> /// <param name="message">日志内容</param> /// <param name="ex">异常对象</param> public void error(string message, Exception ex = null) { TypeContainer.Resolve <ILogger>().Error(message, ex); }
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); } }