//发送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); }
//执行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); } }
public void SendMessage(CallBackMessage message, string messageId) { var messageBody = JsonConvert.SerializeObject(message); var brokerMessage = new BrokeredMessage(messageBody); brokerMessage.MessageId = messageId; QueueClient.Send(brokerMessage); }
//发送成功与否的消息 private void SendMessage(CallBackMessage message, bool success) { CallBackMessage callbackMsg = new CallBackMessage(message.Name, message.Id, ((CallBackMessage)message).CallBackId) { SuccessFlag = success, }; _globalInfo.MessageTransceiver.Send(callbackMsg); }
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)); }
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); } }
// 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)); }
//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); }
//同步: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(); } }
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); }
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); } }
private void ProcessCallBackMessage(CallBackMessage message) { _context.CallBackEventManager.ReleaseBlock(message); }
public static extern bool XNS_DEV_SetMessCallBack([MarshalAs(UnmanagedType.FunctionPtr)] CallBackMessage cbMessage, [MarshalAs(UnmanagedType.FunctionPtr)] CallBackDetect cbDetect);