2

私の webapp では、Quartz を使用して、あるクラスで定義されたメソッドをある間隔で呼び出しています。そのメソッドは、引数の 1 つとして WebContent ディレクトリ内の css ファイルへのパスを取ります。私の質問は、サーブレット以外のクラスからその css ファイルへのパスを取得する方法です。

私が試したことの1つは、メソッドを呼び出すクラスを拡張してHttpServlet、呼び出しを行うことができるようにすることでした

String contextPath = getServletContext().getRealPath("");

しかし、それは機能せず、私のアプリケーションはその行でハングします。これは専門的ではないように思われるため、パスをハードコーディングしたくありません:)

4

3 に答える 3

3

ジョブはリクエスト処理パイプラインの一部として呼び出されないため、Quartz ジョブからサーブレット コンテキストにアクセスすることはできません。

サーブレット/Web コードのスケジューリング/Quartz ジョブの呼び出しによって渡されるように、CSS ファイル パスをジョブへの引数にしないのはなぜですか? 例については、Quartz のドキュメントを参照してください。

于 2012-05-22T16:06:41.767 に答える
1

Web アプリの WEB-INF/classes ディレクトリにファイルを配置すると、getResourceAsStream() を使用してアクセスできます。これは WAR ファイルで機能します。getRealPath() はしません。

Quartz が .css ファイルについて知る必要があるのはなぜですか? それは純粋に見る必要があります。

于 2012-05-22T16:07:14.660 に答える
0

いいえ、Quartz ジョブからサーブレット コンテキストにアクセスできます。

@Override
public void contextInitialized(ServletContextEvent sce) {
    try {
        //Create & start the scheduler.
        StdSchedulerFactory factory = new StdSchedulerFactory();
        factory.initialize(sce.getServletContext().getResourceAsStream("/WEB-INF/my_quartz.properties"));
        scheduler = factory.getScheduler();
        //pass the servlet context to the job
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("servletContext", sce.getServletContext());
        // define the job and tie it to our job's class
        JobDetail job = newJob(ImageCheckJob.class).withIdentity("job1", "group1").usingJobData(jobDataMap).build();
        // Trigger the job to run now, and then repeat every 3 seconds
        Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow()
              .withSchedule(simpleSchedule().withIntervalInMilliseconds(3000L).repeatForever()).build();
        // Tell quartz to schedule the job using our trigger
        scheduler.scheduleJob(job, trigger);
        // and start it off
        scheduler.start();
    } catch (SchedulerException ex) {
        log.error(null, ex);
    }
}

Quartz ジョブでは、以下のようにサーブレット コンテキストを取得できます。

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
    ServletContext servletContext = (ServletContext) context.getMergedJobDataMap().get("servletContext");
    //...
}
于 2014-05-15T10:24:32.293 に答える