this is not currently possible with the scheduler. If a report fails, it would normally fail again at the next try without any change. Do you have a use case where this would not be the case ?
If you want to handle this, you could create a script that reexecutes the report after catching the exception. Then, you could schedule the script to execute periodically.
In my case I connect to a external DB and sometimes there are connection problems that cause the scheduler to fail. This kind of error is unusual but it happens and it’s solved by simply execute the report manually once.
It would be perfect and option in the scheduler interface to retry X number of times when fail. Do you think this could be possible in future versions?
Can you give some briefing about the script scheduling applied to this issue please?
I created ticket RS-2698 for looking at this in a future version, maybe in 3.1.
The basic idea of the script is that your script would catch all exceptions occurring during the report execution, and if some occur, it would try the report execution again. Infos on scheduling scripts: https://reportserver.net/en/guides/script/chapters/Scheduling-Scripts/
We will take a look next week at this, maybe we will be able to post a script here. Stay tuned
import net.datenwerke.rs.core.service.mail.MailService;
import net.datenwerke.rs.core.service.mail.SimpleAttachement;
import net.datenwerke.rs.core.service.mail.SimpleMail;
import net.datenwerke.rs.core.service.reportmanager.ReportExecutorService;
import net.datenwerke.rs.core.service.reportmanager.ReportService;
import net.datenwerke.rs.core.service.reportmanager.engine.CompiledReport;
import net.datenwerke.rs.core.service.reportmanager.engine.config.ReportExecutionConfig;
import net.datenwerke.rs.core.service.reportmanager.entities.reports.Report;
import net.datenwerke.rs.core.service.reportmanager.exceptions.ReportExecutorException;
/*
* This script sends a mail with a report as attachment to defined recipient.
* If the execution of the report fails, it tries to repeat it in a loop of defined cycles.
* If the execution after the defined trials still fails, this will be logged.
*/
/**** USER SETTINGS ****/
LOOPS = 5;
SLEEP_SECONDS = 10;
RECIPIENT = "email@email.com";
REPORT_ID = 49608L;
/***********************/
reportExecutorService = GLOBALS.getInstance(ReportExecutorService.class)
mailService = GLOBALS.getInstance(MailService.class)
reportService = GLOBALS.getInstance(ReportService.class)
count = 0;
while(count <= LOOPS) {
//System.out.println("Count : " + count);
Report r = reportService.getReportById(REPORT_ID);
CompiledReport pdf;
try {
pdf = reportExecutorService.execute(r, "PDF", ReportExecutionConfig.EMPTY_CONFIG);
//System.out.println("report executed!");
SimpleMail mail = mailService.newSimpleMail();
mail.setSubject("Testreport");
mail.setToRecipients(RECIPIENT);
mail.setFrom("from@reportserver.net");
SimpleAttachement attachment = new SimpleAttachement(pdf.getReport(), pdf.getMimeType(), "filename.pdf");
mail.setContent("report executed via scheduler", attachment);
// send mail
mailService.sendMail(mail);
//System.out.println("END");
break;
} catch (ReportExecutorException e) {
count++;
try {
Thread.currentThread().sleep(SLEEP_SECONDS*1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
if(count > LOOPS)System.out.println("There is still a connection problem after nearly " + SLEEP_SECONDS*LOOPS + " seconds");