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 SemaphoreAspect 34 { 35 protected SemaphoreLocked props; 36 37 public SemaphoreAspect(SemaphoreLocked locked) 38 { 39 this.props = locked; 40 } 41 42 public Object acquire(Invocation invocation) throws Throwable 43 { 44 SemaphoredObject obj = (SemaphoredObject)invocation.getTargetObject(); 45 46 if (props.timeout() == -1) 47 { 48 blockIndefinately(obj.getSemaphore()); 49 } 50 else if (props.timeout() == 0) 51 { 52 tryLock(obj.getSemaphore()); 53 } 54 else 55 { 56 tryLockWithTimeout(obj.getSemaphore()); 57 } 58 59 try 60 { 61 return invocation.invokeNext(); 62 } 63 finally 64 { 65 obj.getSemaphore().release(props.permits()); 66 } 67 } 68 69 protected void blockIndefinately(Semaphore semaphore) 70 { 71 try 72 { 73 semaphore.acquire(props.permits()); 74 } 75 catch (InterruptedException e) 76 { 77 throw new LockAcquisitionFailureException("Failed to acquire permit for @Semaphored class", e); 78 } 79 } 80 81 protected void tryLock(Semaphore semaphore) 82 { 83 if (!semaphore.tryAcquire(props.permits())) 84 { 85 throw new LockAcquisitionFailureException("Failed to acquire permit for @Semaphored class"); 86 } 87 } 88 89 protected void tryLockWithTimeout(Semaphore semaphore) 90 { 91 try 92 { 93 if (!semaphore.tryAcquire(props.timeout(), props.unit())) 94 { 95 throw new LockAcquisitionFailureException("Failed to acquire permit for @Semaphored class. 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 |