在特定日期和时间发送通知

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()
);

【讨论】:

以上是关于在特定日期和时间发送通知的主要内容,如果未能解决你的问题,请参考以下文章

每周在特定日期和时间触发通知

设置特定日期和时间的本地通知 swift 3

设置特定日期和时间的通知[关闭]

特定日期和时间的本地通知不起作用。迅速

如何在 Windows 8 应用程序中安排特定日期和时间的 toast 通知?

如何在通知中显示时间和日期?