예제 #1
0
        /// <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());
            }
        }
예제 #2
0
        /// <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());
        }
예제 #3
0
        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);
                }
            }
        }
예제 #4
0
        /// <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());
        }