private bool TryConnectMonitor() { if (buildMonitorRemote == null) { try { var namedPipeBinding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None) { SendTimeout = TimeSpan.FromSeconds(300.0) }; buildMonitorRemote = ChannelFactory <IBuildMonitorRemote> .CreateChannel(namedPipeBinding, new EndpointAddress(monitorPipeName)); buildMonitorRemote.Ping(); } catch (EndpointNotFoundException) { buildMonitorRemote = null; } } return(buildMonitorRemote != null); }
private bool SendThreadUpdate() { if (!TryConnectMonitor()) return false; // Update local info var localMicroThreadNotifications = new List<MicrothreadNotification>(); var localBuildStepResultsToSend = new List<long>(); lock (microthreadNotifications) { localMicroThreadNotifications.AddRange(microthreadNotifications); microthreadNotifications.Clear(); } lock (buildStepInfosToSend) { buildStepInfos.AddRange(buildStepInfosToSend); buildStepInfosToSend.Clear(); } lock (buildStepResultsToSend) { localBuildStepResultsToSend.AddRange(buildStepResultsToSend); buildStepResultsToSend.Clear(); } try { // Sending BuildStep view model foreach (var buildStepInfo in buildStepInfos.Where(x => !x.HasBeenSend)) { buildMonitorRemote.SendBuildStepInfo(builderId, buildStepInfo.ExecutionId, buildStepInfo.Description, startTime); buildStepInfo.BuildStepSent(); } buildMonitorRemote.SendMicrothreadEvents(builderId, startTime, DateTime.Now, localMicroThreadNotifications); // Sending log message foreach (var buildStepInfo in buildStepInfos) { if (buildStepInfo.Logger != null) { TimestampLocalLogger.Message[] messages = null; lock (buildStepInfo.Logger) { if (buildStepInfo.Logger.Messages.Count > 0) { messages = buildStepInfo.Logger.Messages.ToArray(); buildStepInfo.Logger.Messages.Clear(); } } if (messages != null) { try { var serializableMessages = (messages.Select(x => new SerializableTimestampLogMessage(x))).ToList(); buildMonitorRemote.SendCommandLog(builderId, startTime, buildStepInfo.ExecutionId, serializableMessages); } catch (Exception) { lock (buildStepInfo.Logger) { buildStepInfo.Logger.Messages.InsertRange(0, messages); } throw; } } } } // Sending BuildStep results for (int i = localBuildStepResultsToSend.Count - 1; i >= 0; --i) { long microthreadId = localBuildStepResultsToSend[i]; BuildStepInfo stepInfo = buildStepInfos.SingleOrDefault(x => x.ExecutionId == microthreadId); if (stepInfo != null && stepInfo.BuildStep != null) { buildMonitorRemote.SendBuildStepResult(builderId, startTime, microthreadId, stepInfo.BuildStep.Status); localBuildStepResultsToSend.RemoveAt(i); } } } catch (Exception) { lock (microthreadNotifications) { microthreadNotifications.AddRange(localMicroThreadNotifications); } buildMonitorRemote = null; } finally { if (localBuildStepResultsToSend.Count > 0) { lock (buildStepResultsToSend) { buildStepResultsToSend.AddRange(localBuildStepResultsToSend); } } } return buildMonitorRemote != null; }
private bool TryConnectMonitor() { if (buildMonitorRemote == null) { try { var namedPipeBinding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None) { SendTimeout = TimeSpan.FromSeconds(300.0) }; buildMonitorRemote = ChannelFactory<IBuildMonitorRemote>.CreateChannel(namedPipeBinding, new EndpointAddress(monitorPipeName)); buildMonitorRemote.Ping(); } catch (EndpointNotFoundException) { buildMonitorRemote = null; } } return buildMonitorRemote != null; }
private bool SendThreadUpdate() { if (!TryConnectMonitor()) { return(false); } // Update local info var localMicroThreadNotifications = new List <MicrothreadNotification>(); var localBuildStepResultsToSend = new List <long>(); lock (microthreadNotifications) { localMicroThreadNotifications.AddRange(microthreadNotifications); microthreadNotifications.Clear(); } lock (buildStepInfosToSend) { buildStepInfos.AddRange(buildStepInfosToSend); buildStepInfosToSend.Clear(); } lock (buildStepResultsToSend) { localBuildStepResultsToSend.AddRange(buildStepResultsToSend); buildStepResultsToSend.Clear(); } try { // Sending BuildStep view model foreach (var buildStepInfo in buildStepInfos.Where(x => !x.HasBeenSend)) { buildMonitorRemote.SendBuildStepInfo(builderId, buildStepInfo.ExecutionId, buildStepInfo.Description, startTime); buildStepInfo.BuildStepSent(); } buildMonitorRemote.SendMicrothreadEvents(builderId, startTime, DateTime.Now, localMicroThreadNotifications); // Sending log message foreach (var buildStepInfo in buildStepInfos) { if (buildStepInfo.Logger != null) { TimestampLocalLogger.Message[] messages = null; lock (buildStepInfo.Logger) { if (buildStepInfo.Logger.Messages.Count > 0) { messages = buildStepInfo.Logger.Messages.ToArray(); buildStepInfo.Logger.Messages.Clear(); } } if (messages != null) { try { var serializableMessages = (messages.Select(x => new SerializableTimestampLogMessage(x))).ToList(); buildMonitorRemote.SendCommandLog(builderId, startTime, buildStepInfo.ExecutionId, serializableMessages); } catch (Exception) { lock (buildStepInfo.Logger) { buildStepInfo.Logger.Messages.InsertRange(0, messages); } throw; } } } } // Sending BuildStep results for (int i = localBuildStepResultsToSend.Count - 1; i >= 0; --i) { long microthreadId = localBuildStepResultsToSend[i]; BuildStepInfo stepInfo = buildStepInfos.SingleOrDefault(x => x.ExecutionId == microthreadId); if (stepInfo != null && stepInfo.BuildStep != null) { buildMonitorRemote.SendBuildStepResult(builderId, startTime, microthreadId, stepInfo.BuildStep.Status); localBuildStepResultsToSend.RemoveAt(i); } } } catch (Exception) { lock (microthreadNotifications) { microthreadNotifications.AddRange(localMicroThreadNotifications); } buildMonitorRemote = null; } finally { if (localBuildStepResultsToSend.Count > 0) { lock (buildStepResultsToSend) { buildStepResultsToSend.AddRange(localBuildStepResultsToSend); } } } return(buildMonitorRemote != null); }