1 package org.eclipse.aether.named.redisson;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.eclipse.aether.named.support.AdaptedSemaphoreNamedLock;
23 import org.eclipse.aether.named.support.NamedLockSupport;
24 import org.redisson.api.RSemaphore;
25
26 import javax.inject.Named;
27 import javax.inject.Singleton;
28 import java.util.concurrent.TimeUnit;
29
30
31
32
33 @Singleton
34 @Named( RedissonSemaphoreNamedLockFactory.NAME )
35 public class RedissonSemaphoreNamedLockFactory
36 extends RedissonNamedLockFactorySupport
37 {
38 public static final String NAME = "semaphore-redisson";
39
40 @Override
41 protected NamedLockSupport createLock( final String name )
42 {
43 return new AdaptedSemaphoreNamedLock(
44 name, this, new RedissonSemaphore( redissonClient.getSemaphore( NAME_PREFIX + name ) )
45 );
46 }
47
48 private static final class RedissonSemaphore implements AdaptedSemaphoreNamedLock.AdaptedSemaphore
49 {
50 private final RSemaphore semaphore;
51
52 private RedissonSemaphore( final RSemaphore semaphore )
53 {
54 semaphore.trySetPermits( Integer.MAX_VALUE );
55 this.semaphore = semaphore;
56 }
57
58 @Override
59 public boolean tryAcquire( final int perms, final long time, final TimeUnit unit )
60 throws InterruptedException
61 {
62 return semaphore.tryAcquire( perms, time, unit );
63 }
64
65 @Override
66 public void release( final int perms )
67 {
68 semaphore.release( perms );
69 }
70 }
71 }