1

Quartz.net に関する大きなプロジェクトがあります。私はいくつかのタスクを作成するためにいくつかのジョブを作成しました。そこで、私を理解するための要約プロジェクトを作成しました。仕事があります。いくつかの値をジョブのプロパティに解析したいと考えています。実行時に、ジョブはこれらのプロパティを必要とします。しかし、私はそれを行うことはできません。「なぜ 'JobDetail.JobDataMap' を使用しないのですか?」と言わないでください。私は以下の構造が必要です:

ここに画像の説明を入力

JobBase を見てください:

 public abstract class JobBase : MarshalByRefObject, IStatefulJob
{
    void IJob.Execute(JobExecutionContext context)
    {
        this.Execute();
    }

    protected abstract void Execute();
}

また、Test.cs (それは私の仕事です!)

Test.cs:

 public class Test : JobBase
{

    public string FileName { get; set; }

    public string Ip { get; set; }


    protected override void Execute()
    {
        Ping ping = new Ping();
        PingReply pingReply = ping.Send(Ip);
        using (System.IO.StreamWriter file = new System.IO.StreamWriter(FileName, true))
        {
            file.WriteLine(pingReply.Address);
        }  
    }
}

My Project 開始スケジュール :

   private void btnProperties_Click(object sender, EventArgs e)
    {
        ISchedulerFactory schedfabrikayeni;
        IScheduler schedyeni;
        JobDetail job;
        CronTrigger trigeryeni;
        NameValueCollection properties = new NameValueCollection();
        properties["FileName"] = @"C:\temp\pingresult.txt";
        properties["Ip"] = "192.168.16.14";


        schedfabrikayeni = new StdSchedulerFactory(properties);
        schedyeni = schedfabrikayeni.GetScheduler();
        job = new JobDetail("myJob", null, typeof(Test));

        JobDataMap map = new JobDataMap();
        map.Put("msg", "Your remotely added job has executed!");
        job.JobDataMap = map;
        string cronExpressiontxt = string.Empty;
        //0 0 12 1 4 ? *
        cronExpressiontxt = "0 0/1 * 1/1 * ? *";
        trigeryeni = new CronTrigger("triger1", null, "myJob", null, cronExpressiontxt);

        schedyeni.ScheduleJob(job, trigeryeni);
        schedyeni.Start();
    }

しかし、私のIPはnullです 私のFileNameはnullです。以下の使用法を使用してプロパティを設定する方法:

  NameValueCollection properties = new NameValueCollection();
        properties["FileName"] = @"C:\temp\pingresult.txt";
        properties["Ip"] = "192.168.16.14";


        schedfabrikayeni = new StdSchedulerFactory(properties);
4

3 に答える 3

1

@jvilalta と @sgmoore に同意する必要があります。ジョブデータマップを使用してステートフル データを格納する必要があります。JobDataMap プロパティの使用例を次に示します。

    protected override void ExecuteWorker(IJobExecutionContext context)
    {
        try
        {
            SomeProcessor someProcessor;

            // If the JobDataMap doesn't contain the initialized key yet, then this job hasn't been run before.
            // Initialize state data if this is the case; otherwise, get state data from the JobDataMap.
            if (!context.JobDetail.JobDataMap.Contains(QUARTZ_KEY_PROCESSOR))
            {
                someProcessor = someProcessorFactory.Create();

                if (someProcessor == null)
                    return;

                context.JobDetail.JobDataMap[QUARTZ_KEY_PROCESSOR] = someProcessor;
            }
            else
            {
                someProcessor = (someProcessor)context.JobDetail.JobDataMap[QUARTZ_KEY_PROCESSOR];
            }

            ExecuteETL(someProcessor, DateTime.MaxValue);
        }
        catch (Exception e)
        {
            m_log.Fatal("Scheduled job execution failed.", e);
            // This method can only throw a JobExecutionException.
            // http://quartznet.sourceforge.net/tutorial/lesson_3.html
            throw new JobExecutionException(e);
        }
    }
于 2012-08-07T23:11:18.960 に答える
0

これがうまくいくとどこで思いついたのですか?このような例は見たことがありません。

私は間違っている可能性がありますが、私が理解したように、スケジューラーに渡すNameValueCollectionプロパティは、スケジューラー自体の動作を構成するための設定です。たとえば、スケジューラでSQLデータベースを使用する場合は、(とりわけ)quartz.jobStore.typeの値を「Quartz.Impl.AdoJobStore.JobStoreTX、Quartz」に設定できます。

スケジューラーが知らない追加のプロパティを渡した場合、それらは単純に無視されると思いました。

特に、スケジューラーのプロパティにアクセスする方法はないようです。これも、スケジューラーを初期化するために必要/使用されるだけであることを示唆しています。

「なぜ「JobDetail.JobDataMap」を使用しないのですか?」と言わないでください。

JobDataMapは、まさにこの目的のために設計されているように見えます。うまくいかない理由がある場合は、うまくいかない理由を説明したほうがいいでしょう。

于 2012-08-06T18:16:54.093 に答える