2016-06-03 2 views
1

В нашем приложении мы сохраняем вопросы с начальным, конечным и итоговым датами. Нам нужно отправить уведомление в приложение (iPhone и Andorid), как только начнется вопрос.Отправлять уведомление по конкретным датам и времени

Может ли кто-нибудь сообщить мне, как мы можем достичь этого?

Мы не хотим использовать метод pull. например, в течение определенного интервала времени, он проверяет вопрос о старте и отправляет уведомление.

У меня есть URL-адрес, чтобы отправить уведомление на вопрос. Мне нужно позвонить по этому URL-адресу, когда начнется исходная дата вопроса.

Спасибо.

ответ

1

Взгляните на кварце:

Quartz.NET является полнофункциональным, открытым исходным кодом система планирования заданий, которые могут быть использованы из маленьких приложений для крупномасштабных корпоративных систем

Quartz Enterprise Scheduler .NET

Вы можете создать новый Quarts Job, назовите его QuestionSenderJob. Тогда ваше приложение может выполнить schedule задание в планировщике Quartz, задания могут иметь много экземпляров одного и того же задания с пользовательскими данными - в вашем случае QuestionId.

Кроме того, он поддерживает хранение планировщика заданий в вашей базе данных SQL (в него включены DDL-скрипты), поэтому вы можете создать некоторые отношения, если вам нужно, например, для пользовательского интерфейса.

Вы можете найти скрипты таблицы создания SQL в каталоге «базы данных/dbtables» распределения Quartz.NET

Lesson 9: JobStores

Таким образом, вы оставляете стрельбы в нужный момент двигателя Quartz ,

Когда вы перейдете к основам Quartz .NET, см. Этот фрагмент кода, который я сделал для вашего случая, чтобы запланировать работу. Возможно, потребуются некоторые изменения.

IDictionary<string, object> jobData = new Dictionary<string, object> { { "QuestionId", questionId } }; 
var questionDate = new DateTime(2016, 09, 01); 
var questionTriggerName = string.Format("Question{0}_Trigger", questionId); 
var questionTrigger = TriggerBuilder.Create() 
    .WithIdentity(questionTriggerName, "QuestionSendGroup") 
    .StartAt(questionDate) 
    .UsingJobData(new Quartz.JobDataMap(jobData)) 
    .Build(); 

scheduler 
    .ScheduleJob(questionSenderJob, questionTrigger); 

Затем в Job вы получите свой вопрос через JobExecutionContext.

public class QuestionSenderJob: IJob 
{ 
    public void Execute(JobExecutionContext context) 
    {    
     JobDataMap dataMap = context.JobDetail.JobDataMap; 

     // Extract question Id and send message 
    } 
} 
+0

Позвольте мне попробовать этот подход и отправить уведомление. –

+0

Я обновил ответ, чтобы облегчить вам движение вперед :) –

+0

Спасибо Edgars. Еще одна проблема здесь. После утилизации приложения (новое развертывание, регулярная утилизация) все установленные задания запланированы. есть ли способ сохранить всю работу? Я попытался сохранить в SQL также. –

0

Как насчет использования Task Scheduler Managed Wrapper?

Вы не хотите использовать Объединив, но если вы написать свой собственный класс, который инкапсулирует таймер (например System.Thread.Timer) и проверьте время каждый второй, который не занимает много ресурсов. В зависимости от того, насколько точно вам это нужно, вы также можете проверять реже, например. каждый минут. Возможно, вам стоит пересмотреть это.

0

Если вы используете какую-либо услугу третьей стороны для управления толчок уведомления таких как Azure Notification Hub, Parse.com, ... они предлагают комплексный способ планирования уведомления толчка. Либо переходя в дате отправки, либо периодически запуская задание.Я являюсь пользователем службы Azure и работает очень хорошо.

+0

Это лучший подход, но поскольку я не отправляю уведомление от лазурного, так что для меня будет больше времени для обновления моего кода для отправки уведомления от лазурного. –

0

Лучшая реализация, на которую я могу посоветоваться сейчас, - это отправить вам уведомление с сервера. Все, что вам просто нужно, - это хороший планировщик, который может отправить операцию.

Для меня мой сервер работает на Javascript (NodeJS), поэтому я использую «node-schedule». Все, что я просто делаю, это

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() 
}); 
Смежные вопросы