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.redisson.api.RSemaphore;
24
25 import javax.inject.Named;
26 import javax.inject.Singleton;
27 import java.util.concurrent.ConcurrentHashMap;
28 import java.util.concurrent.ConcurrentMap;
29 import java.util.concurrent.TimeUnit;
30
31
32
33
34 @Singleton
35 @Named( RedissonSemaphoreNamedLockFactory.NAME )
36 public class RedissonSemaphoreNamedLockFactory
37 extends RedissonNamedLockFactorySupport
38 {
39 public static final String NAME = "semaphore-redisson";
40
41 private final ConcurrentMap<String, RSemaphore> semaphores;
42
43 public RedissonSemaphoreNamedLockFactory()
44 {
45 this.semaphores = new ConcurrentHashMap<>();
46 }
47
48 @Override
49 protected AdaptedSemaphoreNamedLock createLock( final String name )
50 {
51 RSemaphore semaphore = semaphores.computeIfAbsent( name, k ->
52 {
53 RSemaphore result = redissonClient.getSemaphore( NAME_PREFIX + k );
54 result.trySetPermits( Integer.MAX_VALUE );
55 return result;
56 } );
57 return new AdaptedSemaphoreNamedLock( name, this, new RedissonSemaphore( semaphore ) );
58 }
59
60 @Override
61 protected void destroyLock( final String name )
62 {
63 RSemaphore semaphore = semaphores.remove( name );
64 if ( semaphore == null )
65 {
66 throw new IllegalStateException( "Semaphore expected but does not exist: " + name );
67 }
68 semaphore.delete();
69 }
70
71 private static final class RedissonSemaphore implements AdaptedSemaphoreNamedLock.AdaptedSemaphore
72 {
73 private final RSemaphore semaphore;
74
75 private RedissonSemaphore( final RSemaphore semaphore )
76 {
77 this.semaphore = semaphore;
78 }
79
80 @Override
81 public boolean tryAcquire( final int perms, final long time, final TimeUnit unit ) throws InterruptedException
82 {
83 return semaphore.tryAcquire( perms, time, unit );
84 }
85
86 @Override
87 public void release( final int perms )
88 {
89 semaphore.release( perms );
90 }
91 }
92 }