I would look at Observable and Observer class in java to achieve signal sort of behavior.
On Tue, Feb 26, 2013 at 5:47 PM, Nigel Sheridan-Smith <wtfi...@gmail.com>wrote: > Hi all, > > I'm hooking up a data import batch job with Quartz to Wicket and have > struck an issue - how do you notify a Wicket page that the batch job is > complete? > > I originally planned to update the Wicket session with the running count of > how many items are processed. However, the Wicket request cycle expires so > it is not possible to update the session after the page is rendered. > > > To create the job: > > JobDataMap dataMap = new JobDataMap(); > > dataMap.put("service", getService()); > > dataMap.put("deck", deck); > > dataMap.put("importType", importType); > > dataMap.put("fieldMapping", fieldMapping); > > dataMap.put("fileUploaded", fileUploaded); > > dataMap.put("totalRecords", prevImportSummary.totalRecordsInImport); > > dataMap.put("callback", this); > > // Create a new job with a basic trigger > > JobDetail job = newJob(DataImportJob.class > > ).usingJobData(dataMap).build(); > > Trigger trigger = > > newTrigger().startNow().withSchedule(simpleSchedule()).build(); > > try { > > // Schedule the job for immediate start > > TorScheduler.getScheduler().scheduleJob(job, trigger); > > } catch (SchedulerException se) { > > TorScheduler.getLogger().error(se.getMessage()); > > throw new TorException("Cannot start the data import job"); > > } > > The data import job uses a callback to the Wicket page: > > callback.updateTotal(totalRecords); > > > callback.updateProgress(/* 0 */ totalRecords, false); // TODO: > > Temporarily skip the progress bar page > > > > > > // Now add the entries to the repository > > > ImportSummary importSummary = dataImportProcess.commit(callback); > > > callback.updateImportSummary(importSummary); > > > > The callback has this implementation (in the page): > > public void updateProgress(int count, boolean error) { > > > > // Attempt to reuse the same session as before (left open) > > > > session.setAttribute("importItemsDone", (Integer) count); > > > > session.setAttribute("importIsInError", (Boolean) error); > > > > } > > > > @Override > > > > public void updateTotal(int total) { > > > > > > // Attempt to reuse the same session as before (left open) > > > > session.setAttribute("importItemsTotal", (Integer) total); > > > > } > > > > > > @Override > > > > public void updateImportSummary(ImportSummary importSummary) { > > > > > > // Attempt to reuse the same session as before (left open) > > > > session.setAttribute("importSummary", importSummary); > > > > } > > > > However, I get this exception when attempting to update the Wicket session > with the progress counter: > > java.lang.IllegalStateException: Cannot set the attribute: no RequestCycle > available. If you get this error when using WicketTester.startPage(Page), > make sure to call WicketTester.createRequestCycle() beforehand. > at org.apache.wicket.Session.setAttribute(Session.java:773) > at > > com.xxx.tor.webapp.profile.Wiz13ImportResults.updateTotal(Wiz13ImportResults.java:208) > at com.xxx.tor.webapp.batch.DataImportJob.importNow(DataImportJob.java:53) > at com.xxx.tor.webapp.batch.DataImportJob.execute(DataImportJob.java:83) > at org.quartz.core.JobRunShell.run(JobRunShell.java:213) > at > > org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) > > > Is this the best approach? Or should I attempt to use methods on the Quartz > scheduler to get the current progress of the batch job from within > AbstractAjaxTimerBehavior.onTimer( )? > > I am using the JQWicket (jQuery UI) progress bar... with a 5 second delay > on updates to the page. > > Cheers, > > Nigel > > > -- > e: ni...@joinsomeone.com > m: +61 403 930 963 > > Get together for fun activities at www.joinsomeone.com > > Like us on Facebook www.facebook.com/JoinSomeone > Follow us on Twitter @JoinSomeone >