protected async Task CreateBuildEngineBuildAsync(Product product) { await ResetPreviousBuildAsync(product); BuildResponse buildResponse = null; if (SetBuildEngineEndpoint(product.Project.Organization)) { buildResponse = BuildEngineApi.CreateBuild(product.WorkflowJobId); } if ((buildResponse != null) && (buildResponse.Id != 0)) { product.WorkflowBuildId = buildResponse.Id; var productBuild = new ProductBuild { ProductId = product.Id, BuildId = product.WorkflowBuildId }; await ProductBuildRepository.CreateAsync(productBuild); await ProductRepository.UpdateAsync(product); var monitorJob = Job.FromExpression <BuildEngineBuildService>(service => service.CheckBuild(product.Id)); RecurringJobManager.AddOrUpdate(GetHangfireToken(product.Id), monitorJob, "* * * * *"); } else { // TODO: Send Notification // Throw Exception to force retry throw new Exception("Create build failed"); } }
public void CreateJob() { var filterValue = "YYY"; var value = Expression.Constant(filterValue); var prm = Expression.Parameter(typeof(SamplePlugin.Plugin), "output"); ParameterExpression[] pe = new ParameterExpression[] { prm }; Type[] types = new Type[] { typeof(string), typeof(string) }; var run = typeof(SamplePlugin.Plugin).GetMethod(nameof(SamplePlugin.Plugin.Kuk), types); var nameJob = string.Empty; if (false) { MethodCallExpression body = Expression.Call(Expression.Constant(new SamplePlugin.Plugin()), run, value, Expression.Constant("0")); Expression <Action <SamplePlugin.Plugin> > lambda = Expression.Lambda <Action <SamplePlugin.Plugin> >(body, "robot", pe); nameJob = hfClient.Create <SamplePlugin.Plugin>(lambda, new Hangfire.States.EnqueuedState()); //hfClient.Schedule(lambda, TimeSpan.FromSeconds(30)); //RecurringJob.AddOrUpdate("sample", lambda, Cron.Minutely); } else { Hangfire.Common.Job job = new Hangfire.Common.Job(run, "sss", "0"); JobUpdate("testR1", job, "* * * * *"); //nameJob = hfClient.Create(job, new Hangfire.States.EnqueuedState()); } Console.WriteLine($"nameJob = {nameJob}"); //hfClient.Requeue(nameJob); }
protected async Task CreateBuildEngineProjectAsync(Project project) { var buildEngineProject = new BuildEngineProject { UserId = project.Owner.Email, GroupId = project.Group.Abbreviation, AppId = project.Type.Name, LanguageCode = project.Language, PublishingKey = project.Owner.PublishingKey, ProjectName = project.Name }; ProjectResponse projectResponse = null; if (SetBuildEngineEndpoint(project.Organization)) { projectResponse = BuildEngineApi.CreateProject(buildEngineProject); } if ((projectResponse != null) && (projectResponse.Id != 0)) { // Set state to active? project.WorkflowProjectId = projectResponse.Id; await ProjectRepository.UpdateAsync(project); var monitorJob = Job.FromExpression <BuildEngineProjectService>(service => service.ManageProject(project.Id)); RecurringJobManager.AddOrUpdate(GetHangfireToken(project.Id), monitorJob, "* * * * *"); } else { // TODO: Send Notification // Throw Exception to force retry throw new Exception("Create project failed"); } }
protected async Task CreateBuildEngineReleaseAsync(Product product, string channel) { var release = new Release { Channel = channel }; ClearRecurringJob(product.Id); ReleaseResponse releaseResponse = null; if (SetBuildEngineEndpoint(product.Project.Organization)) { releaseResponse = BuildEngineApi.CreateRelease(product.WorkflowJobId, product.WorkflowBuildId, release); } if ((releaseResponse != null) && (releaseResponse.Id != 0)) { product.WorkflowPublishId = releaseResponse.Id; await ProductRepository.UpdateAsync(product); var monitorJob = Job.FromExpression <BuildEngineReleaseService>(service => service.CheckRelease(product.Id)); RecurringJobManager.AddOrUpdate(GetHangfireToken(product.Id), monitorJob, "* * * * *"); } else { // TODO: Send Notification // Throw Exception to force retry throw new Exception("Create release failed"); } }
protected async Task CreateBuildEngineReleaseAsync(Product product, Dictionary <string, object> paramsDictionary, PerformContext context) { var channel = GetChannel(paramsDictionary); var targets = GetTargets(paramsDictionary, "google-play"); var environment = GetEnvironment(paramsDictionary); environment["PRODUCT_ID"] = product.Id.ToString(); environment["PROJECT_ID"] = product.ProjectId.ToString(); var release = new Release { Channel = channel, Targets = targets, Environment = environment }; ClearRecurringJob(product.Id); ReleaseResponse releaseResponse = null; if (SetBuildEngineEndpoint(product.Project.Organization)) { releaseResponse = BuildEngineApi.CreateRelease(product.WorkflowJobId, product.WorkflowBuildId, release); } if ((releaseResponse != null) && (releaseResponse.Id != 0)) { product.WorkflowPublishId = releaseResponse.Id; await ProductRepository.UpdateAsync(product); var build = await BuildRepository.Get().Where(b => b.BuildId == product.WorkflowBuildId).FirstOrDefaultAsync(); if (build == null) { throw new Exception($"Failed to find ProductBuild: {product.WorkflowBuildId}"); } var publish = new ProductPublication { ProductId = product.Id, ProductBuildId = build.Id, ReleaseId = releaseResponse.Id, Channel = channel }; await PublicationRepository.CreateAsync(publish); var monitorJob = Job.FromExpression <BuildEngineReleaseService>(service => service.CheckRelease(product.Id)); RecurringJobManager.AddOrUpdate(GetHangfireToken(product.Id), monitorJob, "* * * * *"); } else { var messageParms = new Dictionary <string, object>() { { "projectName", product.Project.Name }, { "productName", product.ProductDefinition.Name } }; await SendNotificationOnFinalRetryAsync(context, product.Project.Organization, product.Project.Owner, "releaseFailedUnableToCreate", messageParms); // Throw Exception to force retry throw new Exception("Create release failed"); } }
public void JobUpdate(string recurringJobId, Hangfire.Common.Job job, string interval) { var manager = new RecurringJobManager(); //manager.RemoveIfExists("my-job-id"); manager.AddOrUpdate(recurringJobId, job, interval); manager.Trigger(recurringJobId); }
string IBackgroundJobClient.Create(Hangfire.Common.Job job, IState state) { var tenantId = TenantId; var jobId = Inner.Create(job, state); var j = GDB.Job.Find(int.Parse(jobId)); j.TenantId = tenantId; j.ContactId = CurrentUser?.User?.ContactId; j.RecurringJobId = JobInfoFinder?.JobInfo?.RecurringJobId; GDB.SaveChanges(); return(jobId); }
protected async Task CreateBuildEngineBuildAsync(Product product, Dictionary <string, object> parmsDictionary, PerformContext context) { await ResetPreviousBuildAsync(product); BuildResponse buildResponse = null; if (SetBuildEngineEndpoint(product.Project.Organization)) { var targets = GetTargets(parmsDictionary, "apk play-listing"); var environment = GetEnvironment(parmsDictionary); environment["PRODUCT_ID"] = product.Id.ToString(); environment["PROJECT_ID"] = product.ProjectId.ToString(); var build = new Build { Targets = targets, Environment = environment }; buildResponse = BuildEngineApi.CreateBuild(product.WorkflowJobId, build); } if ((buildResponse != null) && (buildResponse.Id != 0)) { product.WorkflowBuildId = buildResponse.Id; var productBuild = new ProductBuild { ProductId = product.Id, BuildId = product.WorkflowBuildId }; await ProductBuildRepository.CreateAsync(productBuild); await ProductRepository.UpdateAsync(product); var monitorJob = Job.FromExpression <BuildEngineBuildService>(service => service.CheckBuild(product.Id)); RecurringJobManager.AddOrUpdate(GetHangfireToken(product.Id), monitorJob, "* * * * *"); } else { var messageParms = new Dictionary <string, object>() { { "projectName", product.Project.Name }, { "productName", product.ProductDefinition.Name } }; await SendNotificationOnFinalRetryAsync(context, product.Project.Organization, product.Project.Owner, "buildFailedUnableToCreate", messageParms); // Throw Exception to force retry throw new Exception("Create build failed"); } }
protected async Task CreateBuildEngineProjectAsync(Project project, PerformContext context) { var buildEngineProject = new BuildEngineProject { UserId = project.Owner.Email, GroupId = project.Group.Abbreviation, AppId = project.Type.Name, LanguageCode = project.Language, PublishingKey = project.Owner.PublishingKey, ProjectName = project.Name }; ProjectResponse projectResponse = null; if (SetBuildEngineEndpoint(project.Organization)) { projectResponse = BuildEngineApi.CreateProject(buildEngineProject); } if ((projectResponse != null) && (projectResponse.Id != 0)) { // Set state to active? project.WorkflowProjectId = projectResponse.Id; await ProjectRepository.UpdateAsync(project); var monitorJob = Job.FromExpression <BuildEngineProjectService>(service => service.ManageProject(project.Id, null)); RecurringJobManager.AddOrUpdate(GetHangfireToken(project.Id), monitorJob, "* * * * *"); } else { if (IsFinalRetry(context)) { var messageParms = new Dictionary <string, object>() { { "projectName", project.Name } }; await SendNotificationSvc.SendNotificationToOrgAdminsAndOwnerAsync(project.Organization, project.Owner, "projectFailedUnableToCreate", messageParms); } // Throw Exception to force retry throw new Exception("Create project failed"); } }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IBackgroundJobClient backgroundJobs, IHostingEnvironment env) { //if (env.IsDevelopment()) //{ // app.UseDeveloperExceptionPage(); //} //else //{ // app.UseExceptionHandler("/Error"); // // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. // app.UseHsts(); //} app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); // 將console的結果呈現在dashboard app.UseHangfireDashboard(); //backgroundJobs.Enqueue(() => Console.WriteLine("Hello world from Hangfire!")); //RecurringJob.AddOrUpdate(() => Console.Write("Easy!"), Cron.Minutely); //移除排程工作 RecurringJob.RemoveIfExists("Console.Write"); var manager = new RecurringJobManager(); manager.AddOrUpdate("2", Job.FromExpression(() => ExecutePowershell()), Cron.Minutely()); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
protected async Task CreateBuildEngineReleaseAsync(Product product, string channel, PerformContext context) { var release = new Release { Channel = channel }; ClearRecurringJob(product.Id); ReleaseResponse releaseResponse = null; if (SetBuildEngineEndpoint(product.Project.Organization)) { releaseResponse = BuildEngineApi.CreateRelease(product.WorkflowJobId, product.WorkflowBuildId, release); } if ((releaseResponse != null) && (releaseResponse.Id != 0)) { product.WorkflowPublishId = releaseResponse.Id; await ProductRepository.UpdateAsync(product); var monitorJob = Job.FromExpression <BuildEngineReleaseService>(service => service.CheckRelease(product.Id)); RecurringJobManager.AddOrUpdate(GetHangfireToken(product.Id), monitorJob, "* * * * *"); } else { var messageParms = new Dictionary <string, object>() { { "projectName", product.Project.Name }, { "productName", product.ProductDefinition.Name } }; await SendNotificationOnFinalRetryAsync(context, product.Project.Organization, product.Project.Owner, "releaseFailedUnableToCreate", messageParms); // Throw Exception to force retry throw new Exception("Create release failed"); } }
string ITraffkRecurringJobManager.Add(Hangfire.Common.Job job, string cronExpression) { var tenantId = Finder.GetTenantIdAsync().ExecuteSynchronously(); var contactId = CurrentUser?.User?.ContactId; var recurringJobId = GetRecurringJobId(); var q = job.Method.GetCustomAttributes(false).OfType <QueueAttribute>().FirstOrDefault() ?? job.Type.GetCustomAttribute <QueueAttribute>(); var options = new RecurringJobOptions { QueueName = q?.Queue, }; RecurringJobManager.AddOrUpdate(recurringJobId, job, cronExpression, options); GDB.Hash.Add(new HangfireHash { Key = "recurring-job:" + recurringJobId, Field = "TenantId", Value = tenantId.ToString() }); if (contactId != null) { GDB.Hash.Add(new HangfireHash { Key = "recurring-job:" + recurringJobId, Field = "ContactId", Value = contactId.ToString() }); } GDB.SaveChanges(); return(recurringJobId); }
void ITraffkRecurringJobManager.Update(string recurringJobId, Hangfire.Common.Job job, string cronExpression) { //TODO: Make sure recurringJobId actually exists - need to read Hangfire.Hash table }