Using PerthreadManager.run() is more convenient. i.e.
new Thread("MyThread") { public void run() { ptm.run(new Runnable() { public void run() { List<MyEntity> stuff = dao.getSomething(); doSomethingWithIt(stuff); } }); }; If I was doing this a lot, I'd create a service or base class to make it more concise. On Mon, Feb 27, 2012 at 2:29 AM, Greg Pagendam-Turner <g...@liftyourgame.com> wrote: > Thanks for your thoughts Paul > > > Regards, > > Greg > > > On 27/02/2012, at 4:37 PM, Paul Stanton <p...@mapshed.com.au> wrote: > >> Hi Greg, >> >> The following seems to work, although I'm not entirely sure if it should !! >> >> If the tapestry IOC geniuses agree, it is quite elegant and you can @Inject >> Session within your DaoImpl. >> >> Basically, injecting the PerthreadManager allows you to tell tapestry-ioc >> that your thread is complete. This will perform all the necessary cleanup. >> You only need to do this when you create your own threads obviously. >> >> I'm just not sure if its the best idea to inject the Dao at the top level, >> since the object (and possibly session) would be re-used in both contexts. >> >> public class MyPage { >> @Inject >> private PerthreadManager ptm; >> @Inject >> private Dao dao; >> >> void setupRender() { >> dao.getSomething(); >> >> new Thread("MyThread") { >> @Override >> public void run() { >> try { >> List<MyEntity> stuff = dao.getSomething(); >> doSomethingWithIt(stuff); >> } >> finally { >> ptm.cleanup(); >> } >> } >> }.start(); >> } >> } >> >> Can someone who knows please confirm or correct this theory please!! >> >> Thanks, Paul. >> >> On 29/01/2012 4:23 PM, Greg Pagendam-Turner wrote: >>> In answer to my own question: >>> >>> Inject HibernateSessionSource and call its create() method to get a new >>> session. >>> >>> public synchronized void execute(String url, String subject, SendEmail >>> sendEmail, HibernateSessionSource sessionSource) { >>> // For each mailout fetch url and send mailout >>> logger.debug("BulkEmailerImpl.execute was called >>> --------------------------------"); >>> >>> Session session = sessionSource.create(); >>> userDAO = new UserDAOImpl(session); >>> >>> >>> I just need to find a better way of instantiating the DAO. >>> >>> Regards, >>> >>> Greg >>> >>> -------- Original Message -------- >>> Subject: Reusing tapestry hibernate session in a thread >>> Date: Sun, 29 Jan 2012 11:28:41 +1000 >>> From: Greg Pagendam-Turner <g...@liftyourgame.com> >>> Organization: Liftyourgame >>> To: Tapestry users scheduled thread <users@tapestry.apache.org> >>> >>> >>> >>> Hi, >>> >>> I have a batch job that sends email to users based on a query in my >>> database. >>> >>> AppModule starts it up like so in a: >>> >>> @Startup >>> public static void scheduleJobs(PeriodicExecutor executor, final >>> BulkEmailer emailer, >>> @Value("${liftyourgame.url}") >>> String urlIn, >>> @Value("${liftyourgame.subject}") >>> String subjectIn, >>> final SendEmail sendEmail >>> ) { >>> final String url = urlIn; >>> final String subject = subjectIn; >>> executor.addJob(new CronSchedule("0 0/5 * * * ?"), >>> "BulkEmailer", >>> new Runnable() { >>> public void run() { >>> emailer.execute(url + "/liftyourgame/", subject, >>> sendEmail); >>> } >>> }); >>> } >>> >>> In order to query the database the thread needs a hibernate session of >>> its own as hibernate sessions are per thread. >>> >>> Currently it creates a session and DAO like so: >>> >>> public synchronized void execute(String url, String subject, >>> SendEmail sendEmail) { >>> // For each mailout fetch url and send mailout >>> >>> if (factory == null) { >>> Configuration cfg = new Configuration(); >>> factory = cfg.configure().buildSessionFactory(); >>> } >>> >>> Session session = factory.openSession(); >>> userDAO = new UserDAOImpl(session); >>> >>> >>> ///// >>> >>> This means I need to add all of my entities in hibernate.cfg.xml: >>> <mapping package="com.liftyourgame.application.entities"/> >>> <mapping class="com.liftyourgame.application.entities.Action"/> >>> <mapping class="com.liftyourgame.application.entities.DailyQuote"/> >>> <mapping class="com.liftyourgame.application.entities.Goal"/> >>> <mapping class="com.liftyourgame.application.entities.Image"/> >>> <mapping class="com.liftyourgame.application.entities.LygEntity"/> >>> <mapping class="com.liftyourgame.application.entities.Measure"/> >>> <mapping class="com.liftyourgame.application.entities.Measurement"/> >>> <mapping class="com.liftyourgame.application.entities.Role"/> >>> <mapping class="com.liftyourgame.application.entities.User"/> >>> >>> Tapestry doesn't seem to need these mappings for my web application as >>> tapestry-hibernate seems to scan all classes in the entities package. >>> >>> Is there some way I could use tapestry-hibernate to setup a session for >>> my thread? >>> >>> >>> Regards, >>> >>> Greg >>> >>> >>> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > For additional commands, e-mail: users-h...@tapestry.apache.org > -- Howard M. Lewis Ship Creator of Apache Tapestry The source for Tapestry training, mentoring and support. Contact me to learn how I can get you up and productive in Tapestry fast! (971) 678-5210 http://howardlewisship.com --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org