Кварцевый планировщик не работает на войне - PullRequest
2 голосов
/ 16 декабря 2011

Я использую кварцевый планировщик в веб-приложении gwt. Моя структура приложения выглядит следующим образом.

У меня есть два проекта. Один из них - клиентский проект веб-приложения gwt (для пользовательской части), а другой - проект Java для сервера.боковой вызов. (для взаимодействия с базой данных). В клиентском проекте я помещаю проект сервера для справки. При запуске я создаю войну из клиента и добавляю банку серверного проекта в папку war.

Теперь я использовал планировщик на стороне сервера для автоматического выполнения некоторых задач. Пока он запускается локально (без войны), планировщик работает правильно.

Но во время работы war на сервере jboss планировщик не работает.

Мой весь код, связанный с планировщиком, и 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 ]

2 голосов
/ 16 декабря 2011

Для запуска планировщика должно быть что-то, что могло бы его запустить. Я не уверен, как происходит процесс, но вы могли бы написать этот планировщик в сервлете

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>
0 голосов
/ 19 декабря 2011

Я использовал экземпляр класса AutoCompleteTaskThread и вызвал метод start для этого.

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

Здесь я начал поток для любой новой задачи, для которой я хочу начать новый поток.

0 голосов
/ 16 декабря 2011

Я использовал нить в этом случае.

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 это не работает.

...