Ejemplo n.º 1
0
        public override ValueTask <int> HandleTaskAsync(TaskFullInfo task, ChannelInfo channel)
        {
            Logger.Info("NormalTaskHandler HandleTaskAsync");


            throw new NotImplementedException();
        }
Ejemplo n.º 2
0
 static public bool IsHandler(TaskFullInfo task)
 {
     if (task.TaskContent.CooperantType == CooperantType.emVTRBackup)
     {
         return(true);
     }
     return(false);
 }
Ejemplo n.º 3
0
        public async Task<int> ForceStopTaskAsync(TaskFullInfo task, ChannelInfo channel)
        {
            var stopback = await msvClient.StopAsync(channel.ChannelIndex, channel.Ip, task.TaskContent.TaskId, Logger);

            if (stopback > 0)
            {
                return task.TaskContent.TaskId;
            }
            return 0;
        }
Ejemplo n.º 4
0
        public override async ValueTask<int> StopTaskAsync(TaskFullInfo task, ChannelInfo channel)
        {
            DateTime end = (task.RetryTimes > 0 && task.NewEndTime != DateTime.MinValue) ? task.NewEndTime
                : DateTimeFormat.DateTimeFromString(task.TaskContent.End).AddSeconds(taskStopBehind);

            while (true)
            {
                if (DateTime.Now >= end)
                {
                    var msvtaskinfo = await msvClient.QueryTaskInfoAsync(channel.ChannelIndex, channel.Ip, Logger);

                    if (msvtaskinfo != null)
                    {
                        if (msvtaskinfo.ulID == task.TaskContent.TaskId)
                        {
                            var stopback = await msvClient.StopAsync(channel.ChannelIndex, channel.Ip, task.TaskContent.TaskId, Logger);

                            if (stopback > 0)
                            {
                                await restClient.SetTaskStateAsync(task.TaskContent.TaskId, taskState.tsComplete);
                                await UnlockTaskAsync(task.TaskContent.TaskId, taskState.tsNo, dispatchState.dpsDispatched, syncState.ssSync);
                                return task.TaskContent.TaskId;
                            }
                            else
                            {
                                return IsNeedRedispatchask(task);
                            }
                        }
                        else
                        {
                            if (msvtaskinfo.ulID >0)
                            {
                                // 停止的任务不是MSV当前正在采集的任务
                                // 需要将该任务标记为无效任务
                                await UnlockTaskAsync(task.TaskContent.TaskId, taskState.tsInvaild,
                                    dispatchState.dpsDispatched, syncState.ssSync);
                            }
                            
                            Logger.Error($"stop task not same {msvtaskinfo.ulID} {task.TaskContent.TaskId}");
                            return task.TaskContent.TaskId;
                        }

                    }
                    else
                    {
                        return IsNeedRedispatchask(task);
                    }

                }
                else
                    await Task.Delay(end - DateTime.Now);
            }
        }
Ejemplo n.º 5
0
 /*
  * 判断是否执行这个handle每个继承都必须要写这个
  */
 static public bool IsHandler(TaskFullInfo task)
 {
     if (task.TaskContent.CooperantType == CooperantType.emPureTask)
     {
         return true;
     }
     else if (task.TaskContent.CooperantType == CooperantType.emVTRBackupFailed && !task.StartOrStop)
     {
         return true;
     }
     return false;
 }
Ejemplo n.º 6
0
 public ITaskHandler CreateInstance(TaskFullInfo task)
 {
     foreach (var item in _taskHandlerList)
     {
         var obj = item.GetMethod("IsHandler")?.Invoke(null, new object[] { task });
         if (obj != null && (bool)obj)
         {
             return(Activator.CreateInstance(item, new object[] {
                 _serviceProvider.GetRequiredService <RestClient>(),
                 _serviceProvider.GetRequiredService <MsvClientCtrlSDK>(),
                 _serviceProvider.GetRequiredService <IConfiguration>()
             }) as ITaskHandler);
         }
     }
     return(null);
 }
Ejemplo n.º 7
0
        public override int IsNeedRedispatchask(TaskFullInfo taskinfo)
        {
            if (taskinfo.StartOrStop)
            {
                if (DateTime.Now.AddSeconds(5) <=
                DateTimeFormat.DateTimeFromString(taskinfo.TaskContent.End))
                {
                    Logger.Error($"IsNeedRedispatchaskAsync start over {taskinfo.TaskContent.TaskId}");
                    return 0;
                }

                return taskinfo.TaskContent.TaskId;
            }
            else
            {
                if (DateTime.Now <=
                DateTimeFormat.DateTimeFromString(taskinfo.TaskContent.End).AddSeconds(2))
                {
                    Logger.Error($"IsNeedRedispatchaskAsync stop over {taskinfo.TaskContent.TaskId}");
                    return 0;
                }
                return taskinfo.TaskContent.TaskId;
            }
        }
Ejemplo n.º 8
0
        public async Task <int> HandleTaskAsync(TaskFullInfo task)
        {
            Logger.Info($"TaskExcutor HandleTaskAsync {task.TaskContent.TaskId} {task.StartOrStop}");

            try
            {
                //如果判断到是周期任务,那么需要对它做分任务的处理
                //这个步骤挪到后台server去做
                if (task.TaskSource == TaskSource.emUnknowTask || task.ContentMeta == null)
                {
                    if (_restClient != null)
                    {
                        var fullinfo = await _restClient.GetTaskFullInfoAsync(task.TaskContent.TaskId);

                        if (fullinfo != null)
                        {
                            ObjectTool.CopyObjectData(fullinfo, task, "StartOrStop,RetryTimes,NewBeginTime,NewEndTime", BindingFlags.Public | BindingFlags.Instance);

                            Logger.Info($"TaskExcutor HandleTaskAsync get {JsonHelper.ToJson(task)}");
                        }
                        else
                        {
                            task.HandleTask = false;
                            return(0);
                        }
                    }
                }

                if (_timer != null)
                {
                    _timer.Dispose();
                    _timer = null;
                }

                /*
                 * flag katamaki任务检测
                 */
                var devicegrain = GrainFactory.GetGrain <IDeviceInspections>(0);
                if (devicegrain != null)
                {
                    var chinfo = await devicegrain.GetChannelInfoAsync(task.TaskContent.ChannelId);

                    if (chinfo != null)
                    {
                        var handle = _handlerFactory.CreateInstance(task);
                        if (handle != null)
                        {
                            var taskid = await handle.HandleTaskAsync(task, chinfo);

                            if (taskid > 0)
                            {
                                RaiseEvent(new TaskEvent()
                                {
                                    OpType = opType.otDel, TaskContentInfo = task.TaskContent
                                });
                                await ConfirmEvents();

                                if (task.StartOrStop)
                                {
                                    _timer = RegisterTimer(this.OnRunningTaskMonitorAsync,
                                                           new TimerTask()
                                    {
                                        TaskId     = taskid,
                                        TaskType   = task.TaskContent.TaskType,
                                        BeginTime  = task.TaskContent.Begin,
                                        ChannelId  = chinfo.ChannelId,
                                        DeviceIp   = chinfo.Ip,
                                        DevicePort = chinfo.ChannelIndex,
                                        RetryTimes = task.RetryTimes,
                                        Timers     = 0
                                    },
                                                           TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1));
                                }
                            }
                            else
                            {
                                RaiseEvent(new TaskEvent()
                                {
                                    OpType = opType.otReDispatch, TaskContentInfo = task.TaskContent
                                });
                                await ConfirmEvents();
                            }
                        }
                        else
                        {
                            Logger.Error($"CreateInstance error {JsonHelper.ToJson(task)}");
                        }
                    }
                    else
                    {
                        Logger.Error($"getgrain channelinfo error {task.TaskContent.ChannelId}");
                    }
                }
                else
                {
                    Logger.Error("not find device grain");
                }

                return(0);
            }
            catch (Exception e)
            {
                Logger.Error($"TaskExcutor HandleTaskAsync error {e.Message}");
            }

            return(0);
        }
Ejemplo n.º 9
0
 public override ValueTask <int> StopTaskAsync(TaskFullInfo task, ChannelInfo channel)
 {
     throw new NotImplementedException();
 }
Ejemplo n.º 10
0
 public virtual ValueTask <int> StartTaskAsync(TaskFullInfo task, ChannelInfo channel)
 {
     throw new NotImplementedException();
 }
Ejemplo n.º 11
0
        public virtual async ValueTask <string> GetCaptureParmAsync(TaskFullInfo taskinfo, ChannelInfo channel)
        {
            string captureparam = taskinfo.CaptureMeta;
            var    typeinfo     = await msvClient.QuerySDIFormatAsync(channel.ChannelIndex, channel.Ip, Logger);

            if (typeinfo != null && typeinfo.SignalType < 254)
            {
                /*oss路径过滤*/
                if (captureparam.IndexOf("&amp;") > 0 && captureparam.IndexOf("&lt;") > 0)
                {
                    captureparam = captureparam.Replace("&amp;", "&");
                    captureparam = captureparam.Replace("&lt;", "<");
                    captureparam = captureparam.Replace("&gt;", ">");
                }

                XElement capturenode = null;
                var      root        = XDocument.Parse(captureparam);
                if (root != null)
                {
                    var capturemeta = root.Element("CaptureMetaAll");
                    switch (typeinfo.SignalType)
                    {
                    case 0:
                    {
                        var node = capturemeta.Element("SDCaptureMeta");
                        if (node != null)
                        {
                            capturenode = node.FirstNode as XElement;
                        }
                    }
                    break;

                    case 1:
                    {
                        var node = capturemeta.Element("HDCaptureMeta");
                        if (node != null)
                        {
                            capturenode = node.FirstNode as XElement;
                        }
                    }
                    break;

                    case 2:
                    {
                        var node = capturemeta.Element("UHDCaptureMeta");
                        if (node != null)
                        {
                            capturenode = node.FirstNode as XElement;
                        }
                    }
                    break;

                    default:
                        break;
                    }

                    if (capturenode != null)
                    {
                        CTimeCode timecode = new CTimeCode();
                        timecode.setDBFrameRate(typeinfo.fFrameRate);
                        timecode.SetDFMode(typeinfo.TCMode == TimeCodeMode.DF ? 1 : 0);
                        timecode.SetVS(timecode.Rate2VideoStandard(typeinfo.fFrameRate));

                        long bmpframe = timecode.GetFrameByTimeCode(taskinfo.ContentMeta.PresetStamp);

                        Logger.Info($"GetCaptureParm {bmpframe}");
                        var pic = capturenode.Element("FirPicNum");
                        if (pic != null)
                        {
                            pic.Value = bmpframe.ToString();
                        }
                        else
                        {
                            capturenode.Add(new XElement("FirPicNum", bmpframe.ToString()));
                        }

                        //第三码路径没说过要用,暂时算了
                        var pathfile = capturenode.Element("path1FileName");
                        if (pathfile != null)
                        {
                            pathfile.Value = FormatCaptureParamPath(pathfile.Value);
                        }
                        pathfile = capturenode.Element("path0FileName");
                        if (pathfile != null)
                        {
                            pathfile.Value = FormatCaptureParamPath(pathfile.Value);
                        }

                        //if (m_bReplaceHighCaptureParams && (nTaskType == 7))
                        //{
                        //    XmlNode bPath0 = CAPTUREPARAM.SelectSingleNode("bPath0");
                        //    if (bPath0 != null)
                        //    {
                        //        bPath0.InnerText = "0";
                        //    }
                        //}

                        if (taskinfo.ContentMeta.AudioChannels >= 0)
                        {
                            pic = capturenode.Element("iPureAudioValue");
                            if (pic != null)
                            {
                                pic.Value = taskinfo.ContentMeta.AudioChannels.ToString();
                            }
                        }
                        if (taskinfo.ContentMeta.AudioChannelAttribute > 0)
                        {
                            pic = capturenode.Element("nAudioChannelAttribute");
                            if (pic != null)
                            {
                                pic.Value = taskinfo.ContentMeta.AudioChannelAttribute.ToString();
                            }
                        }

                        if (taskinfo.ContentMeta.ASRmask >= 0)
                        {
                            pic = capturenode.Element("ASR_mask");
                            if (pic != null)
                            {
                                pic.Value = taskinfo.ContentMeta.ASRmask.ToString();
                            }
                        }

                        return(capturenode.ToString());
                    }
                    else
                    {
                        Logger.Error($"load captureparam error {captureparam} {typeinfo.SignalType}");
                    }
                }
            }
            else
            {
                Logger.Error($"StartTaskAsync QuerySDIFormatAsync error {typeinfo?.SignalType}");
            }
            return(string.Empty);
        }
Ejemplo n.º 12
0
 public virtual int IsNeedRedispatchask(TaskFullInfo taskinfo)
 {
     throw new NotImplementedException();
 }
Ejemplo n.º 13
0
        public override async ValueTask<int> HandleTaskAsync(TaskFullInfo task, ChannelInfo channel)
        {
            Logger.Info($"NormalTaskHandler HandleTaskAsync retrytimes {task.RetryTimes}");

            int taskid = task.TaskContent.TaskId;
            if (task.ContentMeta == null || string.IsNullOrEmpty(task.CaptureMeta))
            {
                await UnlockTaskAsync(taskid, taskState.tsNo, dispatchState.dpsRedispatch, syncState.ssSync);
                return 0;
            }

            if (task.StartOrStop && task.OpType != opType.otDel)
            {
                if (task.TaskContent.TaskType == TaskType.TT_MANUTASK)//已经执行的手动任务不需要执行,未执行的手动任务需要继续执行
                {
                    if (task.TaskContent.State == taskState.tsExecuting || task.TaskContent.State == taskState.tsManuexecuting)
                    {
                        await UnlockTaskAsync(taskid, taskState.tsExecuting, dispatchState.dpsDispatched, syncState.ssSync);
                        return taskid;
                    }
                }
                else if (task.TaskContent.TaskType == TaskType.TT_TIEUP)
                {
                    await HandleTieupTaskAsync(task.TaskContent);
                    return taskid;
                }
                else
                {
                    if (DateTimeFormat.DateTimeFromString(task.TaskContent.End) < DateTime.Now)//普通任务进行时间有效性判断, 
                    {
                        task.StartOrStop = false;//禁止监听任务
                        return taskid;
                    }
                }

                if (channel.CurrentDevState == Device_State.DISCONNECTTED)
                {
                    await UnlockTaskAsync(taskid,
                        taskState.tsNo, dispatchState.dpsRedispatch, syncState.ssSync);
                    return IsNeedRedispatchask(task);
                }

                if (await StartTaskAsync(task, channel) > 0)
                {
                    //成功
                    await UnlockTaskAsync(taskid, taskState.tsExecuting, dispatchState.dpsDispatched, syncState.ssSync);
                    return taskid;
                }
                else
                {
                    //使用备份信号
                    //我擦,居然可以不用写,stop才有
                    Logger.Info("start error. begin to use backupsignal");


                    if (task.TaskContent.TaskType == TaskType.TT_OPENEND ||
                        task.TaskContent.TaskType == TaskType.TT_OPENENDEX)
                    {
                        await UnlockTaskAsync(taskid, taskState.tsInvaild, dispatchState.dpsDispatched, syncState.ssSync);
                    }
                    else
                    {
                        await UnlockTaskAsync(taskid, taskState.tsNo, dispatchState.dpsRedispatch, syncState.ssSync);
                    }

                    //重调度还失败,要看看是否超过了,超过就从列表去了
                    
                    return IsNeedRedispatchask(task);

                }
                
                
            }
            else
            {

                Logger.Info($"task stop timespan {(DateTimeFormat.DateTimeFromString(task.TaskContent.End) - DateTime.Now).TotalSeconds}");
                task.TaskContent.End = DateTimeFormat.DateTimeToString(DateTime.Now);

                if (task.TaskContent.TaskType != TaskType.TT_MANUTASK || 
                    (task.TaskContent.TaskType == TaskType.TT_MANUTASK && task.OpType == opType.otDel))
                {

                    //里面有IsNeedRedispatchask(task);
                    var backinfo = await StopTaskAsync(task, channel);

                    //所有的删除都让入库去做,这里不删除
                    //开始删除素材
                    if (task.OpType == opType.otDel)
                    {
                        await UnlockTaskAsync(task.TaskContent.TaskId, taskState.tsComplete, dispatchState.dpsInvalid, syncState.ssSync);
                        //DeleteClip();
                    }
                    return backinfo;
                }
            }
            return 0;
        }
Ejemplo n.º 14
0
        public override async ValueTask<int> StartTaskAsync(TaskFullInfo task, ChannelInfo channel)
        {

            var backinfo = await msvClient.QueryTaskInfoAsync(channel.ChannelIndex, channel.Ip, Logger);


            if (backinfo != null)
            {
                if (backinfo.ulID > 0)//存在执行任务
                {
                    if (backinfo.ulID == task.TaskContent.TaskId)
                    {
                        return task.TaskContent.TaskId;
                    }
                    else if (backinfo.ulID < task.TaskContent.TaskId)
                    {
                        Logger.Info($"start msv in stop else {backinfo.ulID}");
                        await ForceStopTaskAsync(task, channel);
                    }

                    if (task.TaskSource == TaskSource.emStreamMediaUploadTask)
                    {
                        return 0;
                    }
                    //前一个任务是手动任务,特别处理无缝任务 bIsStopLastTask
                }

                switch (task.TaskSource)
                {
                    case TaskSource.emMSVUploadTask:
                        {
                            if (!await restClient.SwitchMatrixSignalChannelAsync(task.TaskContent.SignalId, channel.ChannelId))
                            {
                                Logger.Error($"Switchsignalchannel error {task.TaskContent.SignalId} {channel.ChannelId}");
                            }
                        }
                        break;
                    case TaskSource.emRtmpSwitchTask:
                        {
                            if (!await restClient.SwitchMatrixChannelRtmpAsync(channel.ChannelId, task.ContentMeta.SignalRtmpUrl))
                            {
                                Logger.Error($"Switchsignalchannel error {task.TaskContent.SignalId} {channel.ChannelId}");
                            }
                        }
                        break;
                    case TaskSource.emVTRUploadTask:
                        break;
                    case TaskSource.emXDCAMUploadTask:
                        break;
                    case TaskSource.emIPTSUploadTask:
                        break;
                    case TaskSource.emStreamMediaUploadTask:
                        break;
                    case TaskSource.emUnknowTask:
                        break;
                    default:
                        break;
                }


                string capparam = await GetCaptureParmAsync(task, channel);

                DateTime dtcurrent;
                DateTime dtbegin = (task.RetryTimes > 0 && task.NewBeginTime != DateTime.MinValue)?task.NewBeginTime :
                    DateTimeFormat.DateTimeFromString(task.TaskContent.Begin).AddSeconds(-1* taskStartPrevious);

                while(true)
                {
                    dtcurrent = DateTime.Now;
                    if (dtcurrent >= dtbegin)
                    {
                        var recordinfo = msvClient.RecordReady(channel.ChannelIndex, channel.Ip, CreateTaskParam(task.TaskContent), "", capparam, Logger);

                        bool backrecord = await msvClient.RecordAsync(recordinfo, channel.ChannelIndex, channel.Ip, Logger);

                        if (backrecord)
                        {
                           
                            var state = await AutoRetry.RunSyncAsync(() =>
                                                            msvClient.QueryDeviceStateAsync(channel.ChannelIndex, channel.Ip, true, Logger),
                                                                                            (e) =>
                                                                                            {
                                                                                                if (e == Device_State.WORKING)
                                                                                                {
                                                                                                    return true;
                                                                                                }
                                                                                                return false;
                                                                                            }, 4, 500).ConfigureAwait(true);

                            if (state == Device_State.WORKING)
                            {
                                return task.TaskContent.TaskId;
                            }
                            else
                                Logger.Error($"start task error {task.TaskContent.TaskId}");
                        }
                        return 0;
                    }
                    else
                    {
                        await Task.Delay(dtbegin - dtcurrent);
                    }
                }
                
            }
            else
                Logger.Error($"StartTaskAsync QueryTaskInfoAsync error back 0");

            return 0;
        }