public void AddTask(SchedulerRequest schedulerRequest, ModuleClient moduleClient, Func <SchedulerRequest, ModuleClient, CancellationToken, Task> action)
        {
            var tokenSource = new CancellationTokenSource();

            _tokenDictionary.Add(schedulerRequest.Context.ScheduleId, tokenSource);
            _tasks.Add(Task.Run(() => action(schedulerRequest, moduleClient, tokenSource.Token)));
        }
Beispiel #2
0
        public async Task Run()
        {
            var subscriptionId = await _jobDependencies.PublisherApiService.Subscribe(_publisher, _jobDependencies.CancellationToken);

            _publisher.ActualState    = ActualPublisherState.Subscribed;
            _publisher.SubscriptionId = subscriptionId;

            var context = new ElapsedScheduleMessage()
            {
                Context    = subscriptionId,
                ScheduleId = Guid.NewGuid().ToString(),
                JobName    = Constants.JobNames.HealthCheck
            };

            var schedulerRequest = new SchedulerRequest()
            {
                OutputName = Constants.Outputs.Subscriber,
                Repeat     = true,
                RunTime    = TimeSpan.FromSeconds(30),
                Context    = context
            };

            await _jobDependencies.SchedulerService.ScheduleJob(schedulerRequest, _jobDependencies.CancellationToken);

            _publisher.HealthScheduleId = context.ScheduleId;

            Console.Out.WriteLine($"Subscription: {subscriptionId} created for {_publisher.Id}");
        }
        public async Task ScheduleJob(SchedulerRequest schedulerRequest, CancellationToken cancellationToken)
        {
            var bytes   = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(schedulerRequest));
            var message = new Message(bytes);

            message.Properties.Add(Constants.PropertyNames.RequestType, Constants.Scheduler.ScheduleRequest);
            await _moduleClient.SendEventAsync(Constants.Outputs.Scheduler, message, cancellationToken);
        }
 public async Task ScheduleJob(SchedulerRequest schedulerRequest, CancellationToken cancellationToken)
 {
     await _edgeService.SendMessageToOutput(
         Constants.Outputs.Scheduler,
         JsonConvert.SerializeObject(schedulerRequest),
         cancellationToken,
         NameValue.Create(Constants.PropertyNames.RequestType, Constants.Scheduler.ScheduleRequest));
 }
Beispiel #5
0
        public void Execute(IJobExecutionContext context)
        {
            //获得requestUrl和requestType
            JobDataMap dataMap = context.JobDetail.JobDataMap;
            string     jobJson = dataMap.GetString("jobJson");
            var        result  = JsonConvert.DeserializeObject <SchedulerRequest>(jobJson);

            try
            {
                var        resultMsg = string.Empty;
                HttpClient client    = new HttpClient();
                //GET请求
                if (result.RequestType == (int)JobEnum.RequestType.Get)
                {
                    resultMsg = client.GetAsync(result.RequestUrl).Result.Content.ReadAsStringAsync().Result;
                }
                //POST请求
                else if (result.RequestType == (int)JobEnum.RequestType.Post)
                {
                    SchedulerRequest re = new SchedulerRequest();
                    var content         = JsonConvert.SerializeObject(re);
                    resultMsg = client.PostAsync(result.RequestUrl, new StringContent(content)).Result.Content.ReadAsStringAsync().Result;
                }
                //记录返回信息
                LogWriter.info("ExecuteTime:" + DateTime.Now.ToString() + ";JobName" + result.JobName + ";" + resultMsg);

                //保存结果到数据库
                if (resultMsg.ToUpper().Contains("SUCCESS"))
                {
                    result.LogStatus = (int)JobEnum.LogStatus.SuccessInfo;
                    result.ReturnMsg = "SUCCESS";
                }
                else
                {
                    result.LogStatus = (int)JobEnum.LogStatus.FailedInfo;
                    result.ReturnMsg = "FAIL";
                }
                SchedulerConfigQuery.InsertLog(result);
            }
            catch (Exception ex)
            {
                //设置将自动去除这个任务的触发器,所以这个任务不会再执行
                //JobExecutionException ex_job = new JobExecutionException(ex);
                //ex_job.UnscheduleAllTriggers = true;
                //保存到数据库
                var message = new LogMessage {
                    MessageKey = "Job-Execute", MessageBody = result, Exception = ex.ToString()
                };
                LogWriter.error("Execute-Exception:" + ex.ToString());
                result.ReturnMsg = "Execute-Exception";
                result.LogStatus = (int)JobEnum.LogStatus.ExceptInfo;
                SchedulerConfigQuery.InsertLog(result);
            }
        }
Beispiel #6
0
        public void Execute(IJobExecutionContext context)
        {
            //获得requestUrl和requestType
            JobDataMap dataMap = context.JobDetail.JobDataMap;
            string     jobJson = dataMap.GetString("jobJson");

            writeLog($"jobJson:{ jobJson}");
            var result = JsonConvert.DeserializeObject <SchedulerRequest>(jobJson);

            try
            {
                writeLog($"jobJson:{ result.RequestUrl}", "1");
                var        resultMsg = string.Empty;
                HttpClient client    = new HttpClient();
                //GET请求
                if (result.RequestType == (int)JobEnum.RequestType.Get)
                {
                    resultMsg = client.GetAsync(result.RequestUrl).Result.Content.ReadAsStringAsync().Result;
                    writeLog($"GET请求resultMsg:{ resultMsg}");
                }
                //POST请求
                else if (result.RequestType == (int)JobEnum.RequestType.Post)
                {
                    SchedulerRequest re = new SchedulerRequest();
                    var content         = JsonConvert.SerializeObject(re);
                    resultMsg = client.PostAsync(result.RequestUrl, new StringContent(content)).Result.Content.ReadAsStringAsync().Result;
                    writeLog($"POST请求resultMsg:{ resultMsg}");
                }
                //保存结果到数据库
                if (resultMsg.ToUpper().Contains("SUCCESS"))
                {
                    result.LogStatus = (int)JobEnum.LogStatus.SuccessInfo;
                }
                else
                {
                    result.LogStatus = (int)JobEnum.LogStatus.FailedInfo;
                }
                result.ReturnMsg = resultMsg.Length > 800 ? resultMsg.Substring(0, 800) : resultMsg;
                SchedulerConfigDB.InsertLog(result);
            }
            catch (Exception ex)
            {
                //设置将自动去除这个任务的触发器,所以这个任务不会再执行
                //JobExecutionException ex_job = new JobExecutionException(ex);
                //ex_job.UnscheduleAllTriggers = true;
                //保存到数据库
                result.ReturnMsg = "IJob-Exception: " + (ex.ToString().Length > 450 ? ex.ToString().Substring(0, 450) : ex.ToString());
                result.LogStatus = (int)JobEnum.LogStatus.ExceptInfo;
                SchedulerConfigDB.InsertLog(result);
            }
        }
Beispiel #7
0
        private SchedulerRequest CreateRequest(string subscriptionId, string scheduleId, string jobName)
        {
            var scheduleReqeust = new SchedulerRequest();

            scheduleReqeust.OutputName = Constants.Outputs.PubSubSimulator;
            scheduleReqeust.Repeat     = true;
            scheduleReqeust.RunTime    = TimeSpan.FromSeconds(15);
            scheduleReqeust.Context    = new ElapsedScheduleMessage()
            {
                Context    = subscriptionId,
                JobName    = jobName,
                ScheduleId = scheduleId
            };
            return(scheduleReqeust);
        }
Beispiel #8
0
        public static bool InsertLog(SchedulerRequest request)
        {
            int           num = 0;
            SqlConnection con = SqlHelper.GetConnection();

            StringBuilder sb = new StringBuilder();

            sb.Append(" insert into SchedulerLog (JobGroup,JobName,RequestType,RequestUrl,ReturnMsg,Status,CreateTime) ");
            sb.Append(" values(@JobGroup, @JobName, @RequestType, @RequestUrl, @ReturnMsg,@Status,@CreateTime) ");
            SqlParameter[] param = new SqlParameter[]
            {
                new SqlParameter("@JobGroup", request.JobGroup),
                new SqlParameter("@JobName", request.JobName),
                new SqlParameter("@RequestType", request.RequestType),
                new SqlParameter("@RequestUrl", request.RequestUrl),
                new SqlParameter("@ReturnMsg", request.ReturnMsg),
                new SqlParameter("@Status", request.LogStatus),
                new SqlParameter("@CreateTime", DateTime.Now)
            };
            num = SqlHelper.ExecuteNonQuery(con, CommandType.Text, sb.ToString(), param);

            return(num > 0 ? true : false);
        }
Beispiel #9
0
        /// <summary>
        /// 执行Job方法
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        private bool ExecuteWebApi(SchedulerConfigModel list)
        {
            try
            {
                var             flag      = true;
                SchedulerHelper scheduler = new SchedulerHelper();

                SchedulerRequest request = new SchedulerRequest();
                request.JobName          = list.JobName;
                request.JobGroup         = list.JobGroup;
                request.TriggerName      = list.JobName + "Trigger";
                request.TriggerGroupName = list.JobGroup + "Trigger";
                request.CronTab          = list.CronTab;
                request.StartTime        = list.StartTime;
                if (list.EndTime != null)
                {
                    request.EndTime = list.EndTime;
                }
                else
                {
                    request.EndTime = null;
                }
                request.RequestType = list.RequestType;
                request.RequestUrl  = list.RequestUrl;

                var json = JsonConvert.SerializeObject(request);

                DateTimeOffset?end = null;
                if (request.EndTime != null)
                {
                    end = DateTime.SpecifyKind(Convert.ToDateTime(request.EndTime), DateTimeKind.Local);
                    if (request.EndTime < DateTime.Now)
                    {
                        flag = false;
                    }
                }
                if (flag)
                {
                    IJobDetail jobDetail = JobBuilder.Create <JobMethod>()
                                           .WithIdentity(request.JobName, request.JobGroup)
                                           .UsingJobData("jobJson", json)
                                           .Build();

                    CronTriggerImpl tigger = (CronTriggerImpl)TriggerBuilder.Create()
                                             .WithIdentity(request.TriggerName, request.TriggerGroupName)
                                             .WithCronSchedule(request.CronTab)
                                             .ForJob(request.JobName, request.JobGroup)
                                             .StartNow()
                                             .EndAt(end)
                                             .Build();

                    DateTimeOffset dt = scheduler.scheduleJob(jobDetail, tigger);

                    LogWriter.info("[" + (request.RequestType == (int)JobEnum.RequestType.Get ? "GET" : "POST") + "]Job-" + request.JobName + "已启动,定时运行时间为:" + Convert.ToDateTime(dt.ToString()) + ",请求地址:" + request.RequestUrl);
                }
                else
                {
                    LogWriter.info("[" + (request.RequestType == (int)JobEnum.RequestType.Get ? "GET" : "POST") + "]Job-" + request.JobName + ",当前时间超出此Job设置的执行结束时间,该Job已停止执行,请求地址:" + request.RequestUrl);
                }

                return(true);
            }
            catch (Exception ex)
            {
                LogWriter.error("Job-" + list.JobName + "执行异常,请求地址:" + list.RequestUrl + ",异常信息:" + ex.ToString());
                //插入日志
                SchedulerRequest request = new SchedulerRequest();
                request.JobGroup    = list.JobGroup;
                request.JobName     = list.JobName;
                request.RequestType = list.RequestType;
                request.RequestUrl  = list.RequestUrl;
                request.ReturnMsg   = "Job-Exception: " + (ex.ToString().Length > 490 ? ex.ToString().Substring(0, 490) : ex.ToString());
                request.LogStatus   = (int)JobEnum.LogStatus.ExceptInfo;
                SchedulerConfigQuery.InsertLog(request);
                //数据状态更新为0,防止重复执行
                SchedulerConfigQuery.UpdateStatus(list.ID);
                return(false);
            }
        }
Beispiel #10
0
      private bool ExecuteWebApi(SchedulerConfigModel list)
      {
          try
          {
              var             flag      = true;
              SchedulerHelper scheduler = new SchedulerHelper();

              SchedulerRequest request = new SchedulerRequest();
              request.JobName          = list.JobName;
              request.JobGroup         = list.JobGroup;
              request.TriggerName      = list.JobName + "Trigger";
              request.TriggerGroupName = list.JobGroup + "Trigger";
              request.CronTab          = list.CronTab;
              request.StartTime        = list.StartTime;
              if (list.EndTime != null)
              {
                  request.EndTime = list.EndTime;
              }
              else
              {
                  request.EndTime = null;
              }
              request.RequestType = list.RequestType;
              request.RequestUrl  = list.RequestUrl;

              var json = JsonConvert.SerializeObject(request);

              DateTimeOffset?end = null;
              if (request.EndTime != null)
              {
                  end = DateTime.SpecifyKind(Convert.ToDateTime(request.EndTime), DateTimeKind.Local);
                  if (request.EndTime < DateTime.Now)
                  {
                      flag = false;
                  }
              }
              if (flag)
              {
                  IJobDetail jobDetail = JobBuilder.Create <FileJob>()
                                         .WithIdentity(request.JobName, request.JobGroup)
                                         .UsingJobData("jobJson", json)
                                         .Build();

                  CronTriggerImpl tigger = (CronTriggerImpl)TriggerBuilder.Create()
                                           .WithIdentity(request.TriggerName, request.TriggerGroupName)
                                           .WithCronSchedule(request.CronTab)
                                           .ForJob(request.JobName, request.JobGroup)
                                           .StartNow()
                                           .EndAt(end)
                                           .Build();

                  DateTimeOffset dt = scheduler.scheduleJob(jobDetail, tigger);
              }
              else
              {
              }

              return(true);
          }
          catch (Exception ex)
          {
              //插入日志
              SchedulerRequest request = new SchedulerRequest();
              request.JobGroup    = list.JobGroup;
              request.JobName     = list.JobName;
              request.RequestType = list.RequestType;
              request.RequestUrl  = list.RequestUrl;
              request.ReturnMsg   = "Job-Exception: " + (ex.ToString().Length > 450 ? ex.ToString().Substring(0, 450) : ex.ToString());
              request.LogStatus   = (int)JobEnum.LogStatus.ExceptInfo;
              SchedulerConfigDB.InsertLog(request);
              //数据状态更新为0,防止重复执行
              SchedulerConfigDB.UpdateStatus(list.ID);
              return(false);
          }
      }
        /// <summary>
        /// Run scheduler endpoint
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public SchedulerResponse RunScheduler(SchedulerRequest request)
        {
            Resource <SchedulerRequest, SchedulerResponse> resource = BuildResource <SchedulerRequest, SchedulerResponse>();

            return(ExecuteRequest <SchedulerRequest, SchedulerResponse>(resource, ReportEndPoints.Scheduler, request));
        }
 public Schedule(SchedulerRequest request)
 {
     Request     = request;
     NextRunTime = DateTimeOffset.Now.Add(Request.RunTime);
 }
Beispiel #13
0
        /// <summary>
        /// Next scheduler Get the next scheduling time for hash submissions to the blockchain.
        /// </summary>
        /// <exception cref="IO.Swagger.Client.ApiException">Thrown when fails to make API call</exception>
        /// <param name="authorization">A valid API key is essential for authorization to handle the request.</param>
        /// <param name="schedulerRequest">Request DTO for next schedules.</param>
        /// <returns>Task of ApiResponse (DefaultSchedulerResponse)</returns>
        public async System.Threading.Tasks.Task <ApiResponse <DefaultSchedulerResponse> > GetNextSchedulingTimeAsyncWithHttpInfo(string authorization, SchedulerRequest schedulerRequest)
        {
            // verify the required parameter 'authorization' is set
            if (authorization == null)
            {
                throw new ApiException(400, "Missing required parameter 'authorization' when calling SchedulerApi->GetNextSchedulingTime");
            }
            // verify the required parameter 'schedulerRequest' is set
            if (schedulerRequest == null)
            {
                throw new ApiException(400, "Missing required parameter 'schedulerRequest' when calling SchedulerApi->GetNextSchedulingTime");
            }

            var    localVarPath         = "/v3/submission/times";
            var    localVarPathParams   = new Dictionary <String, String>();
            var    localVarQueryParams  = new List <KeyValuePair <String, String> >();
            var    localVarHeaderParams = new Dictionary <String, String>(this.Configuration.DefaultHeader);
            var    localVarFormParams   = new Dictionary <String, String>();
            var    localVarFileParams   = new Dictionary <String, FileParameter>();
            Object localVarPostBody     = null;

            // to determine the Content-Type header
            String[] localVarHttpContentTypes = new String[] {
                "application/json"
            };
            String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes);

            // to determine the Accept header
            String[] localVarHttpHeaderAccepts = new String[] {
                "application/json"
            };
            String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts);

            if (localVarHttpHeaderAccept != null)
            {
                localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept);
            }

            if (authorization != null)
            {
                localVarHeaderParams.Add("Authorization", this.Configuration.ApiClient.ParameterToString(authorization));                        // header parameter
            }
            if (schedulerRequest != null && schedulerRequest.GetType() != typeof(byte[]))
            {
                localVarPostBody = this.Configuration.ApiClient.Serialize(schedulerRequest); // http body (model) parameter
            }
            else
            {
                localVarPostBody = schedulerRequest; // byte array
            }

            // authentication (API Key Authorization) required
            if (!String.IsNullOrEmpty(this.Configuration.GetApiKeyWithPrefix("Authorization")))
            {
                localVarHeaderParams["Authorization"] = this.Configuration.GetApiKeyWithPrefix("Authorization");
            }

            // make the HTTP request
            IRestResponse localVarResponse = (IRestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath,
                                                                                                            Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams,
                                                                                                            localVarPathParams, localVarHttpContentType);

            int localVarStatusCode = (int)localVarResponse.StatusCode;

            if (ExceptionFactory != null)
            {
                Exception exception = ExceptionFactory("GetNextSchedulingTime", localVarResponse);
                if (exception != null)
                {
                    throw exception;
                }
            }

            return(new ApiResponse <DefaultSchedulerResponse>(localVarStatusCode,
                                                              localVarResponse.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()),
                                                              (DefaultSchedulerResponse)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(DefaultSchedulerResponse))));
        }
Beispiel #14
0
        /// <summary>
        /// Next scheduler Get the next scheduling time for hash submissions to the blockchain.
        /// </summary>
        /// <exception cref="IO.Swagger.Client.ApiException">Thrown when fails to make API call</exception>
        /// <param name="authorization">A valid API key is essential for authorization to handle the request.</param>
        /// <param name="schedulerRequest">Request DTO for next schedules.</param>
        /// <returns>Task of DefaultSchedulerResponse</returns>
        public async System.Threading.Tasks.Task <DefaultSchedulerResponse> GetNextSchedulingTimeAsync(string authorization, SchedulerRequest schedulerRequest)
        {
            ApiResponse <DefaultSchedulerResponse> localVarResponse = await GetNextSchedulingTimeAsyncWithHttpInfo(authorization, schedulerRequest);

            return(localVarResponse.Data);
        }
Beispiel #15
0
        /// <summary>
        /// Next scheduler Get the next scheduling time for hash submissions to the blockchain.
        /// </summary>
        /// <exception cref="IO.Swagger.Client.ApiException">Thrown when fails to make API call</exception>
        /// <param name="authorization">A valid API key is essential for authorization to handle the request.</param>
        /// <param name="schedulerRequest">Request DTO for next schedules.</param>
        /// <returns>DefaultSchedulerResponse</returns>
        public DefaultSchedulerResponse GetNextSchedulingTime(string authorization, SchedulerRequest schedulerRequest)
        {
            ApiResponse <DefaultSchedulerResponse> localVarResponse = GetNextSchedulingTimeWithHttpInfo(authorization, schedulerRequest);

            return(localVarResponse.Data);
        }
Beispiel #16
0
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        static void Main()
        {
            //ServiceBase[] ServicesToRun;
            //ServicesToRun = new ServiceBase[]
            //{
            //    new JobManager()
            //};
            //ServiceBase.Run(ServicesToRun);

            //test Code
            //FileJob job = new FileJob();
            //job.Execute(null);

            #region
            List <SchedulerConfigModel> list1 = SchedulerConfigDB.GetSchedulerRecord((int)JobEnum.DataType.UpdateData);
            if (list1.Count > 0)
            {
                for (int i = 0; i < list1.Count; i++)
                {
                    var              list      = list1[i];
                    SchedulerHelper  scheduler = new SchedulerHelper();
                    var              flag      = true;
                    SchedulerRequest request   = new SchedulerRequest();
                    request.JobName          = list.JobName;
                    request.JobGroup         = list.JobGroup;
                    request.TriggerName      = list.JobName + "Trigger";
                    request.TriggerGroupName = list.JobGroup + "Trigger";
                    request.CronTab          = list.CronTab;
                    request.StartTime        = list.StartTime;
                    if (list.EndTime != null)
                    {
                        request.EndTime = list.EndTime;
                    }
                    else
                    {
                        request.EndTime = null;
                    }
                    request.RequestType = list.RequestType;
                    request.RequestUrl  = list.RequestUrl;
                    var json = JsonConvert.SerializeObject(request);
                    scheduler.IsExistsDelJob(request.JobName, request.JobGroup);
                    if (flag)
                    {
                        IJobDetail jobDetail = JobBuilder.Create <FileJob>()
                                               .WithIdentity(request.JobName, request.JobGroup)
                                               .UsingJobData("jobJson", json)
                                               .Build();

                        CronTriggerImpl tigger = (CronTriggerImpl)TriggerBuilder.Create()
                                                 .WithIdentity(request.TriggerName, request.TriggerGroupName)
                                                 .WithCronSchedule(request.CronTab)
                                                 .ForJob(request.JobName, request.JobGroup)
                                                 .StartNow()
                                                 .Build();

                        DateTimeOffset dt = scheduler.scheduleJob(jobDetail, tigger);
                    }
                }
            }
            #endregion
        }