在特定日期和时间发送通知
Posted
技术标签:
【中文标题】在特定日期和时间发送通知【英文标题】:Send notification on specific date and time 【发布时间】:2016-06-03 06:38:45 【问题描述】:在我们的应用程序中,我们使用问题的开始日期、结束日期和结果日期来存储问题。一旦问题的开始日期到达,我们需要向应用程序(iPhone 和 Andorid)发送通知。
谁能告诉我如何实现这一目标?
我们不想使用 pull 方法。就像在特定的时间间隔内,它会检查问题的开始日期并发送通知。
我有一个发送问题通知的 URL。当问题的开始日期到达时,我需要调用此 URL。
谢谢。
【问题讨论】:
【参考方案1】:看看石英:
Quartz.NET 是一个功能齐全的开源作业调度系统,可用于从最小的应用程序到大型企业系统
Quartz Enterprise Scheduler .NET
您可以创建一个新的 Quarts 作业,我们称之为 QuestionSenderJob。然后您的应用程序可以schedule Quartz 调度程序中的一个任务,作业可以有许多具有自定义数据的相同作业实例 - 在您的情况下 QuestionId。
此外,它还支持将作业调度存储在您的 SQL 数据库中(包括 DDL 脚本),因此您可以在需要 UI 时创建一些关系。
您可以在 Quartz.NET 发行版的“database/dbtables”目录中找到创建表的 SQL 脚本
Lesson 9: JobStores
这样你就可以让 Quartz 引擎在正确的时刻点火。
当您学习 Quartz .NET 基础知识时,请参阅我为您的案例制作的这段代码 sn-p 以安排工作。也许需要考虑一些修改。
IDictionary<string, object> jobData = new Dictionary<string, object> "QuestionId", questionId ;
var questionDate = new DateTime(2016, 09, 01);
var questionTriggerName = string.Format("Question0_Trigger", questionId);
var questionTrigger = TriggerBuilder.Create()
.WithIdentity(questionTriggerName, "QuestionSendGroup")
.StartAt(questionDate)
.UsingJobData(new Quartz.JobDataMap(jobData))
.Build();
scheduler
.ScheduleJob(questionSenderJob, questionTrigger);
然后在 Job 中你会通过 JobExecutionContext 得到你的 questionId。
public class QuestionSenderJob: IJob
public void Execute(JobExecutionContext context)
JobDataMap dataMap = context.JobDetail.JobDataMap;
// Extract question Id and send message
【讨论】:
让我试试这个方法并发送通知。 我更新了一个答案,让您更容易前进:) 谢谢 Edgars,这里还有一个问题是应用程序回收(新部署,定期回收)后,它会丢失所有设置的预定作业。有没有办法坚持所有的工作?我也尝试过存储在 SQL 中。 使用 SQL 来保持计划的工作,我不知道我以前犯了什么错误。它工作正常。我为每个问题通知创建了单独的工作,因为问题具有不同的开始日期。谢谢。【参考方案2】:如何使用Task Scheduler Managed Wrapper?
您不想使用 pooling,但是如果您编写自己的类来封装 Timer(例如 System.Thread.Timer)并检查每个时间第二,这不会占用太多资源。根据您需要的准确程度,您也可以减少检查频率,例如每分钟。也许你应该重新考虑一下。
【讨论】:
【参考方案3】:如果您使用任何第三方服务来管理您的推送通知,例如 Azure Notification Hub、Parse.com 等,它们会提供一种集成方式来安排推送通知。通过传入发送日期或让他们定期运行作业。我是 Azure 服务的用户,它运行良好。
【讨论】:
这是最好的方法,但由于我不是从 azure 发送通知,所以更新我的代码以从 azure 发送通知会更耗时。【参考方案4】:我现在可以建议的最佳实施方式是让您从服务器发送通知。 您只需要一个可以调度操作的好的调度程序。
对我来说,我的服务器由 javascript (NodeJS) 驱动,所以我使用“节点调度”。我所做的只是
var schedule = require('node-schedule');
//Reporting rule at minute 1 every hour
var rule = new schedule.RecurrenceRule();
rule.minute = 1;
schedule.scheduleJob(rule, function ()
console.log(new Date().toTimeString() + ' Testing Scheduler! Executing Every other minute');
//sendPush()
);
【讨论】:
以上是关于在特定日期和时间发送通知的主要内容,如果未能解决你的问题,请参考以下文章