/// <summary> /// Construector. /// </summary> /// <param name="outReader">Output reader.</param> /// <param name="args">Arguments.</param> public IgniteProcess(IIgniteProcessOutputReader outReader, params string[] args) { // Add test dll path args = args.Concat(new[] { "-assembly=" + GetType().Assembly.Location }).ToArray(); _proc = Start(ExePath, IgniteHome.Resolve(null), outReader, args); }
/// <summary> /// Attaches the process console reader. /// </summary> public static void AttachProcessConsoleReader(Process proc, IIgniteProcessOutputReader outReader = null) { outReader = outReader ?? DfltOutReader; Attach(proc, proc.StandardOutput, outReader, false); Attach(proc, proc.StandardError, outReader, true); }
/// <summary> /// Starts a grid process. /// </summary> /// <param name="exePath">Exe path.</param> /// <param name="ggHome">Ignite home.</param> /// <param name="outReader">Output reader.</param> /// <param name="args">Arguments.</param> /// <returns>Started process.</returns> public static Process Start(string exePath, string ggHome, IIgniteProcessOutputReader outReader = null, params string[] args) { Debug.Assert(!string.IsNullOrEmpty(exePath)); Debug.Assert(!string.IsNullOrEmpty(ggHome)); // 1. Define process start configuration. var sb = new StringBuilder(); foreach (string arg in args) { sb.Append('\"').Append(arg).Append("\" "); } var procStart = new ProcessStartInfo { FileName = exePath, Arguments = sb.ToString() }; if (!string.IsNullOrEmpty(ggHome)) { procStart.EnvironmentVariables[IgniteManager.EnvIgniteHome] = ggHome; } procStart.EnvironmentVariables[IgniteManager.EnvIgniteNativeTestClasspath] = "true"; procStart.CreateNoWindow = true; procStart.UseShellExecute = false; procStart.RedirectStandardOutput = true; procStart.RedirectStandardError = true; var workDir = Path.GetDirectoryName(exePath); if (workDir != null) { procStart.WorkingDirectory = workDir; } Console.WriteLine("About to run Apache.Ignite.exe process [exePath=" + exePath + ", arguments=" + sb + ']'); // 2. Start. var proc = Process.Start(procStart); Debug.Assert(proc != null); // 3. Attach output readers to avoid hangs. outReader = outReader ?? DfltOutReader; Attach(proc, proc.StandardOutput, outReader, false); Attach(proc, proc.StandardError, outReader, true); return(proc); }
/// <summary> /// Attach output reader to the process. /// </summary> /// <param name="proc">Process.</param> /// <param name="reader">Process stream reader.</param> /// <param name="outReader">Output reader.</param> /// <param name="err">Whether this is error stream.</param> private static void Attach(Process proc, StreamReader reader, IIgniteProcessOutputReader outReader, bool err) { new Thread(() => { while (!proc.HasExited) { outReader.OnOutput(proc, reader.ReadLine(), err); } }) { IsBackground = true }.Start(); }
/// <summary> /// Attach output reader to the process. /// </summary> /// <param name="proc">Process.</param> /// <param name="reader">Process stream reader.</param> /// <param name="outReader">Output reader.</param> /// <param name="err">Whether this is error stream.</param> private static void Attach(Process proc, StreamReader reader, IIgniteProcessOutputReader outReader, bool err) { new Thread(() => { while (!proc.HasExited) outReader.OnOutput(proc, reader.ReadLine(), err); }) {IsBackground = true}.Start(); }
/// <summary> /// Starts a grid process. /// </summary> /// <param name="exePath">Exe path.</param> /// <param name="ggHome">Ignite home.</param> /// <param name="outReader">Output reader.</param> /// <param name="args">Arguments.</param> /// <returns>Started process.</returns> public static Process Start(string exePath, string ggHome, IIgniteProcessOutputReader outReader = null, params string[] args) { Debug.Assert(!string.IsNullOrEmpty(exePath)); Debug.Assert(!string.IsNullOrEmpty(ggHome)); // 1. Define process start configuration. var sb = new StringBuilder(); foreach (string arg in args) sb.Append('\"').Append(arg).Append("\" "); var procStart = new ProcessStartInfo { FileName = exePath, Arguments = sb.ToString() }; if (!string.IsNullOrEmpty(ggHome)) procStart.EnvironmentVariables[IgniteHome.EnvIgniteHome] = ggHome; procStart.EnvironmentVariables[Classpath.EnvIgniteNativeTestClasspath] = "true"; procStart.CreateNoWindow = true; procStart.UseShellExecute = false; procStart.RedirectStandardOutput = true; procStart.RedirectStandardError = true; var workDir = Path.GetDirectoryName(exePath); if (workDir != null) procStart.WorkingDirectory = workDir; Console.WriteLine("About to run Apache.Ignite.exe process [exePath=" + exePath + ", arguments=" + sb + ']'); // 2. Start. var proc = Process.Start(procStart); Debug.Assert(proc != null); // 3. Attach output readers to avoid hangs. outReader = outReader ?? DfltOutReader; Attach(proc, proc.StandardOutput, outReader, false); Attach(proc, proc.StandardError, outReader, true); return proc; }
/// <summary> /// Construector. /// </summary> /// <param name="outReader">Output reader.</param> /// <param name="args">Arguments.</param> public IgniteProcess(IIgniteProcessOutputReader outReader, params string[] args) { // Add test dll path args = args.Concat(new[] {"-assembly=" + GetType().Assembly.Location}).ToArray(); _proc = Start(ExePath, IgniteHome.Resolve(null), outReader, args); }