使用QUARTZ调度程序生成报告时出现奇怪的问题
我可以生成一份报告!没问题。
方法(reportsBean)正常工作,但是通过石英时会出现问题
有什么想法吗?我不知道该怎么做了:/
13449 [MyScheduler_Worker-1] ERROR org.quartz.core.JobRunShell - 作业group1.JobReport在com.changes的com.changes.bean.ReportsBean.createPdfCriticalChanges(ReportsBean.java:104)处抛出了一个未处理的异常:java.lang.NullPointerException orquart.quartz.core.JobRunShell.run(JobRunShell.java:202)中的.quartz.JobReport.execute(JobReport.java:36)org.quartz.simpl.SimpleThreadPool $ WorkerThread.run(SimpleThreadPool.java:573)13452 [MyScheduler_Worker-1] ERROR org.quartz.core.ErrorLogger - Job(group1.JobReport抛出异常.org.quartz.SchedulerException:Job在org.quartz处抛出了一个未处理的异常。[请参见嵌套异常:java.lang.NullPointerException] .core.JobRunShell.run(JobRunShell.java:213)at org.quartz.simpl.SimpleThreadPool $ WorkerThread.run(SimpleThreadPool.java:573)引起:com.changes.bean.ReportsBean.createPdfCriticalChanges的java.lang.NullPointerException (ReportsBean.java:104)位于org.quartz.core.JobRunShell.r的com.changes.quartz.JobReport.execute(JobReport.java:36)联合国(JobRunShell.java:202)
reportsbean
public class JobReport implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
//BasicConfigurator.configure();
try {
ReportsBean reportsBean = new ReportsBean();
reportsBean.createPdfCriticalChanges();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy – hh:mm:ss");
System.out.println("Rodou: " + dateFormat.format( new Date() ));
} catch (JRException | SQLException e) {
e.printStackTrace();
}
}
}
quartz.properties
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.plugin.jobInitializer.class =org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = com/changes/quartz/quartz-config.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
veb.hml
<!-- Inicio Quartz --> <servlet> <servlet-name>QuartzServlet</servlet-name> <servlet-class>com.changes.quartz.servlet.QuartzServlet</servlet-class> </servlet> <servlet> <servlet-name>QuartzInitializer</servlet-name> <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class> <init-param> <param-name>config-file</param-name> <param-value>quartz.properties</param-value> </init-param> <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>2</load-on-startup> </servlet> <!-- Fim Quartz -->
问题是您的ReportsBean中有NullPointerException。
由于Quartz执行方法的签名是
public void execute(JobExecutionContext context) throws JobExecutionException
Quartz只能处理将在此方法中抛出的JobExecutionException。但在您的情况下,它会出现意外的NullPointerException。
要解决此问题,您应该删除NullPointer的原因。从上面的源代码我无法弄清楚这个异常的原因,因为它发生在您的ReportsBean中。
当然,您的方法ReportsBean.createPdfCriticalChanges可以访问未初始化的成员。
在第104行:String report FacesContext.getCurrentInstance().getExternalContext().getRealPath("/web/reports/criticalcr.jrxml");
请记住:它的工作原理是石英。
ReportsBean
public void createPdfCriticalChanges() throws JRException,SQLException {
System.out.println("generating report...");
String report = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/web/reports/criticalcr.jrxml");
JasperReport pathjrxml = JasperCompileManager.compileReport(report);
//JasperReport pathjrxml = JasperCompileManager.compileReport("web/reports/criticalcr.jrxml"); //Funciona com o inicia Agenda em XML "web/reports/changetracker_criticalcr.jrxml"
JasperPrint printReport = JasperFillManager.fillReport(pathjrxml, null, conn.getConn());
JasperExportManager.exportReportToPdfFile(printReport, "/web/reports/changetracker_criticalcr.pdf"); //Funciona com o inicia Agenda em XML "web/reports/criticalcr.pdf"
System.out.println("report generated!");
}
它不会抛出JobExecutionExceptionnb使用@postController和@override方法init