Hello, I found the following example WorkQueue example over on http://wiki.apache.org/tapestry/Tapestry5HowToWorkQueue and I'm trying to use Tapestry as much as possible, but I have a couple questions.
1. The first thing I noticed was RegistryShutdownListener has been deprecated in 5.3, I'm wondering if there is any replacement in 5.4? I didn't see anything in the API referencing any kind of replacement. 2. If I made a service out of MailQueue, and fired off a list of MailQueue.queueEmails(); would they automatically be added to the threadpool of the extended class? 3. Does anybody know how to detect the completion of all the threads? -- I'm not sure if Tapestry provides any assistance. 4. In a Tapestry stateless service, can I still create a static final object? Thanks guys. package tapestryutil.services; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.apache.tapestry5.ioc.services.PerthreadManager; import org.apache.tapestry5.ioc.services.RegistryShutdownHub; import org.apache.tapestry5.ioc.services.RegistryShutdownListener; import org.slf4j.Logger; /**WorkQueue implementation that is in-line with tapestry practices regarding threads. * It is important when using tapestry services to call PerthreadManager.cleanup(); after * a task if the same thread that executed the task will be reused again. * * @see {@link ThreadPoolExecutor}*/ public class WorkQueue extends ThreadPoolExecutor implements RegistryShutdownListener{ protected final PerthreadManager _perthreadManager; private final Logger _log; public WorkQueue(PerthreadManager perthreadManager, Logger log, RegistryShutdownHub hub){ super(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); _perthreadManager = perthreadManager; _log = log; hub.addRegistryShutdownListener(this); } @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); _perthreadManager.cleanup(); } public void registryDidShutdown(){ int activeCount = getActiveCount(); if(activeCount > 0) _log.warn(String.format("Shutting down worker and waiting for %d tasks to finish", activeCount)); shutdown(); } } package tapestryutil.services;import org.apache.tapestry5.ioc.services.PerthreadManager;import org.apache.tapestry5.ioc.services.RegistryShutdownHub;import org.slf4j.Logger; //Modified as a service. public class MailQueueImpl extends WorkQueue implements MailQueue { public MailQueue(PerthreadManager perthreadManager, Logger log, RegistryShutdownHub hub) { super(perthreadManager, log, hub); } public void queueEmail(final String address, final String subject){ execute(new Runnable(){ public void run() { sendEmail(address, subject); } }); } private void sendEmail(String address, String subject){ //send email }} public Interface MailQueue { public void queueEmail(final String address, final String subject); } -- George Christman www.CarDaddy.com P.O. Box 735 Johnstown, New York