KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jfox > ejb > handler > T5_TransactionHandler


1 /* JFox, the OpenSource J2EE Application Server
2  *
3  * Distributable under GNU LGPL license by gun.org
4  * more details please visit http://www.huihoo.org/jfox
5  */

6
7 package org.jfox.ejb.handler;
8
9 import java.util.Iterator JavaDoc;
10 import javax.ejb.EJBException JavaDoc;
11 import javax.ejb.EnterpriseBean JavaDoc;
12 import javax.ejb.SessionSynchronization JavaDoc;
13 import javax.transaction.NotSupportedException JavaDoc;
14 import javax.transaction.Status JavaDoc;
15 import javax.transaction.Transaction JavaDoc;
16 import javax.transaction.TransactionManager JavaDoc;
17 import javax.transaction.TransactionRequiredException JavaDoc;
18
19 import org.jfox.ejb.Bucket;
20 import org.jfox.ejb.EJBSynchronization;
21 import org.jfox.ejb.connector.EJBInvocation;
22 import org.jfox.ejb.meta.EJBDescriptor;
23 import org.jfox.ejb.meta.SessionDescriptor;
24 import org.jfox.ejb.meta.TransactionAttribute;
25 import org.jfox.tm.TxManager;
26
27 /**
28  * @author <a HREF="mailto:young_yy@hotmail.com">Young Yang</a>
29  */

30
31 public class T5_TransactionHandler extends AbstractHandler {
32     private static TransactionManager JavaDoc tm = TxManager.getInstance();
33
34     public Object JavaDoc invokeBean(Bucket bucket, EJBInvocation invocation, Iterator JavaDoc iter) throws Exception JavaDoc {
35         logger.debug("invokeBean " + bucket + ", " + invocation);
36         Transaction JavaDoc suspendedTrans = null;
37         EJBDescriptor meta = bucket.getEJBDescriptor();
38
39 // SessionDescriptor meta = (SessionDescriptor) bucket.getEJBDescriptor();
40

41         // 事务同步
42
EnterpriseBean JavaDoc bean = invocation.getBean();
43         boolean isSync = bean instanceof SessionSynchronization JavaDoc ? true : false;
44         if(isSync) {
45             if(!meta.isSession())
46                 throw new EJBException JavaDoc("only stateful session bean can implement javax.ejb.SessionSynchronization.");
47             else {
48                 if(((SessionDescriptor) meta).isStateless()) {
49                     throw new EJBException JavaDoc("only stateful session bean can implement javax.ejb.SessionSynchronization.");
50                 }
51             }
52         }
53
54 // byte type = TransactionAttribute.getTransactionAttribute(meta.getTransactionType());
55
byte type = meta.getMethodTransactionAttribute(invocation.getMethod());
56         int status = tm.getStatus();
57
58         /**
59          * 由这个方法创建的事务,因为该方法可能集成其调用方法的事务,
60          * 但是该方法不能 commit 该事务,而应该由其调用方法来 commit
61          */

62         boolean created = false;
63         boolean toCommit = true;
64         try {
65             switch(type) {
66                 case TransactionAttribute.TX_NOT_SUPPORTED:
67                     {
68                         if(status != Status.STATUS_NO_TRANSACTION) {
69                             suspendedTrans = tm.suspend();
70                         }
71                         break;
72                     }
73                 case TransactionAttribute.TX_SUPPORTS:
74                     {
75                         break;
76                     }
77                 case TransactionAttribute.TX_REQUIRED:
78                     {
79                         if(status == Status.STATUS_NO_TRANSACTION) {
80                             tm.begin();
81                             // tx synchronize
82
if(isSync) {
83                                 EJBSynchronization ejbSync = new EJBSynchronization((SessionSynchronization JavaDoc) bean, tm.getTransaction());
84                                 ejbSync.afterBegin();
85                             }
86                             created = true;
87                         }
88                         break;
89                     }
90                 case TransactionAttribute.TX_REQUIRES_NEW:
91                     {
92                         if(status != Status.STATUS_NO_TRANSACTION) {
93                             suspendedTrans = tm.suspend();
94                         }
95                         tm.begin();
96                         // tx synchronize
97
if(isSync) {
98                             EJBSynchronization ejbSync = new EJBSynchronization((SessionSynchronization JavaDoc) bean, tm.getTransaction());
99                             tm.getTransaction().registerSynchronization(ejbSync);
100                             ejbSync.afterBegin();
101                         }
102                         created = true;
103                         break;
104                     }
105                 case TransactionAttribute.TX_MANDATORY:
106                     {
107                         if(status == Status.STATUS_NO_TRANSACTION) {
108                             throw new TransactionRequiredException JavaDoc("Transaction Required");
109                         }
110                         break;
111                     }
112                 case TransactionAttribute.TX_NEVER:
113                     {
114                         if(status != Status.STATUS_NO_TRANSACTION) {
115                             throw new NotSupportedException JavaDoc("Transaction Not Supported");
116                         }
117                         break;
118                     }
119             }
120             return super.invokeBean(bucket, invocation, iter);
121         }
122                 // only catch EJBException, rollback the transaction
123
// Application Exception maybe right logic
124
catch(EJBException JavaDoc e) {
125             toCommit = false;
126             throw e;
127         }
128         finally {
129             if(created == true) {
130                 if(toCommit) {
131                     tm.commit();
132                 }
133                 else {
134                     tm.rollback();
135                 }
136             }
137             else { // 如果没有新建事务,但是继承了事务并且当前线程抛出了异常,要标记当前事务为 rollback only
138
if(toCommit == false && tm.getStatus() != Status.STATUS_NO_TRANSACTION) {
139                     tm.getTransaction().setRollbackOnly();
140                 }
141             }
142             if(suspendedTrans != null) {
143                 tm.resume(suspendedTrans);
144             }
145         }
146     }
147
148     public static void main(String JavaDoc[] args) {
149
150     }
151 }
Popular Tags