/// <summary> /// 启动事件中的一个频道和节目 /// </summary> /// <param name="eventData"></param> /// <param name="ec"></param> /// <param name="cancellationToken"></param> private static void StartOneChannelAndProgram(AMSEvent eventData, AMSEventChannel ec, CancellationToken cancellationToken) { try { if (ec.State == AMSEventState.NotStart) { AMSEventSqlAdapter.Instance.UpdateEventChannelState(ec.EventID, ec.ChannelID, AMSEventState.Starting); } AMSChannel channel = StartChannel(ec.ChannelID, cancellationToken); if (cancellationToken.IsCancellationRequested == false) { if (channel != null && channel.State == AMSChannelState.Running) { LockHelper.ExtendLockTime(eventData); StartProgram(eventData, channel, ec, cancellationToken); } } } catch (System.Exception ex) { TraceHelper.AMSTaskTraceSource.TraceEvent(TraceEventType.Error, 60020, ex.ToString()); } }
/// <summary> /// 停止需要停止的任务 /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public static void StopEventsInTimeFrame(CancellationToken cancellationToken) { AMSEventCollection events = AMSEventSqlAdapter.Instance.LoadNeedStopEvents(); AMSQueueItemCollection messages = new AMSQueueItemCollection(); foreach (AMSEvent eventData in events) { if (cancellationToken.IsCancellationRequested) { break; } if (LockHelper.IsLockAvailable(eventData)) { messages.Add(eventData.ToQueueMessage(AMSQueueItemType.StopEvent)); TraceHelper.AMSTaskTraceSource.TraceEvent(TraceEventType.Verbose, 60012, "Add stop new event {0} to queue.", eventData.ID); } } GetQueue().AddMessages(string.Empty, messages.ToArray()); }
public static void StopEvent(AMSQueueItem message, CancellationToken cancellationToken) { AMSEvent eventData = null; try { eventData = AMSEventSqlAdapter.Instance.LoadByID(message.ResourceID); if (eventData != null) { if (eventData.State == AMSEventState.Running) { AMSEventSqlAdapter.Instance.UpdateState(eventData.ID, AMSEventState.Stopping); } AMSEventChannelCollection ecs = AMSEventSqlAdapter.Instance.LoadEventAndChannel(eventData.ID); Task[] stopProgramTasks = new Task[ecs.Count]; for (int i = 0; i < stopProgramTasks.Length; i++) { AMSEventChannel ec = ecs[i]; stopProgramTasks[i] = Task.Factory.StartNew(() => StopOneProgram(eventData, ec, cancellationToken)); } Task.WaitAll(stopProgramTasks.ToArray()); AMSEventSqlAdapter.Instance.UpdateCompletedStateByChannels(eventData.ID); } } finally { if (eventData != null) { LockHelper.Unlock(eventData); } } }
/// <summary> /// 检查需要启动的事件 /// </summary> /// <returns></returns> public static void StartEventsInTimeFrame(CancellationToken cancellationToken) { AMSWorkerSettings settings = AMSWorkerSettings.GetConfig(); AMSEventCollection events = AMSEventSqlAdapter.Instance.LoadNeedStartEvents(settings.Durations.GetDuration("createChannelWarmup", TimeSpan.FromMinutes(20))); AMSQueueItemCollection messages = new AMSQueueItemCollection(); foreach (AMSEvent eventData in events) { if (cancellationToken.IsCancellationRequested) { break; } if (LockHelper.IsLockAvailable(eventData)) { messages.Add(eventData.ToQueueMessage(AMSQueueItemType.StartEvent)); TraceHelper.AMSTaskTraceSource.TraceEvent(TraceEventType.Verbose, 60011, "Add start new event {0} to queue.", eventData.ID); } } GetQueue().AddMessages(string.Empty, messages.ToArray()); }