001package com.hammurapi.common.concurrent.transactions;
002
003import java.util.concurrent.ExecutorService;
004import java.util.concurrent.ThreadFactory;
005
006import javax.transaction.NotSupportedException;
007import javax.transaction.SystemException;
008import javax.transaction.Transaction;
009import javax.transaction.xa.XAResource;
010
011import bitronix.tm.BitronixTransactionManager;
012import bitronix.tm.TransactionManagerServices;
013import bitronix.tm.resource.ehcache.EhCacheXAResourceProducer;
014
015import com.hammurapi.common.Context;
016import com.hammurapi.common.concurrent.LocalStringPropertySet;
017import com.hammurapi.common.concurrent.NonQueueingThreadPoolExecutorService;
018import com.hammurapi.common.concurrent.PropertySet;
019import com.hammurapi.convert.ConvertingService;
020
021/**
022 * Transactional processor which uses NonQueueingThreadPoolExecutor, String PropertySet, and Bitronix transaction manager.
023 * @author Pavel Vlasov
024 *
025 */
026public class StandaloneTransactionalProcessor extends AbstractTransactionalProcessor<String> {
027        
028        private ExecutorService nqtpes;
029
030        private BitronixTransactionManager tm;
031        
032        private static ThreadLocal<ExecutorService> tmp = new ThreadLocal<ExecutorService>(); 
033        
034        private static ExecutorService setExecutorService(ExecutorService es) {
035                tmp.set(es);
036                return es;
037        }
038
039        public StandaloneTransactionalProcessor(ThreadFactory threadFactory, int threadPoolSize) {
040                super(setExecutorService(new NonQueueingThreadPoolExecutorService(threadFactory, threadPoolSize)));
041                nqtpes = tmp.get();
042                tmp.set(null);
043                tm = TransactionManagerServices.getTransactionManager();
044        }
045
046        @Override
047        protected PropertySet<String> createPropertySet(ExecutorService executorService, Context context, PropertySet<String>... chain) {
048                return new LocalStringPropertySet(executorService, ConvertingService.CONVERTER, context, Thread.currentThread().getContextClassLoader(), chain);
049        }
050
051        @Override
052        protected Transaction beginTransaction() throws NotSupportedException,  SystemException {
053                tm.begin();
054                return tm.getTransaction();
055        }       
056        
057        public void shutdown() {
058                if (nqtpes!=null) {
059                        nqtpes.shutdown();
060                }
061                if (tm!=null) {
062                        tm.shutdown();
063                }
064        }               
065        
066        public void setTransactionTimeout(int seconds) throws SystemException {
067                tm.setTransactionTimeout(seconds);
068        }
069
070        @Override
071        protected void registerXAResource(String uniqueId, XAResource xaResource) {
072                EhCacheXAResourceProducer.registerXAResource(uniqueId, xaResource);
073        }
074        
075        @Override
076        protected void unregisterXAResource(String uniqueId, XAResource xaResource) {
077                EhCacheXAResourceProducer.unregisterXAResource(uniqueId, xaResource);
078        }
079
080}