我创建了一个作业调度程序,该调度程序每 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() 不会触发。
这是我尝试过的:
这些解决方案都不起作用。我真的需要这个才能发挥作用。我不想使用 Windows 服务。如果它在我的测试环境中工作,为什么它不能在生产环境中工作?
通过验证环境奇偶校验来确保生产和测试环境奇偶校验。
开启彻底的日志记录,以便您可以通过记录故障和执行顺序来排除故障。
通过执行权限检查来验证对资源(例如数据库)的访问。
检查设置和凭据以验证配置。
跟踪资源限制:注意服务器资源和负载。
通过管理并发来防止出现大量调度程序实例。
通过检查网络和防火墙来验证传出连接。
如果有远程调试工具,请利用它们在生产中进行故障排除。
在临时环境中检查:事先进行验证。