1
JobDetail job = new JobDetail();
job.setName("dummyJ");
job.setJobClass(NotificationCreater.class);

SimpleTrigger trigger = new SimpleTrigger();
trigger.setName("mn");
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
trigger.setRepeatInterval(30000);

Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);

上記のコードを使用して NotificationCreater.class でアクティビティをスケジュールしていますが、エラー メッセージが表示されます

エラー: - 名前: 'dummyJ' およびグループ: 'DEFAULT' のジョブを保存できません。この ID を持つジョブが既に存在するためです。

4

3 に答える 3

1

サーブレットの init メソッドを使用して、スケジュールを初期化および開始できます。また、サーブレットで destroy メソッドを使用して、アプリケーションが削除されたらスケジュールされたジョブをプールから削除し、再デプロイ中に同じエラーが発生するのを避ける必要があります。scheduler.unscheduleJob()scheduler.shutdown()などを実行して、ジョブを削除し、destroy メソッドからスケジューラを停止できます。

于 2013-07-19T05:55:57.433 に答える
0

サーブレットを使用していて、アプリケーションの起動時にジョブを実行したい場合は、これが達成する方法だと思います。

ジョブクラス

public class DummyJob{

public DummyJob() throws ParseException, SchedulerException {

JobDetail job = new JobDetail();
job.setName("dummyJ");
job.setJobClass(NotificationCreater.class);

SimpleTrigger trigger = new SimpleTrigger();
trigger.setName("mn");
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
trigger.setRepeatInterval(30000);

Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
 }
}

サーブレット

public class JobInitializerServlet extends HttpServlet {

/**
 * 
 */
private static final long serialVersionUID = 5102955939315248840L;

/**
 * Application logger to log info, debug, error messages.
 */
private static final Logger APP_LOGGER = Logger.getLogger("appLogger");

/**
 * @see Servlet#init(ServletConfig) Initializes DummyJob
 */
public void init(ServletConfig config) throws ServletException {

    try {
        DummyJob scheduler = new DummyJob();
    } catch (java.text.ParseException e) {
        APP_LOGGER.error(e.getLocalizedMessage(), e);
    } catch (SchedulerException e) {
        APP_LOGGER.error(e.getLocalizedMessage(), e);
    }

}

}

そしてサーブレットマッピング

<servlet>
    <description>
    </description>
    <display-name>JobInitializerServlet</display-name>
    <servlet-name>JobInitializerServlet</servlet-name>
    <servlet-class>com.job.servlet.JobInitializerServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

これにより、アプリケーションをデプロイまたは開始するとすぐにジョブが開始されます。お役に立てれば。

于 2013-07-18T11:30:21.813 に答える
0

trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);

不定繰り返し回数にトリガーを設定しています。つまり、トリガーはデータベースに永遠に存在します。その結果、トリガーに関連付けられたジョブもデータベースに永久に存在します。

それで、あなたは初めてプログラムを実行し、それが実行されているのを見てうれしくなりました。あなたは処刑を中止し、コーヒーブレイクをしました。次に戻ってきて、これを上司と @#$%@# BOOM #$%#$%#$5 に見せたいと思います。

すでにデータベースにある名前でジョブとトリガーを作成しようとしています。そして、スケジューラーはもちろん、これを行うことを防ぎます。

ソリューション:

  1. プログラムの次の実行を開始する前に、Quartz データベース テーブルからすべてのデータを消去します。また
  2. 無期限のトリガーを使用しないでください。シンプルなものを使用してください。1回または2回または3回実行しますが、〜ではありません。また
  3. RAMJobStore を使用します。
于 2013-07-19T08:12:04.540 に答える