33import com .qiniu .android .utils .Utils ;
44
55import java .util .ArrayList ;
6- import java .util .List ;
76import java .util .Timer ;
87import java .util .TimerTask ;
98import java .util .concurrent .ConcurrentLinkedQueue ;
1413public class TransactionManager {
1514
1615 /// 事务链表
17- private final ConcurrentLinkedQueue <Transaction > transactionList = new ConcurrentLinkedQueue <>();
16+ protected final ConcurrentLinkedQueue <Transaction > transactionList = new ConcurrentLinkedQueue <>();
1817 /// 事务定时器
1918 private Timer timer ;
2019
20+ protected long actionCount = 0 ;
21+
2122 private static final TransactionManager transactionManager = new TransactionManager ();
2223
2324 private TransactionManager () {
@@ -28,9 +29,8 @@ public static TransactionManager getInstance() {
2829 }
2930
3031 /// 根据name查找事务
31- public synchronized ArrayList <Transaction > transactionsForName (String name ) {
32+ public ArrayList <Transaction > transactionsForName (String name ) {
3233 ArrayList <Transaction > arrayList = new ArrayList <>();
33- Transaction [] transactionList = this .transactionList .toArray (new Transaction [0 ]);
3434 for (Transaction transaction : transactionList ) {
3535 if ((name == null && transaction .name == null ) || (transaction .name != null && transaction .name .equals (name ))) {
3636 arrayList .add (transaction );
@@ -40,9 +40,8 @@ public synchronized ArrayList<Transaction> transactionsForName(String name) {
4040 }
4141
4242 /// 是否存在某个名称的事务
43- public synchronized boolean existTransactionsForName (String name ) {
43+ public boolean existTransactionsForName (String name ) {
4444 boolean isExist = false ;
45- Transaction [] transactionList = this .transactionList .toArray (new Transaction [0 ]);
4645 for (Transaction transaction : transactionList ) {
4746 if ((name == null && transaction .name == null ) || (transaction .name != null && transaction .name .equals (name ))) {
4847 isExist = true ;
@@ -53,7 +52,7 @@ public synchronized boolean existTransactionsForName(String name) {
5352 }
5453
5554 /// 添加一个事务
56- public synchronized void addTransaction (Transaction transaction ) {
55+ public void addTransaction (Transaction transaction ) {
5756 if (transaction == null ) {
5857 return ;
5958 }
@@ -62,7 +61,7 @@ public synchronized void addTransaction(Transaction transaction) {
6261 }
6362
6463 /// 移除一个事务
65- public synchronized void removeTransaction (Transaction transaction ) {
64+ public void removeTransaction (Transaction transaction ) {
6665 if (transaction == null ) {
6766 return ;
6867 }
@@ -78,7 +77,7 @@ public synchronized void performTransaction(Transaction transaction) {
7877 if (!transactionList .contains (transaction )) {
7978 transactionList .add (transaction );
8079 }
81- transaction .createTime = Utils .currentSecondTimestamp () - transaction . interval ;
80+ transaction .nextExecutionTime = Utils .currentSecondTimestamp ();
8281 }
8382
8483 /// 销毁资源 清空事务链表 销毁常驻线程
@@ -89,11 +88,6 @@ public synchronized void destroyResource() {
8988
9089
9190 private void handleAllTransaction () {
92- Transaction [] transactionList = null ;
93- synchronized (this ) {
94- transactionList = this .transactionList .toArray (new Transaction [0 ]);
95- }
96-
9791 for (Transaction transaction : transactionList ) {
9892 handleTransaction (transaction );
9993 if (transaction .maybeCompleted ()) {
@@ -126,6 +120,7 @@ private void invalidateTimer() {
126120 }
127121
128122 private void timerAction () {
123+ actionCount += 1 ;
129124 handleAllTransaction ();
130125 }
131126
@@ -150,9 +145,11 @@ public static class Transaction {
150145 private final int interval ;
151146 // 创建时间
152147 private long createTime ;
148+ // 下一次需要执行的时间
149+ protected long nextExecutionTime ;
153150
154151 // 已执行次数
155- private long executedCount = 0 ;
152+ protected long executedCount = 0 ;
156153 private boolean isExecuting = false ;
157154
158155
@@ -166,6 +163,7 @@ public Transaction(String name,
166163 this .interval = 0 ;
167164 this .actionHandler = actionHandler ;
168165 this .createTime = Utils .currentSecondTimestamp ();
166+ this .nextExecutionTime = this .createTime + after ;
169167 }
170168
171169
@@ -180,20 +178,21 @@ public Transaction(String name,
180178 this .interval = interval ;
181179 this .actionHandler = actionHandler ;
182180 this .createTime = Utils .currentSecondTimestamp ();
181+ this .nextExecutionTime = this .createTime + after ;
183182 }
184183
185- private boolean shouldAction () {
184+ protected boolean shouldAction () {
186185 long currentTime = Utils .currentSecondTimestamp ();
187186 if (this .type == TransactionTypeNormal ) {
188- return executedCount < 1 && ( currentTime - createTime ) >= after ;
187+ return executedCount < 1 && currentTime >= nextExecutionTime ;
189188 } else if (this .type == TransactionTypeTime ) {
190- return ( currentTime - createTime ) >= ( executedCount * interval + after ) ;
189+ return currentTime >= nextExecutionTime ;
191190 } else {
192191 return false ;
193192 }
194193 }
195194
196- private boolean maybeCompleted () {
195+ protected boolean maybeCompleted () {
197196 if (this .type == TransactionTypeNormal ) {
198197 return executedCount > 0 ;
199198 } else if (this .type == TransactionTypeTime ) {
@@ -208,9 +207,15 @@ private synchronized void handleAction() {
208207 return ;
209208 }
210209 if (actionHandler != null ) {
211- executedCount += 1 ;
212210 isExecuting = true ;
213- actionHandler .run ();
211+ executedCount += 1 ;
212+
213+ try {
214+ actionHandler .run ();
215+ } catch (Exception ignored ) {
216+ }
217+
218+ nextExecutionTime = Utils .currentSecondTimestamp () + interval ;
214219 isExecuting = false ;
215220 }
216221 }
0 commit comments