1 22 package org.jboss.aspects.concurrent; 23 24 import org.jboss.aop.joinpoint.Invocation; 25 26 import java.util.concurrent.Semaphore ; 27 28 33 public class SemaphoredMethodAspect 34 { 35 protected Semaphore semaphore; 36 protected SemaphoredMethod props; 37 38 public SemaphoredMethodAspect(SemaphoredMethod m) 39 { 40 props = m; 41 semaphore = new Semaphore (m.permits(), 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 semaphore.release(); 66 } 67 } 68 69 protected void blockIndefinately() 70 { 71 try 72 { 73 semaphore.acquire(); 74 } 75 catch (InterruptedException e) 76 { 77 throw new LockAcquisitionFailureException("Failed to acquire permit for @SemaphoredMethod", e); 78 } 79 } 80 81 protected void tryLock() 82 { 83 if (!semaphore.tryAcquire()) 84 { 85 throw new LockAcquisitionFailureException("Failed to acquire permit for @SemaphoredMethod"); 86 } 87 } 88 89 protected void tryLockWithTimeout() 90 { 91 try 92 { 93 if (!semaphore.tryAcquire(props.permits(), props.timeout(), props.unit())) 94 { 95 throw new LockAcquisitionFailureException("Failed to acquire permit for @SemaphoredMethod. Timeout reached."); 96 } 97 } 98 catch (InterruptedException e) 99 { 100 throw new LockAcquisitionFailureException("Failed to acquire permit for @Semaphored class", e); 101 } 102 } 103 } 104 | Popular Tags |