0

これに関するいくつかの投稿を見てきましたが、Quartz の新しい JobBuilder アプローチでは機能しません。

クラス名を格納する文字列を使用して、動的に JobDetail を作成しようとしています。ただし、次のコンパイラ エラーが発生します。

 The method newJob(Class<? extends Job>) in the type JobBuilder is not applicable 
 for the arguments (Class<capture#6-of ?>)

これはコードです:

String s = "ClassName";
Class<?> jobClass = null;
try {
    jobClass = Class.forName (s);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
    throw new MsgException ( "Requested Job Class not found" );
}

JobDetail jobDetail = newJob(jobClass).
        withIdentity(jobKey).
        withDescription(description).
        storeDurably().
        usingJobData(dataMap).
        build();
4

2 に答える 2

1

Class.forName() などのメソッドは実行時の参照ですが、 newJob コンストラクターはコンパイル時の参照を期待していると思います。中間的な解決策は、次のようなものを使用することです。

private void makeNewJob(Class<? extends Job> jobClass, String identity,
    String environment)
{
    JobDetail job = newJob(jobClass).withIdentity(identity, environment)
        .build();

// additional code
}

そして次のように呼び出します:

makeNewJob(MyJob.class, "MyJob", "Production");
于 2014-05-11T12:53:44.667 に答える
0

エラーメッセージを見ましたか?newJobtype のパラメーターを取りますが、 type のClass<? extends Job>パラメーターを渡していますClass<?>。簡単な修正として、次のように変更してみてください。

newJob((Class<? extends Job>)jobClass)

長期的には、実際にチェックして Job のサブクラスであることを確認することをお勧めします。そうしないと、Quartz 内部から不思議なランタイム エラーが発生するためです。

于 2012-08-17T17:29:40.607 に答える