5

spring 3.0 ベースのアプリケーションで Quartz Scheduler を使用しています。新しいスケジューラを正常に作成でき、正常に動作しています。

私はこのように参照を見てきました。

しかし.. Quartz ジョブ ファイルで servletContext を取得できません。executeInternal() メソッドで servletContext 参照を取得する方法について誰か助けてもらえますか??

4

3 に答える 3

6

私にも同様のニーズがありました。ここで提示されたソリューションと同様の方法で整理しました。 私のサーブレット コンテキスト リスナーでは、ジョブ データ マップ オブジェクトを使用してサーブレット コンテキストを設定しています。

    @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);
        }
    }

それから私の仕事の中で私はこれをやっています:

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        ServletContext servletContext = (ServletContext) context.getMergedJobDataMap().get("servletContext");
        //...
    }

編集: また、Springを使用していると述べたので、このリンクを見つけました。最後の投稿で、ある人が ServletContextAware の実装について言及しています。個人的には、それが役割であるため、JobDataMap を使用します。

于 2012-04-25T13:32:08.937 に答える
2

Quartz 2.0 以降、web.xml を介して webapp 内でスケジューラを開始する場合、次のように init パラメータとしてQuartzInitializerServlet設定することにより、SchedulerContext に ServletContext を格納できます。scheduler-context-servlet-context-key

<!-- Quartz Scheduler Initializer Servlet -->
<servlet>
    <servlet-name>QuartzInitializer</servlet-name>
    <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
    <init-param>
        <param-name>shutdown-on-unload</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>start-scheduler-on-load</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>scheduler-context-servlet-context-key</param-name>
        <param-value>servletContext</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

コードで次のリファレンスを参照してください: https://github.com/elventear/quartz-scheduler/blob/quartz-2.0.0-rc/quartz/src/main/java/org/quartz/ee/servlet/QuartzInitializerServlet.java #L122

于 2015-02-02T20:02:24.443 に答える