content: /**
   * 
   */
  package org.activejpa.utils;
  
  import java.util.concurrent.ThreadFactory;
  
  import org.activejpa.jpa.JPA;
  import org.activejpa.jpa.JPAContext;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  /**
   * Thread Factory implementation that ensures the jpa context is closed after the thread completes its run. 
   * This will ensure that jpa sessions are not leaked when the application is running in thread-context mode. 
   * 
   * @author ganeshs
   * 
   */
  public class ActiveJpaThreadFactory implements ThreadFactory {
      
      private static final Logger logger = LoggerFactory.getLogger(ActiveJpaThreadFactory.class); 
  
  	@Override
  	public Thread newThread(Runnable runnable) {
  		return new Thread(runnable) {
  			@Override
  			public void run() {
  				JPAContext context = JPA.instance.getDefaultConfig().getContext();
  				context.getEntityManager();
  				try {
  					super.run();
  				} catch(Exception e) {
  					logger.error("Failed while running the thread", e);
  				} finally {
  					if (context.isTxnOpen()) {
  						context.closeTxn(true);
  					}
  					context.close();
  				}
  			}
  		};
  	}
  
  }
  