Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Quartz


Автор: v0ffka 23.7.2010, 13:46
Всем привет. Люди, у кого есть рабочий пример сабжа?
Как запускать его под SE приложения разобрался, но с EJB чет не получается.... Я слышал что quartz может вызывать методы бина, при этом не нужно созавать клиента... так ли это на самом деле? Если да, то буду очень признателен за хороший примерчик

Автор: ki6opr 26.7.2010, 04:22
ну у них в документации шикарный туториал вообще то есть smile

да для вызова методов EJB бина там есть специальный Job класс - EjbInvokerJob, у меня с ним правда работать не получилось на Jboss все падало, поэтому я по аналогии свой написал (какая то фигня у меня была с PortableRemoteObject.narrow).

а примерчик тебе чего именно нужен ?

вот мой конфиг кварца: 
Код

#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = MyClusteredScheduler
org.quartz.scheduler.instanceId = AUTO
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.makeThreadsDaemons = true
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource = Qds
org.quartz.jobStore.nonManagedTXDataSource = nmQds
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000
#set datasource jndi location
org.quartz.dataSource.Qds.jndiURL=jdbc/managedQuartzDS
org.quartz.dataSource.nmQds.jndiURL=jdbc/notManagedQuartzDS
#============================================================================
# History plugin
#============================================================================
org.quartz.plugin.triggHistory.class = \
  org.quartz.plugins.history.LoggingTriggerHistoryPlugin
org.quartz.plugin.triggHistory.triggerFiredMessage = \
  Trigger \{1\}.\{0\} fired job \{6\}.\{5\} at: \{4, date, HH:mm:ss MM/dd/yyyy}
org.quartz.plugin.triggHistory.triggerCompleteMessage = \
  Trigger \{1\}.\{0\} completed firing job \{6\}.\{5\} at \{4, date, HH:mm:ss MM/dd/yyyy\}.



web.xml: потому что кварц нужно запускать когда сервер стартует а в спецификации ejb 3.0 нет слушателей на запуск/остановку приложения (@PostConstruct применять нельзя, эта аннотация делает несколько другое действие) 
Код

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <context-param>
        <param-name>start-delay-seconds</param-name>
        <param-value>15</param-value>
    </context-param>
    <context-param>
        <param-name>shutdown-on-unload</param-name>
        <param-value>true</param-value>
    </context-param>
    <listener>
        <listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
    </listener>
//референсы на ejb бины которые я вызываю
</web-app>


ну и вот таким кодом я создаю задачи для quartz:
Код

    /**
     * создать задачу для quartz
     * @param cronString
     * @param jobName название задачи
     * @param triggerName название триггера
     * @param groupName название группы
     * @param handlerClass класс обработчик
     * @param params дополнительные параметры (разделены ,)
     * @return
     */
    public boolean createBillingJob(String cronString,
            String jobName,
            String triggerName,
            String groupName,
            String handlerClass,
            String params) {
        try {
            JobDataMap dataMap = new JobDataMap();
            if (params != null && params.equals("") == false) {
                String[] nameValuePairs = params.split(",");
                for (String pair : nameValuePairs) {
                    String[] nameValue = pair.split("=");
                    dataMap.put(nameValue[0], nameValue[1]);
                    LOGGER.trace("put name-value pair into jobDataMap: " + nameValue[0] + "-" + nameValue[1]);
                }
            }
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            JobDetail job =
                    new JobDetail(jobName, groupName,
                    Class.forName(handlerClass), false, false, true);
            job.setJobDataMap(dataMap);

            CronTrigger trigger = new CronTrigger();
            trigger.setCronExpression(cronString);
            trigger.setName(triggerName);
            trigger.setJobGroup(job.getGroup());
            trigger.setJobName(job.getName());
            trigger.setGroup(job.getGroup() + "_trigger");
            scheduler.scheduleJob(job, trigger);
            LOGGER.trace("job: " + groupName + "/" + jobName +
                    " was succesfull scheduled with cron : " + cronString);
            return true;
        } catch (Exception ex) {
            LOGGER.error(ex, ex);
        }
        return false;
    }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)