KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jfox > tm > TxWrapper


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.tm;
8
9 import java.util.Timer JavaDoc;
10 import java.util.TimerTask JavaDoc;
11 import javax.transaction.HeuristicMixedException JavaDoc;
12 import javax.transaction.HeuristicRollbackException JavaDoc;
13 import javax.transaction.InvalidTransactionException JavaDoc;
14 import javax.transaction.NotSupportedException JavaDoc;
15 import javax.transaction.RollbackException JavaDoc;
16 import javax.transaction.Status JavaDoc;
17 import javax.transaction.Synchronization JavaDoc;
18 import javax.transaction.SystemException JavaDoc;
19 import javax.transaction.Transaction JavaDoc;
20 import javax.transaction.xa.XAResource JavaDoc;
21
22 /**
23  * 封装一个真正的事务对象,做一些辅助操作
24  *
25  * @author <a HREF="mailto:young_yy@hotmail.com">Young Yang</a>
26  */

27
28 class TxWrapper implements Transaction JavaDoc {
29     /**
30      * ?¨?±?÷???????????±???±?ò?÷?? timout ·?·¨
31      */

32     private static Timer JavaDoc timer = new Timer JavaDoc(true);
33     private static int timeout = 10 * 24 * 60 * 60 * 1000; // 10 days
34

35     private TransactionImpl transaction = null;
36
37     TxWrapper() {
38
39     }
40
41     /**
42      * create a transaction & start a timeout
43      * ??????????????????????
44      */

45     void begin() throws SystemException JavaDoc, NotSupportedException JavaDoc {
46         transaction = new TransactionImpl();
47         timer.schedule((TimerTask JavaDoc) transaction, timeout);
48     }
49
50     void setTimeout(int millisecond) {
51         timeout = millisecond;
52     }
53
54
55     /**
56      * ·??? transaction.commit ???ó ?????? timeout ?à??,?±?°????
57      *
58      * @throws RollbackException
59      * @throws HeuristicMixedException
60      * @throws HeuristicRollbackException
61      * @throws SecurityException
62      * @throws SystemException
63      */

64     public void commit() throws RollbackException JavaDoc, HeuristicMixedException JavaDoc, HeuristicRollbackException JavaDoc, SecurityException JavaDoc, SystemException JavaDoc {
65         if(transaction == null) {
66             throw new IllegalStateException JavaDoc("no transaction associated with current thread.");
67         }
68         try {
69             transaction.commit();
70         }
71         finally { // ?????±?°????????????????
72
((TimerTask JavaDoc) transaction).cancel();
73         }
74     }
75
76     public boolean delistResource(XAResource JavaDoc xaResource, int flag) throws IllegalStateException JavaDoc, SystemException JavaDoc {
77         if(transaction == null) {
78             throw new IllegalStateException JavaDoc("no transaction associated with current thread.");
79         }
80         return transaction.delistResource(xaResource, flag);
81     }
82
83     public boolean enlistResource(XAResource JavaDoc xaResource) throws RollbackException JavaDoc, IllegalStateException JavaDoc, SystemException JavaDoc {
84         if(transaction == null) {
85             throw new IllegalStateException JavaDoc("no transaction associated with current thread.");
86         }
87         return transaction.enlistResource(xaResource);
88     }
89
90     public int getStatus() throws SystemException JavaDoc {
91         if(transaction == null) {
92             return Status.STATUS_NO_TRANSACTION;
93         }
94         else {
95             return transaction.getStatus();
96         }
97     }
98
99     public void registerSynchronization(Synchronization JavaDoc synchronization) throws RollbackException JavaDoc, IllegalStateException JavaDoc, SystemException JavaDoc {
100         if(transaction == null) {
101             throw new IllegalStateException JavaDoc("no transaction associated with current thread.");
102         }
103         if(synchronization == null) return;
104         transaction.registerSynchronization(synchronization);
105     }
106
107     /**
108      * ·??? transaction.rollback ???ó???????? timeout ?à?????????±?°????
109      *
110      * @throws IllegalStateException
111      * @throws SystemException
112      */

113     public void rollback() throws IllegalStateException JavaDoc, SystemException JavaDoc {
114         if(transaction == null) {
115             throw new IllegalStateException JavaDoc("no transaction associated with current thread.");
116         }
117         try {
118             transaction.rollback();
119         }
120         finally {
121             ((TimerTask JavaDoc) transaction).cancel();
122         }
123     }
124
125     public void setRollbackOnly() throws IllegalStateException JavaDoc, SystemException JavaDoc {
126         if(transaction == null) {
127             throw new IllegalStateException JavaDoc("no transaction associated with current thread.");
128         }
129         transaction.setRollbackOnly();
130     }
131
132     public String JavaDoc toString() {
133         if(transaction == null) {
134             return "No Transaction.";
135         }
136         else {
137             return transaction.toString();
138         }
139     }
140
141     Transaction JavaDoc suspend() throws SystemException JavaDoc {
142         if(transaction == null) {
143             throw new IllegalStateException JavaDoc("no transaction associated with current thread.");
144         }
145         Transaction JavaDoc suspendedTransaction = transaction;
146         transaction.suspend();
147         transaction = null;
148         return suspendedTransaction;
149     }
150
151     void resume(Transaction JavaDoc trans) throws InvalidTransactionException JavaDoc, IllegalStateException JavaDoc, SystemException JavaDoc {
152         if(trans == null || !(trans instanceof TransactionImpl)) {
153             throw new InvalidTransactionException JavaDoc(trans + " is not a instance of " + TransactionImpl.class.getName());
154         }
155         transaction = (TransactionImpl) trans;
156         try {
157             transaction.resume();
158         }
159         catch(RollbackException JavaDoc e) {
160             throw new IllegalStateException JavaDoc("transaction already rolled back, " + e.getMessage());
161         }
162     }
163 }
164
Popular Tags