【问题标题】:Quartz Job Context value getting replacedQuartz Job Context 值被替换
【发布时间】:2021-07-10 21:20:25
【问题描述】:

目标: 我想在提交数据后提交用户详细信息需要异步发送2条短信给用户。

问题:

  1. IJobExecutionContext 值被最后调用的方法替换 - 例子 smsaftersubmit(userId, vehiId, "Booking"); - 此方法替换为最后一个方法,即 smsaftersubmit(userId, vehiId, cusId, "Coonfirmation");

  2. 我创建了异步石英作业,如果我使用 2 个不同的浏览器同时运行该作业,则只有 1 个作业正在执行,另一个作业被跳过。

//calling an job when i submit the user registration form. 
public string DataSubmit()
{
    smsaftersubmit(userId, vehiId, "Booking");
    smsaftersubmit(userId, vehiId, cusId, "Coonfirmation");
}

public void smsaftersubmit(long id, long vehicleId, long custId, string smsType)
{
    IScheduler autosmsScheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
    autosmsScheduler.Start();
    IJobDetail jobDetail = JobBuilder.Create<autofiresms>().Build();
    ITrigger trigger = TriggerBuilder.Create().WithIdentity("DispoAutoSMSTrigger", "DispoAutoSMSGroup")
        .StartNow().WithSimpleSchedule().Build();


    autosmsScheduler.Context.Put("id", id);
    autosmsScheduler.Context.Put("vehicleId", vehicleId);
    autosmsScheduler.Context.Put("smsType", smsType);

    autosmsScheduler.ScheduleJob(jobDetail, trigger);

}

//IJOB -- autofiresms
public class AutoSMSJob : IJob
{
    Logger logger = LogManager.GetLogger("apkRegLogger");
    public async Task Execute(IJobExecutionContext context)
    {
        try
        {
            JobDataMap smsParameter = context.JobDetail.JobDataMap;
            long id, vehicleId;
            string smsType;

            id = context.Scheduler.Context.GetLong("id");
            vehicleId = context.Scheduler.Context.GetLong("vehicleId");
            smsType = context.Scheduler.Context.GetString("smsType");

           // fetching sms template and from mysql and passing it to an API
        }
        catch (Exception ex)
        {
        }
        logger.Info("\n\n  Code Ended: " + DateTime.Now);
    }
}

我是石英调度的新手,请帮我解决这个问题..

【问题讨论】:

    标签: c# entity-framework model-view-controller quartz.net


    【解决方案1】:

    您现在将值放入全局调度程序上下文。您应该改用作业或触发器上下文。对于您的用例,我相信将这些添加到触发级别(每个作业调用可以有不同的值)。

    ITrigger trigger = TriggerBuilder.Create()
        .WithIdentity("DispoAutoSMSTrigger", "DispoAutoSMSGroup")
        .StartNow()
        .WithSimpleSchedule()
        .UsingJobData("id", id)
        .UsingJobData("vehicleId", vehicleId)
        .UsingJobData("smsType", smsType)
        .Build();
    

    【讨论】:

    • 谢谢。有效。我需要动态更改触发器名称吗?!同一个触发器可能会调用不止一次。同时。它应该完成所有任务而不影响正在运行的作业。
    • 您创建的每个触发器都需要一个唯一的名称。您还可以使用IScheduler.TriggerJob,它允许您传递作业数据映射并生成具有唯一名称的触发器。TriggerJob 将创建一个立即触发的触发器。
    猜你喜欢
    • 2011-08-23
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多