1

次のように Quartz JobDetail 行を設定すると、Java で記述された Quartz ジョブが正常に実行されます。

JobDetail jd = new JobDetail("FeedMinersJob", scheduler.DEFAULT_GROUP, FeedMinersScheduler.class); 

しかし、ジョブの詳細はデータベース テーブルに格納されているため、クラスを動的にロードしたいと考えています。だから私はこのようなものが欲しい:

JobDetail jd = new JobDetail(sj.getJobName(), scheduler.DEFAULT_GROUP, sj.getJobClassFile()); 

sj はスケジュールされたジョブ オブジェクトであり、メソッド sj.getJobClassFile() は、クラス名をハードコーディングする代わりに、sj で定義されたクラスの名前を返します。

Java Class.forName メソッドの順列を試しましたが、成功しませんでした。

4

4 に答える 4

1

私は同じ問題に遭遇しました。何も出力せず、エラーもスローしません。これは、ジョブ クラスに空のコンストラクターがないためです。したがって、コードが正しいとしても、ジョブ オブジェクトを作成するメカニズムがありません。Job クラスに空のコンストラクターを追加すると、機能します。

于 2015-01-16T21:56:20.307 に答える
0

私が理解しているように、コードは次のようにする必要があります。

Class<?> jobClass = Class.forName(sj.getJobClassFile());
JobDetail jd = new JobDetail(sj.getJobName(), scheduler.DEFAULT_GROUP, jobClass);

動作しなかったコード スニペットを投稿していただけますか?

于 2009-09-17T13:37:54.203 に答える
0

私はこれを持っています、多分それはあなたに役立つでしょう: (getClassName() は文字列を返します)

Class<?> jobClass = Class.forName(t_job.getClassName());
if (Job.class.isAssignableFrom(jobClass)) {
        // create a job detail that is not volatile and is durable (is persistent and exists without trigger)
        JobDetail job = new JobDetail(t_job.getName(), t_job.getGroupName(), jobClass, false, true, true);
        job.setDescription(t_job.getDescription());

}
于 2009-10-15T17:39:51.723 に答える
0

これを試して

try {
    Class<?> jobClass = Class.forName(sj.getJobClassFile());
    JobDetail jd = new JobDetail(sj.getJobName(), scheduler.DEFAULT_GROUP, jobClass);
} catch (ClassNotFoundException e) {
    // put here some error handling
}

うまくいかない場合は、問題の詳細を教えてください- コンパイル エラー、実行時の例外、またはその他の問題。

于 2009-09-17T14:39:59.903 に答える