2015-01-05 3 views
1

방금 ​​엔터프라이즈 응용 프로그램과 함께 사용할 QUARTZ를 설정했습니다. 다음 코드 스 니펫은 예제 일뿐 실제 웹 응용 프로그램에서 가져온 것이 아닙니다.

QUARTZ 작업 스케줄러 - JobListener 문제 [Java]

트리거/스케줄러 클래스는 다음과 같습니다

import org.apache.log4j.Logger; 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 
import org.quartz.JobListener; 

public class HelloJobListener implements JobListener { 

    public static final String LISTENER_NAME = "HELLO JOB LISTENER"; 
    private static final Logger log = Logger.getLogger(HelloJobListener.class); 

    @Override 
    public String getName() { 
     return LISTENER_NAME; 
    } 

    @Override 
    public void jobToBeExecuted(JobExecutionContext context) { 
     String jobName = context.getJobDetail().getKey().toString(); 
     log.info("###############################################"); 
     log.info("JOB IS STARTING"); 
     log.info("Job: " + jobName); 
     log.info("###############################################"); 

    } 

    @Override 
    public void jobExecutionVetoed(JobExecutionContext context) { 
     log.info("###############################################"); 
     log.info("JOB EXECUTION VETOED"); 
     log.info("###############################################"); 

    } 

    @Override 
    public void jobWasExecuted(JobExecutionContext context, 
      JobExecutionException jobException) { 

     String jobName = context.getJobDetail().getKey().toString(); 
     log.info("###############################################"); 
     log.info("JOB WAS EXECUTED"); 
     log.info("Job: " + jobName); 
     log.info("###############################################"); 

     if (!jobException.getMessage().equals("")) { 
      log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 
      log.info("Exception thrown by: " + jobName); 
      log.info("Exception: " + jobException.getMessage()); 
      log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 

     } 

    } 

} 
:

import javax.annotation.PostConstruct; 

import org.quartz.Scheduler; 
import org.quartz.SchedulerException; 
import org.quartz.SchedulerFactory; 
import org.quartz.impl.StdSchedulerFactory; 
import org.quartz.impl.matchers.GroupMatcher; 

public class TriggerXML { 
    @PostConstruct 
    public static void main(String[] args) throws SchedulerException { 
     SchedulerFactory factory = new StdSchedulerFactory(); 
     Scheduler scheduler = factory.getScheduler(); 
     scheduler.getListenerManager().addJobListener(new HelloJobListener(), 
       GroupMatcher.jobGroupEquals("fg_jobgroup_01")); 
     scheduler.start(); 
    } 
} 



리스너 클래스는 다음과 같습니다 마지막으로

# Basic config 
org.quartz.scheduler.instanceName = DBClusteredScheduler 
org.quartz.scheduler.instanceId = AUTO 
org.quartz.scheduler.skipUpdateCheck = true 
org.quartz.scheduler.jobFactory.class = org.quartz.simpl.SimpleJobFactory 

# Thread Pool config 
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool 
org.quartz.threadPool.threadCount = 3 

# DataSource config 
org.quartz.dataSource.quartzDataSource.driver = com.mysql.jdbc.Driver 
org.quartz.dataSource.quartzDataSource.URL = jdbc:mysql://localhost:3306/quartz 
org.quartz.dataSource.quartzDataSource.user = <user> 
org.quartz.dataSource.quartzDataSource.password = <password> 
org.quartz.dataSource.quartzDataSource.maxConnections = 8 

# Database config for MySQL JDBC connection 
org.quartz.jobStore.dataSource = quartzDataSource 
org.quartz.jobStore.tablePrefix = QRTZ_ 
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate 
org.quartz.jobStore.isClustered = true 

# Load configuration for each trigger 
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin 
org.quartz.plugin.jobInitializer.fileNames = quartz-config.xml 



그리고, 내 석영-config.xml에 :

quartz.properties



설정은 다음과 같다내가 프로그램 (TriggerXML.java)를 실행하면



, 그것은 나에게 다음과 같은 콘솔 출력을 제공합니다

2015-01-05 15:04:40,224 INFO (org.quartz.xml.XMLSchedulingDataProcessor.java:471).processFile - Parsing XML file: quartz-config.xml with systemId: quartz-config.xml 
2015-01-05 15:04:40,443 INFO (org.quartz.xml.XMLSchedulingDataProcessor.java:996).scheduleJobs - Adding 2 jobs, 2 triggers. 
2015-01-05 15:04:40,447 INFO (org.quartz.xml.XMLSchedulingDataProcessor.java:1032).scheduleJobs - Replacing job: fg_jobgroup_01.job01 
2015-01-05 15:04:40,505 INFO (org.quartz.xml.XMLSchedulingDataProcessor.java:1032).scheduleJobs - Replacing job: fg_jobgroup_01.job02 
2015-01-05 15:04:40,737 INFO (org.quartz.core.QuartzScheduler.java:575).start - Scheduler DBClusteredScheduler_$_US-HB-PC-0011420499079608 started. 
2015-01-05 15:04:40,856 INFO (com.freightgate.quartz.listener.HelloJobListener.java:21).jobToBeExecuted - ############################################### 
2015-01-05 15:04:40,857 INFO (com.freightgate.quartz.listener.HelloJobListener.java:22).jobToBeExecuted - JOB IS STARTING 
2015-01-05 15:04:40,857 INFO (com.freightgate.quartz.listener.HelloJobListener.java:23).jobToBeExecuted - Job: fg_jobgroup_01.job01 
2015-01-05 15:04:40,857 INFO (com.freightgate.quartz.listener.HelloJobListener.java:24).jobToBeExecuted - ############################################### 
2015-01-05 15:04:40,857 INFO (com.freightgate.quartz.jobs.Job01.java:16).execute - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
2015-01-05 15:04:40,857 INFO (com.freightgate.quartz.jobs.Job01.java:17).execute - @@@@@@@@@@@@ TEST 01 @@@@@@@@@@@@ 
2015-01-05 15:04:40,857 INFO (com.freightgate.quartz.jobs.Job01.java:18).execute - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
2015-01-05 15:04:40,858 INFO (com.freightgate.quartz.listener.HelloJobListener.java:41).jobWasExecuted - ############################################### 
2015-01-05 15:04:40,858 INFO (com.freightgate.quartz.listener.HelloJobListener.java:42).jobWasExecuted - JOB WAS EXECUTED 
2015-01-05 15:04:40,858 INFO (com.freightgate.quartz.listener.HelloJobListener.java:43).jobWasExecuted - Job: fg_jobgroup_01.job01 
2015-01-05 15:04:40,858 INFO (com.freightgate.quartz.listener.HelloJobListener.java:44).jobWasExecuted - ############################################### 
2015-01-05 15:04:40,859 ERROR (org.quartz.core.ErrorLogger.java:2425).schedulerError - Unable to notify JobListener(s) of Job that was executed: (error will be ignored). trigger= PROCESS_LEAD_TRIGGER_GROUP.Job01_TRIGGER job= fg_jobgroup_01.job01 
org.quartz.SchedulerException: JobListener 'HELLO JOB LISTENER' threw exception: null [See nested exception: java.lang.NullPointerException] 
    at org.quartz.core.QuartzScheduler.notifyJobListenersWasExecuted(QuartzScheduler.java:1987) 
    at org.quartz.core.JobRunShell.notifyJobListenersComplete(JobRunShell.java:340) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:224) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) 
Caused by: java.lang.NullPointerException 
    at com.freightgate.quartz.listener.HelloJobListener.jobWasExecuted(HelloJobListener.java:46) 
    at org.quartz.core.QuartzScheduler.notifyJobListenersWasExecuted(QuartzScheduler.java:1985) 



나는하지 않는 무엇 리스너 클래스 내에서 설정 한 출력이 로그에 기록되는 이유는 무엇입니까? 그렇지만 어쨌든 예외가 발생합니다. Google 검색이 많았지 만 문서화되지 않았습니다. 또한 XML 설정에서 리스너를 설정하는 방법을 찾지 못했습니다.

도움을 주시면 감사하겠습니다.

감사합니다.

if (!jobException.getMessage().equals("")) { 
    log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 
    log.info("Exception thrown by: " + jobName); 
    log.info("Exception: " + jobException.getMessage()); 
    log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 
} 

작업이 성공적으로 실행 된 경우 JobExecutionException 가능성이있을 것입니다 null :

+0

HelloJobListener의 46 행은 무엇입니까? – Raffaele

+0

'String jobName = context.getJobDetail(). getKey(). toString();'은 getKey()가'null'을 반환하지 않는지 확인합니다. – adamdc78

답변

3

당신은 분명히 NullPointerException를 얻을 내가 줄 번호가 표시되지 않더라도,이 가능성이 그 원인이다. 따라서 다음과 같이 확인해야합니다.

if (jobException != null) { 
    // Job failed 
} 
+0

'JobExecutionException == null'도'JobExecutionException'의 메세지는 비 었습니까? 그렇다면, 나는 당신의 요지를 얻지 못합니다. 어쨌든 당신의 제안을 시험 할 시간이 없었 으면, 내일 할 것입니다. –

+0

@MoshPit Exception이'null'의 경우, 예외는 없기 때문에 분명히 메세지는 없습니다 ('jobException'는 null 참조 임). 그래서 당신이 그것 (getMessage()와 같은)에 무엇이든 부를 때, 당신은 NPE를 얻는다. –

+0

그건 실제로 많은 의미가 있습니다. 고마워요! –