ご質問いただいた順にお答えしていきます。
はい、可能です。実際には、Quartz.Net を操作する一般的な方法です。実際、Quartz.Net スケジューラを管理する ASP.Net MVC アプリケーションを作成することもできます。
建築。理想的には、高レベルでは、MVC アプリケーションは Quartz.Net API を使用して、Windows サービスとしてどこかにインストールされている Quartz.Net サーバーと通信します。Quartz.Net はリモーティングを使用してリモートで通信するため、リモーティングの使用に関する制限が適用されます (Silverlight ではサポートされていないなど)。Quartz.Net は、箱から出してすぐに Windows サービスとしてインストールする方法を提供します。そのため、(あなたの場合) AdoJobStore を使用するようにサービス自体を構成し、有効にする以外に、ここで行う作業はあまりありません。リモーティング。サービスを適切にインストールする方法については注意が必要です。まだインストールしていない場合は、この投稿をご覧ください。
内部的には、MVC アプリケーションでスケジューラへの参照を取得し、それをシングルトンとして保存する必要があります。次に、コードでジョブをスケジュールし、この一意のインスタンスを介してスケジューラに関する情報を取得します。次のようなものを使用できます。
public class QuartzScheduler
{
public QuartzScheduler(string server, int port, string scheduler)
{
Address = string.Format("tcp://{0}:{1}/{2}", server, port, scheduler);
_schedulerFactory = new StdSchedulerFactory(getProperties(Address));
try
{
_scheduler = _schedulerFactory.GetScheduler();
}
catch (SchedulerException)
{
MessageBox.Show("Unable to connect to the specified server", "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
public string Address { get; private set; }
private NameValueCollection getProperties(string address)
{
NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "RemoteClient";
properties["quartz.scheduler.proxy"] = "true";
properties["quartz.threadPool.threadCount"] = "0";
properties["quartz.scheduler.proxy.address"] = address;
return properties;
}
public IScheduler GetScheduler()
{
return _scheduler;
}
}
このコードは、Quart.Net クライアントをセットアップします。次に、リモートスケジューラにアクセスするには、単に呼び出します
GetScheduler()
クエリ スケジューラからすべてのジョブを取得するためのサンプル コードを次に示します。
public DataTable GetJobs()
{
DataTable table = new DataTable();
table.Columns.Add("GroupName");
table.Columns.Add("JobName");
table.Columns.Add("JobDescription");
table.Columns.Add("TriggerName");
table.Columns.Add("TriggerGroupName");
table.Columns.Add("TriggerType");
table.Columns.Add("TriggerState");
table.Columns.Add("NextFireTime");
table.Columns.Add("PreviousFireTime");
var jobGroups = GetScheduler().GetJobGroupNames();
foreach (string group in jobGroups)
{
var groupMatcher = GroupMatcher<JobKey>.GroupContains(group);
var jobKeys = GetScheduler().GetJobKeys(groupMatcher);
foreach (var jobKey in jobKeys)
{
var detail = GetScheduler().GetJobDetail(jobKey);
var triggers = GetScheduler().GetTriggersOfJob(jobKey);
foreach (ITrigger trigger in triggers)
{
DataRow row = table.NewRow();
row["GroupName"] = group;
row["JobName"] = jobKey.Name;
row["JobDescription"] = detail.Description;
row["TriggerName"] = trigger.Key.Name;
row["TriggerGroupName"] = trigger.Key.Group;
row["TriggerType"] = trigger.GetType().Name;
row["TriggerState"] = GetScheduler().GetTriggerState(trigger.Key);
DateTimeOffset? nextFireTime = trigger.GetNextFireTimeUtc();
if (nextFireTime.HasValue)
{
row["NextFireTime"] = TimeZone.CurrentTimeZone.ToLocalTime(nextFireTime.Value.DateTime);
}
DateTimeOffset? previousFireTime = trigger.GetPreviousFireTimeUtc();
if (previousFireTime.HasValue)
{
row["PreviousFireTime"] = TimeZone.CurrentTimeZone.ToLocalTime(previousFireTime.Value.DateTime);
}
table.Rows.Add(row);
}
}
}
return table;
}
このコードはGithubで表示できます