1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.monitoring.jta;
18
19 import javax.annotation.Resource;
20 import javax.interceptor.AroundInvoke;
21 import javax.interceptor.AroundTimeout;
22 import javax.interceptor.Interceptor;
23 import javax.interceptor.InvocationContext;
24 import javax.transaction.Status;
25 import javax.transaction.Synchronization;
26 import javax.transaction.TransactionSynchronizationRegistry;
27
28 @Interceptor
29 @JTAMonitored
30 public class JTAInterceptor {
31 private static final String RESOURCE_KEY = JTAInterceptor.class.getName();
32
33 @Resource
34 private TransactionSynchronizationRegistry transactionSynchronizationRegistry;
35
36 @AroundInvoke
37 @AroundTimeout
38 public Object jta(final InvocationContext invocationContext) throws Throwable {
39 if (transactionSynchronizationRegistry.getResource(RESOURCE_KEY) == null) {
40 JTAGauges.ACTIVE.incrementAndGet();
41 transactionSynchronizationRegistry.putResource(RESOURCE_KEY, Boolean.TRUE);
42 transactionSynchronizationRegistry.registerInterposedSynchronization(new JTACounterSynchronization());
43 }
44 return invocationContext.proceed();
45 }
46
47 private static class JTACounterSynchronization implements Synchronization {
48 @Override
49 public void beforeCompletion() {
50
51 }
52
53 @Override
54 public void afterCompletion(final int status) {
55 if (status == Status.STATUS_COMMITTED) {
56 JTAGauges.COMMITTED.incrementAndGet();
57 } else if (status == Status.STATUS_ROLLEDBACK) {
58 JTAGauges.ROLLBACKED.incrementAndGet();
59 }
60 JTAGauges.ACTIVE.decrementAndGet();
61 }
62 }
63 }