1 22 package org.jboss.aspects.concurrent; 23 24 import org.jboss.aop.joinpoint.Invocation; 25 26 import java.util.concurrent.locks.ReentrantLock ; 27 28 33 public class MutexedMethodAspect 34 { 35 protected ReentrantLock lock; 36 protected MutexedMethod props; 37 38 public MutexedMethodAspect(MutexedMethod m) 39 { 40 props = m; 41 lock = new ReentrantLock (m.isFair()); 42 } 43 44 public Object acquire(Invocation invocation) throws Throwable 45 { 46 if (props.timeout() == -1) 47 { 48 blockIndefinately(); 49 } 50 else if (props.timeout() == 0) 51 { 52 tryLock(); 53 } 54 else 55 { 56 tryLockWithTimeout(); 57 } 58 59 try 60 { 61 return invocation.invokeNext(); 62 } 63 finally 64 { 65 lock.unlock(); 66 } 67 } 68 69 protected void blockIndefinately() 70 { 71 try 72 { 73 lock.lockInterruptibly(); 74 } 75 catch (InterruptedException e) 76 { 77 throw new LockAcquisitionFailureException("Failed to lock @MutexedMethod", e); 78 } 79 } 80 81 protected void tryLock() 82 { 83 if (!lock.tryLock()) 84 { 85 throw new LockAcquisitionFailureException("Failed to lock @MutexedMethod"); 86 } 87 } 88 89 protected void tryLockWithTimeout() 90 { 91 try 92 { 93 if (!lock.tryLock(props.timeout(), props.unit())) 94 { 95 throw new LockAcquisitionFailureException("Failed to lock @MutexedMethod. Timeout reached."); 96 } 97 } 98 catch (InterruptedException e) 99 { 100 throw new LockAcquisitionFailureException("Failed to lock @MutexedMethod", e); 101 } 102 } 103 } 104 | Popular Tags |