اجرای وظایف زمان بندی شده با Quartz.NET - قسمت دوم
نویسنده: بهروز راد
تاریخ: ۱۳۹۱/۰۵/۲۶ ۲۱:۲۲
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
var scheduler = new StdSchedulerFactory().GetScheduler();
scheduler.Shutdown(true);
1) یک وظیفه به چند trigger نسبت داده شده است.در صورتی که قصد دارید وظیفه از تمامی triggerها گرفته شود (معمولاً هم همین رفتار مد نظر است)، از متد DeleteJob استفاده کنید؛ و اگر قصد دارید تا اجرای وظیفه توسط یک trigger مشخص لغو شود و triggerهای دیگر مختص آن وظیفه به کار خود ادامه دهند، از متد UnscheduleJob استفاده کنید. اگر از متد DeleteJob استفاده میکنید، نام وظیفه را با ایجاد نمونه ای از کلاس JobKey برای آن مشخص کنید و در صورتی که از متد UnscheduleJob استفاده میکنید، نام trigger را با ایجاد نمونه ای از کلاس TriggerKey تعیین کنید.
2) هر وظیفه فقط یک trigger دارد.
scheduler.DeleteJob(new JobKey("job1"));
// or
scheduler.UnscheduleJob(new TriggerKey("trigger1"));
scheduler.Standby();
scheduler.PauseJob(new JobKey("job1"));
scheduler.ResumeJob(new JobKey("job1"));
IJobDetail job = JobBuilder.Create<NewJob>()
.WithIdentity("job1")
.Build();
scheduler.AddJob(job, true);
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("newTrigger")
.StartNow()
.ForJob("job1")
.WithSimpleSchedule(x => x.WithIntervalInSeconds(5).WithRepeatCount(20))
.Build();
scheduler.RescheduleJob(new TriggerKey("oldTrigger"), trigger);
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1")
.StartAt(startTime)
.ForJob("job1")
.WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
.Build();
SchedulerMetaData metaData = scheduler.GetMetaData(); int numberOfJobsExecuted = metaData.NumberOfJobsExecuted;
SchedulerMetaData metaData = scheduler.GetMetaData(); DateTimeOffset? runningSince = metaData.RunningSince;
using System.Windows.Forms;
public static class GlobalData
{
public static Form ScheduleForm { get; set; }
}
GlobalData.ScheduleForm = this;
namespace SchedulerDemo.Jobs
{
using System.Linq;
using System.Windows.Forms;
using Quartz;
public class HelloJob : IJob
{
private delegate void ButtonTextWriter(string buttonId, string text);
MainForm form = GlobalData.ScheduleForm as MainForm;
private void SetButtonText(string buttonId, string text)
{
(form.Controls.Find(buttonId, true).FirstOrDefault() as Button).Text = text;
}
public void Execute(IJobExecutionContext context)
{
form.BeginInvoke(new ButtonTextWriter(SetButtonText), new object[] { "myButton", "My Text" });
}
}
}
select * from tblPosts where (showDate is null) or (showDate<=getdate())
با سلام؛ صرف نظر از اینکه ما کدهای زمانبندی رو چطور مینویسیم یا از چه کتابخانهها و روش هایی استفاده میکنیم، برای پیاده سازی برنامه ای هیچ قسمت یوزر اینترفیس ای ندارد (همانند وبلاگها یا برنامه های تیکتینگ) و صرفا اطلاعاتی را از دیتایبس (موجود) فراخوانی و عملیاتی روی آنها انجام میهد، (مثلا ارسال ایمیل یا پیامک)، از چه نوع application ای استفاده کنیم؟ (webapp - winapp - winservice).
من برای انجام اینکار از winapp استفاده نمیکنم چون نمیخواهم یک برنامه را روی ویندوز اجرا کنم. همچنین از webapp استفاده نمیکنم بنا به دلایلی خاص. در حال حاظر از windows serviceها استفاده میکنم. آیا راه حل مناسبتری وجود دارد؟
با تشکر از شما
ممنون از شما آقا سعید
بله در بعضی موارد سرور میتواند از خود من باشد و در بعضی موارد دسترسی ریموت برای نصب و کنترل سرویس را دارم.
درمورد برنامههای وب برای این کار : من یکبار این کار را انجام دادم و از cache expiration استفاده کردم. ولی چون این برنامهی وب هیچ request ای نداشت برنامه down شد و عملیات زمان بندی متوقف شد.
پس میشه گفت استفاده از سرویسهای ویندوزی، راه حل متداولی هست؟
- تولید درخواست به یک سایت کار سختی نیست. از این سرویسهایی که مدام سایت رو ping میکنند زیاد هست. مثل سرویسهای فید خوان. مثل سایتهایی که بررسی میکنند سایت شما آپ است یا داون.
- نه الزاما. سرویس task scheduler ویندوز همیشه در حال اجرا است؛ دقیق و منظم. این سرویس میتونه خیلی راحت یک فایل exe معمولی یا حتی یک فایل bat رو در زمانهای مشخصی اجرا کنه. برای کارهای مدیریت سیستم زیاد ازش استفاده میشه.
نیازی نیست به ازای هر تبلیغ یک جاب درست کنید. کلا یک جاب درست کنید که مثلا هر 5 دقیقه یکبار از دیتابیس کوئری بگیره. مواردی رو که منقضی شده (مقایسه تاریخ سرور با تاریخ فیلد انقضاء تبلیغ) پیدا کنه و براشون ایمیل ارسال کنه. به این صورت سربار خیلی خیلی کمی خواهید داشت.
<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
}
</script> var jobs = scheduler.GetCurrentlyExecutingJobs();
ITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1").StartAt(starttime).WithSimpleSchedule(x => x.WithIntervalInHours(24).RepeatForever()).Build (); double h = DateTime.Now.Hour;
h += 7.5;
if (h >= 8)
{
SchedulerDemo.Interfaces.ISchedule mytask = new SchedulerDemo.Jobs.Sendschedule();
mytask.run();
} public void Run()
{
...
chkJobs.Items.Add(job.Key, true);
} private void chkJobs_ItemCheck(object sender, ItemCheckEventArgs e)
{
int index = e.Index;
var sch = Scheduler.GetScheduler();
foreach (object item in chkJobs.Items)
{
JobKey key = (JobKey)item;
if (e.NewValue == CheckState.Unchecked)
{
sch.PauseJob(key);
}
else
{
sch.ResumeJob(key);
}
}
} public class Jobs : IJob
{
public void Execute(IJobExecutionContext context)
{
JobDataMap datamap = context.JobDetail.JobDataMap;
switch (Convert.ToInt32(datamap.GetString("OperationType")))
{
case 1:
MessageBox.Show(datamap.GetString("OperationValue"));
break;
}
}
}