コード例 #1
0
        //发送CallBackMessage至queue,让CallBackProcessor接受
        private void SendCallBackMessage()
        {
            CallBackId = Context.CallBackEventManager.GetCallBackId();

            IFunctionData function = Function;

            FullName = function.ClassType.Namespace + "." + function.ClassType.Name + "." + function.MethodName;
            CallBackMessage callBackMessage;

            //无参数
            if (function.Parameters == null || function.Parameters.Count == 0)
            {
                callBackMessage = new CallBackMessage(FullName, Context.SessionId, CallBackId)
                {
                    Type         = MessageType.CallBack,
                    CallBackType = this.callBackType
                };
            }
            else
            {
                //运行前实时获取参数信息
                SetVariableParamValue();
                callBackMessage = new CallBackMessage(FullName, Context.SessionId, CallBackId, getStringParams(function))
                {
                    Type         = MessageType.CallBack,
                    CallBackType = this.callBackType
                };
            }
            Context.UplinkMsgProcessor.SendMessage(callBackMessage, false);
        }
コード例 #2
0
        //执行step,然后发送消息
        //todo I18n
        private void ProcessCallBack(CallBackMessage message)
        {
            string        methodName = message.Name;
            List <string> arg        = message.Args;
            bool          result     = false;

            try
            {
                if (!_callBackFunctions.ContainsKey(methodName) || !_callBackMethods.ContainsKey(methodName))
                {
                    throw new TestflowException(ModuleErrorCode.CallBackFunctionNameError, $"Unable to load function name {methodName}");
                }
                IFunctionData            function       = _callBackFunctions[methodName];
                IArgumentCollection      parameterTypes = function.ParameterType;
                IParameterDataCollection parameters     = function.Parameters;

                object[] obj = new object[arg.Count];

                for (int n = 0; n < arg.Count; n++)
                {
                    //undefined的情况应该不存在吧
                    //enum或者value
                    if (parameterTypes[n].VariableType == VariableType.Undefined)
                    {
                        //todo I18n
                        throw new TestflowException(ModuleErrorCode.IncorrectParamType, "Type should not be Undefined.");
                    }
                    if (parameterTypes[n].VariableType == VariableType.Value || parameterTypes[n].VariableType == VariableType.Enumeration)
                    {
                        obj[n] = _typeInvoker.CastValue(parameterTypes[n].Type, (arg[n]));
                    }
                    //class或者struct
                    else
                    {
                        obj[n] = JsonConvert.DeserializeObject(arg[n], _typeInvoker.GetType(parameterTypes[n].Type));
                    }
                }
                _callBackMethods[methodName].Invoke(null, obj);
                result = true;
            }
            catch (TestflowException ex)
            {
                _globalInfo.LogService.Print(LogLevel.Error, 0, ex, $"CallBack has a TestflowException when trying to execute {methodName}: {ex.Message}");
            }
            catch (ThreadAbortException ex)
            {
                _globalInfo.LogService.Print(LogLevel.Error, 0, ex, $"thread {Thread.CurrentThread.Name} stopped abnormally when executing {methodName}: {ex.Message}");
            }
            catch (Exception ex)
            {
                _globalInfo.LogService.Print(LogLevel.Error, 0, ex, $"CallBack has an Exception when executing {methodName}: {ex.Message}");
            }

            if (message.CallBackType == CallBackType.Synchronous)
            {
                SendMessage(message, result);
            }
        }
コード例 #3
0
        public void SendMessage(CallBackMessage message, string messageId)
        {
            var messageBody   = JsonConvert.SerializeObject(message);
            var brokerMessage = new BrokeredMessage(messageBody);

            brokerMessage.MessageId = messageId;

            QueueClient.Send(brokerMessage);
        }
コード例 #4
0
        //发送成功与否的消息
        private void SendMessage(CallBackMessage message, bool success)
        {
            CallBackMessage callbackMsg = new CallBackMessage(message.Name, message.Id, ((CallBackMessage)message).CallBackId)
            {
                SuccessFlag = success,
            };

            _globalInfo.MessageTransceiver.Send(callbackMsg);
        }
コード例 #5
0
        public async Task <ActionResult> Create([Bind(Include = "Id,DateTime,Message,UserId,ClientCallBackId")] CallBackMessage callBackMessage)
        {
            if (ModelState.IsValid)
            {
                db.CallBackMessages.Add(callBackMessage);
                await db.SaveChangesAsync();

                return(RedirectToAction("Details", routeValues: new { controller = "ClientCallBacks", id = callBackMessage.ClientCallBackId }));
            }

            ViewBag.Thema = db.ClientCallBacks.Find(callBackMessage.ClientCallBackId).Thema;
            return(View(callBackMessage));
        }
コード例 #6
0
        protected void ProcessMessage(CallBackMessage message)
        {
            try
            {
                var callBackMessageProcessor = new CallBackMessageProcessor(_consumerEventLog);

                callBackMessageProcessor.ProcessCallBackMessage(message);
            }
            catch (Exception e)
            {
                _consumerEventLog.WriteEntry("Error to process message (" + message.JobId + "): " + e.Message + ".\n" + e.StackTrace);
            }
        }
コード例 #7
0
        // GET: CustomerArea/CallBackMessages/Details/5
        public async Task <ActionResult> Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            CallBackMessage callBackMessage = await db.CallBackMessages.FindAsync(id);

            if (callBackMessage == null)
            {
                return(HttpNotFound());
            }
            return(View(callBackMessage));
        }
コード例 #8
0
        //todo 未考虑循环的事,如果循环,注意forceInvoke
        public override StepResult InvokeStep(bool forceInvoke)
        {
            StepResult result1 = StepResult.NotAvailable;

            // 开始计时
            StartTiming();
            SendCallBackMessage();
            #region  步:等待master发回消息
            if (callBackType == CallBackType.Synchronous)
            {
                //取得阻塞event
                AutoResetEvent block = Context.CallBackEventManager.AcquireBlockEvent(CallBackId);
                //阻塞100秒
                //超时就抛出异常
                if (block.WaitOne(Constants.ThreadAbortJoinTime) == false)
                {
                    result1 = StepResult.Failed;
                    throw new TaskFailedException(SequenceIndex, "CallBack has exceeded waiting Time", FailedType.RuntimeError);
                }

                //没超时,就获得消息
                CallBackMessage callBackMsg = Context.CallBackEventManager.GetMessageDisposeBlock(CallBackId);
                //回调成功
                if (callBackMsg.SuccessFlag)
                {
                    result1 = StepResult.Pass;
                }
                //回调不成功
                else
                {
                    result1 = StepResult.Failed;
                    // 抛出强制失败异常
                    throw new TaskFailedException(SequenceIndex, "CallBack failed", FailedType.RuntimeError);
                }
            }
            #endregion
            #region 异步:不管master直接通过步骤
            else
            {
                result1 = StepResult.Pass;
            }
            // 停止计时
            EndTiming();
            #endregion
            StepResult result = result1;
            return(result);
        }
コード例 #9
0
 //同步:DownLinkMessageProcessor调用来告知message并取消阻塞
 internal void ReleaseBlock(CallBackMessage message)
 {
     lock (_blockerLocker)
     {
         Thread.MemoryBarrier();
         //判断slave是否已超过等待时间, _blockerMapper里就会没有键值对
         if (!_blockerMapper.ContainsKey(message.CallBackId))
         {
             return;
         }
         lock (_messageLocker)
         {
             _messageMapper.Add(message.CallBackId, message);
         }
         _blockerMapper[message.CallBackId].Set();
     }
 }
コード例 #10
0
        public void ProcessCallBackMessage(CallBackMessage message)
        {
            var result = PostManager.PostRequest(message.Url, message.PlayLoad);

            if (result.Success)
            {
                UpdateJobStatus(message.JobId, message.UpdateJobStatusUrl, ResultStatus.Success);
            }
            else
            {
                UpdateJobStatus(message.JobId, message.UpdateJobStatusUrl, ResultStatus.Error);
                var msg = GetBadResultMessage(result.Result);

                _consumerEventLog.WriteEntry("Fail to update job status (" + message.JobId + "): " + msg);
            }

            CompleteJob(message.JobId, message.CompleteJobUrl);
        }
コード例 #11
0
        public JobDetail CreateJob(JobDetail detail, string doJobUrl, string updateStatusUrl, string completeJobUrl)
        {
            var job = new Job()
            {
                Id = Guid.NewGuid(),
                RequestDateTime   = detail.RequestDateTime,
                CompletedDateTime = detail.CompletedDateTime
            };

            job = MyDbContext.Jobs.Add(job);
            MyDbContext.SaveChanges();

            try
            {
                var messageSender   = new MessageSender("testqueue");
                var callBackMessage = new CallBackMessage()
                {
                    Url                = doJobUrl,
                    PlayLoad           = "abcd",
                    JobId              = job.Id.ToString(),
                    UpdateJobStatusUrl = updateStatusUrl,
                    CompleteJobUrl     = completeJobUrl
                };
                messageSender.SendMessage(callBackMessage, job.Id.ToString());

                detail.Id = job.Id;
                detail.ProcessResult.Messages.Add("Job Created.");

                return(detail);
            }
            catch (Exception e)
            {
                detail.ProcessResult.Errors.Add("Fail to crete job: " + e.Message + "\n" + e.StackTrace);
                job.ProcessStatus = ProcessStatus.FailToPublish;
                MyDbContext.SaveChanges();
                return(detail);
            }
        }
コード例 #12
0
 private void ProcessCallBackMessage(CallBackMessage message)
 {
     _context.CallBackEventManager.ReleaseBlock(message);
 }
コード例 #13
0
ファイル: SSNetSDK.cs プロジェクト: Strongc/sencond
 public static extern bool XNS_DEV_SetMessCallBack([MarshalAs(UnmanagedType.FunctionPtr)] CallBackMessage cbMessage, [MarshalAs(UnmanagedType.FunctionPtr)] CallBackDetect cbDetect);