使用 Quartz .NET 和 c# 进行作业调度

问题描述 投票:0回答:1

我创建了一个作业调度程序,该调度程序每 10 分钟运行一次,并在表中存在数据时发送电子邮件。它在我的本地和我们的测试环境中工作正常,但当我将其部署到生产环境中时却无法工作

我的代码:

public static void Start()
{
    IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
    scheduler.Start();

    IJobDetail job = JobBuilder.Create<EmailTrigger>().Build();

    ITrigger trigger = TriggerBuilder.Create()
        .WithDailyTimeIntervalSchedule
        (s =>
          s.WithIntervalInMinutes(10)
          .OnEveryDay()
          .InTimeZone(TimeZoneInfo.Local) //added later
        )
        .Build();

    scheduler.ScheduleJob(job, trigger);
}

Global.asax.cs

    protected void Application_Start(object sender, EventArgs e)
    {
        risknucleus.DataLayer.cls_DataLayer obj = new risknucleus.DataLayer.cls_DataLayer();
       
        obj.execute("insert into EmailSendLogs(Message,Date) values('Global Page 
        Hit',getdate())");
        JobScheduler.Start();
    }

电子邮件触发器。 CS

public void Execute(IJobExecutionContext context)
{
    try
    {
        
        clsEmail objEmail = new clsEmail();
        if (dtLayer.getValueFromStaticConfiguration("EmailTriggerOnApproval", "N") == "Y")
        {
            dtLayer.execute(@"Insert into EmailSendLogs(Message,Description,Date) 
                             values ('Trigger started 1','Trigger started 1' , GetDate())");

            DataTable dtData = dtLayer.getDataTableFromQuery("select * from EmailSendData where IsSend is null");
            if (dtData.Rows.Count > 0)
            {
                for (int i = 0; i < dtData.Rows.Count; i++)
                {
                    dtLayer.execute(@"Insert into EmailSendLogs(Message,Description,Date) 
                             values ('Trigger started 2','Trigger started 2' , GetDate())");

                    string NomineeList = dtData.Rows[i]["NomineeUser"].ToString();
                    string FromEmpid = dtData.Rows[i]["FromEmpID"].ToString();
                    string EmailID = dtData.Rows[i]["EmailID"].ToString();
                    string url = dtData.Rows[i]["URL"].ToString();
                    string Type = dtData.Rows[i]["Type"].ToString();
                    string query = dtData.Rows[i]["EmailDetails"].ToString();
                    string UserID = dtData.Rows[i]["UserID"].ToString();
                    string NotificationID = dtData.Rows[i]["NotificationID"].ToString();
                    string CCMail = dtData.Rows[i]["CCMail"].ToString();
                    string ApprovalCode = dtData.Rows[i]["ApprovalCode"].ToString();
                    string Id = dtData.Rows[i]["ID"].ToString();

                    DataTable dtEmailDetails = dtLayer.getDataTableFromQuery(query);
                    ArrayList emailDetails = dtLayer.datatableTOarraylist(dtEmailDetails);
                    emailDetails.Add(ApprovalCode);

                    if (dtLayer.getValueFromStaticConfiguration("SendEmail", "N") == "Y")
                        objEmail.sendMailNewFunction(NomineeList, FromEmpid, EmailID, url, Type, "", emailDetails, UserID, false, null, NotificationID, CCMail);

                    dtLayer.execute("update EmailSendData set isSend='Y' where ID= " + Id + " ");

                }
            }
            else
            {

                dtLayer.execute(@"Insert into EmailSendLogs(Message,Description,Date) 
                             values ('Job ran successfully','No approved cases pending' , GetDate())");
            }
        }
    }
    catch (Exception e)
    {
        dtLayer.execute(@"Insert into EmailSendLogs(Message,Description,Date) 
             values (" + dtLayer.checkNull(e.ToString()) + ",'Exception Catch',GetDate())");
        throw e;
    }
}

如您所见,我正在维护日志以检查全局 asax 页面是否已正确更新,并在我的 emaitrigger 中添加一些日志。因此,即使 dtData 不返回任何内容,它也应该在 EmailSendLogs 表中的数据库中创建一个条目。我登录到我的应用程序并点击了 global.asax,然后执行了这一行

obj.execute("insert into EmailSendLogs(Message,Date) values('Global Page 
        Hit',getdate())");

但是之后 jobscheduler.start() 不会触发。

这是我尝试过的:

  • 我在部署后重新启动了 IIS 服务器并清除了缓存
  • 一些解决方案建议将enableMode设置为AlwaysRunning,所以我也这样做了。
  • 我在函数中添加了时区

这些解决方案都不起作用。我真的需要这个才能发挥作用。我不想使用 Windows 服务。如果它在我的测试环境中工作,为什么它不能在生产环境中工作?

c# .net quartz-scheduler job-scheduling quartz
1个回答
0
投票
  1. 通过验证环境奇偶校验来确保生产和测试环境奇偶校验。

  2. 开启彻底的日志记录,以便您可以通过记录故障和执行顺序来排除故障。

  3. 通过执行权限检查来验证对资源(例如数据库)的访问。

  4. 检查设置和凭据以验证配置。

  5. 跟踪资源限制:注意服务器资源和负载。

  6. 通过管理并发来防止出现大量调度程序实例。

  7. 通过检查网络和防火墙来验证传出连接。

  8. 如果有远程调试工具,请利用它们在生产中进行故障排除。

  9. 在临时环境中检查:事先进行验证。

© www.soinside.com 2019 - 2024. All rights reserved.