Quartz调度程序没有在战争中运行

时间:2011-12-16 10:08:22

标签: gwt jboss scheduling quartz-scheduler

我在gwt web应用程序中使用石英调度程序。我的应用程序结构如下所示。

我有两个项目。一个是gwt web应用程序客户端项目(对于ui部分)&另一个是用于服务器端调用的java项目。(用于数据库交互)。在客户端项目中,我将一个服务器项目作为参考。运行时我从客户端创建一个war并将一个服务器项目的jar添加到war文件夹。

现在我在服务器端使用调度程序来完成某个任务自动完成。在本地运行它(没有战争)调度程序正常工作。

但是在jboss服务器上运行war时调度程序没有运行。

我的所有调度程序相关代码和Quartz.jar都在服务器端。在客户端项目中没有任何Quartz的引用。这是问题???

这是我的调度程序代码

public class QuartzJob implements Job {

public void execute(JobExecutionContext jobExecutionContext)
        throws JobExecutionException {
    JobDataMap map = jobExecutionContext.getJobDetail().getJobDataMap();
    ActivityTransactionSettingsMap map2 = (ActivityTransactionSettingsMap) map
            .get("task");

    if (map2.getAutoCompleteDate() != null) {
        WorkFlowFacade facade = new WorkFlowFacade();
        facade.completeAutoCompleteTask(map2);
        Scheduler scheduler=(Scheduler) map.get("scheduler");
        try {
            scheduler.shutdown();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

}

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    scheduler.start();
    JobDataMap map2 = new JobDataMap();
    map2.put("task", actsMap);
    map2.put("scheduler", scheduler);
    JobDetail job = newJob(QuartzJob.class).withIdentity("job"+String.valueOf(actsMap.getId()))
            .usingJobData(map2).build();
    Trigger trigger = newTrigger().withIdentity("trigger"+String.valueOf(actsMap.getId()))
            .startAt(actsMap.getAutoCompleteDate()).build();
    scheduler.scheduleJob(job, trigger);

或者我是否只需要在客户端转移与调度程序相关的项目? 我没有得到如何解决这个问题。 请帮帮我

3 个答案:

答案 0 :(得分:2)

要使调度程序运行,应该有一些东西可以启动它。我不确定进程是如何发生的,但你可以在servlet中编写这个调度程序

public class MySchedulerServlet extends GenericServlet {

private static final long serialVersionUID = 1477091380142883153L;

/**
 * Constant to represent property for the cron expression.
 */
private static final String CRON_EXPRESSION = "0 0 0 ? * SUN";

public void init(ServletConfig servletConfig) throws ServletException {

    super.init(servletConfig);

    // The Quartz Scheduler
    Scheduler scheduler = null;

    try {

        // Initiate a Schedule Factory
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        // Retrieve a scheduler from schedule factory
        scheduler = schedulerFactory.getScheduler();
        // Initiate JobDetail with job name, job group and
        // executable job class
        JobDetail jobDetail = new JobDetail("RetryJob", "RetryGroup", QuartzJob.class);
        // Initiate CronTrigger with its name and group name
        CronTrigger cronTrigger = new CronTrigger("cronTrigger",
                "triggerGroup");
        // setup CronExpression
        CronExpression cexp = new CronExpression(CRON_EXPRESSION);
        // Assign the CronExpression to CronTrigger
        cronTrigger.setCronExpression(cexp);
        // schedule a job with JobDetail and Trigger
        scheduler.scheduleJob(jobDetail, cronTrigger);

        // start the scheduler
        scheduler.start();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

public void service(ServletRequest serveletRequest,
        ServletResponse servletResponse) throws ServletException, IOException {

}

}

并在你的web.xml中加载启动时的sceduler。这对我有用。

       <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>
    <load-on-startup>1</load-on-startup>
</servlet>

        <servlet-name>MySchedulerServlet </servlet-name>
        <servlet-class>com.servlet.MySchedulerServlet </servlet-class>
    <load-on-startup>2</load-on-startup>

答案 1 :(得分:0)

在这种情况下我使用了线程。

public class AutoCompleteTaskThread extends Thread {

private ActivityTransactionSettingsMap taskMap;

public AutoCompleteTaskThread(ActivityTransactionSettingsMap map) {
    this.taskMap = map;
}
@Override
public void run() {
    try {
        new AutoCompleteTaskScheduler().ScheduleJob(taskMap);
    } catch (Exception e) {          
        e.printStackTrace();
    }
}

}

如下所示,在本地机器上工作正常。但是对于jboss服务器,它无法正常工作。

答案 2 :(得分:0)

我使用了一个AutoCompleteTaskThread类的实例,并在此处调用了start方法。

    private void addAutoCompleteTask(ActivityTransactionSettingsMap newTask) {
    AutoCompleteTaskThread thread = new AutoCompleteTaskThread(newTask);
    thread.start();
}

这里我为任何我想开始新线程的新任务启动了一个线程。