【问题标题】:Quartz scheduler in not running in warQuartz 调度程序未在战争中运行
【发布时间】:2011-12-16 10:08:22
【问题描述】:

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

我有两个项目。一个是 gwt Web 应用程序客户端项目(用于 ui 部分),另一个是用于服务器端调用的 java 项目。(用于数据库交互)。在客户端项目中,我放置了一个服务器项目以供参考。运行时我从客户端创建一个战争并将一罐服务器项目添加到战争文件夹。

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

但是在 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);

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

【问题讨论】:

  • 据我所知,调度程序与您的 GWT 代码无关。调度器的触发器是什么?
  • 这里是触发器。触发器 trigger = newTrigger().withIdentity("trigger") .startAt(tomaroDate).build();
  • 不确定我是否能找到您。它应该从第二天开始连续运行吗?这是你需要的吗?
  • 这只是一个示例...它将在特定日期开始。

标签: gwt jboss scheduling quartz-scheduler


【解决方案1】:

为了让调度程序运行,应该有一些东西可以启动它。我不确定这个过程是如何发生的,但你可以在 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 启动时加载调度程序。这对我有用。

       <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>

【讨论】:

    【解决方案2】:

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

    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 服务器它不工作。

    【讨论】:

    • 再问,谁在调用线程的start方法?
    【解决方案3】:

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

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

    在这里,我为任何我想为其启动新线程的新任务启动了一个线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多