From 6fdbd58afdc98388e6bed12225afbbc41a906402 Mon Sep 17 00:00:00 2001 From: seakider Date: Tue, 25 Feb 2025 19:04:11 +0800 Subject: [PATCH] Fixed - Issue with asynchronous @Cacheable methods Signed-off-by: seakider --- .../micronaut/cache/RedissonAsyncCache.java | 2 +- .../redisson/micronaut/RedissonCacheTest.java | 29 +++++++++++++++++++ .../micronaut/cache/RedissonAsyncCache.java | 2 +- .../redisson/micronaut/RedissonCacheTest.java | 29 +++++++++++++++++++ .../micronaut/cache/RedissonAsyncCache.java | 2 +- .../redisson/micronaut/RedissonCacheTest.java | 28 ++++++++++++++++++ 6 files changed, 89 insertions(+), 3 deletions(-) diff --git a/redisson-micronaut/redisson-micronaut-20/src/main/java/org/redisson/micronaut/cache/RedissonAsyncCache.java b/redisson-micronaut/redisson-micronaut-20/src/main/java/org/redisson/micronaut/cache/RedissonAsyncCache.java index 2c80bbe6c..8977808e9 100644 --- a/redisson-micronaut/redisson-micronaut-20/src/main/java/org/redisson/micronaut/cache/RedissonAsyncCache.java +++ b/redisson-micronaut/redisson-micronaut-20/src/main/java/org/redisson/micronaut/cache/RedissonAsyncCache.java @@ -56,7 +56,7 @@ public class RedissonAsyncCache implements AsyncCache> { return map.getAsync(key) .thenApply(v -> { if (v != null) { - return Optional.of((T)conversionService.convert(v, ConversionContext.of(requiredType))); + return conversionService.convert(v, ConversionContext.of(requiredType)); } return Optional.empty(); }) diff --git a/redisson-micronaut/redisson-micronaut-20/src/test/java/org/redisson/micronaut/RedissonCacheTest.java b/redisson-micronaut/redisson-micronaut-20/src/test/java/org/redisson/micronaut/RedissonCacheTest.java index 57a0bcc25..d30dfac35 100644 --- a/redisson-micronaut/redisson-micronaut-20/src/test/java/org/redisson/micronaut/RedissonCacheTest.java +++ b/redisson-micronaut/redisson-micronaut-20/src/test/java/org/redisson/micronaut/RedissonCacheTest.java @@ -1,5 +1,6 @@ package org.redisson.micronaut; +import io.micronaut.cache.AsyncCache; import io.micronaut.context.ApplicationContext; import io.micronaut.inject.qualifiers.Qualifiers; import org.junit.jupiter.api.Test; @@ -8,6 +9,9 @@ import org.redisson.micronaut.cache.RedissonSyncCache; import java.util.HashMap; import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import static org.assertj.core.api.Assertions.assertThat; @@ -42,4 +46,29 @@ public class RedissonCacheTest { assertThat(cache.get(3, Integer.class).isPresent()).isTrue(); } + @Test + public void testAsyncCache() throws ExecutionException, InterruptedException { + Map map = new HashMap<>(); + map.put("redisson.threads", "10"); + map.put("redisson.single-server-config.address", "redis://127.0.0.1:6379"); + map.put("redisson.caches.test.expire-after-write", "3s"); + map.put("redisson.caches.test.expire-after-access", "3s"); + ApplicationContext ac = ApplicationContext.run(map); + + RedissonClient client = ac.getBean(RedissonClient.class); + assertThat(client).isNotNull(); + + client.getKeys().flushall(); + + RedissonSyncCache cache = ac.getBean(RedissonSyncCache.class, Qualifiers.byName("test")); + AsyncCache asyncCache = cache.async(); + assertThat(asyncCache.get(3, Integer.class).get()).isEqualTo(Optional.empty()); + + CompletableFuture f = asyncCache.put(3, 4).toCompletableFuture(); + f.join(); + + assertThat(asyncCache.get(3, Integer.class).get()).isEqualTo(Optional.of(4)); + + } + } diff --git a/redisson-micronaut/redisson-micronaut-30/src/main/java/org/redisson/micronaut/cache/RedissonAsyncCache.java b/redisson-micronaut/redisson-micronaut-30/src/main/java/org/redisson/micronaut/cache/RedissonAsyncCache.java index 2c80bbe6c..8977808e9 100644 --- a/redisson-micronaut/redisson-micronaut-30/src/main/java/org/redisson/micronaut/cache/RedissonAsyncCache.java +++ b/redisson-micronaut/redisson-micronaut-30/src/main/java/org/redisson/micronaut/cache/RedissonAsyncCache.java @@ -56,7 +56,7 @@ public class RedissonAsyncCache implements AsyncCache> { return map.getAsync(key) .thenApply(v -> { if (v != null) { - return Optional.of((T)conversionService.convert(v, ConversionContext.of(requiredType))); + return conversionService.convert(v, ConversionContext.of(requiredType)); } return Optional.empty(); }) diff --git a/redisson-micronaut/redisson-micronaut-30/src/test/java/org/redisson/micronaut/RedissonCacheTest.java b/redisson-micronaut/redisson-micronaut-30/src/test/java/org/redisson/micronaut/RedissonCacheTest.java index 57a0bcc25..d30dfac35 100644 --- a/redisson-micronaut/redisson-micronaut-30/src/test/java/org/redisson/micronaut/RedissonCacheTest.java +++ b/redisson-micronaut/redisson-micronaut-30/src/test/java/org/redisson/micronaut/RedissonCacheTest.java @@ -1,5 +1,6 @@ package org.redisson.micronaut; +import io.micronaut.cache.AsyncCache; import io.micronaut.context.ApplicationContext; import io.micronaut.inject.qualifiers.Qualifiers; import org.junit.jupiter.api.Test; @@ -8,6 +9,9 @@ import org.redisson.micronaut.cache.RedissonSyncCache; import java.util.HashMap; import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import static org.assertj.core.api.Assertions.assertThat; @@ -42,4 +46,29 @@ public class RedissonCacheTest { assertThat(cache.get(3, Integer.class).isPresent()).isTrue(); } + @Test + public void testAsyncCache() throws ExecutionException, InterruptedException { + Map map = new HashMap<>(); + map.put("redisson.threads", "10"); + map.put("redisson.single-server-config.address", "redis://127.0.0.1:6379"); + map.put("redisson.caches.test.expire-after-write", "3s"); + map.put("redisson.caches.test.expire-after-access", "3s"); + ApplicationContext ac = ApplicationContext.run(map); + + RedissonClient client = ac.getBean(RedissonClient.class); + assertThat(client).isNotNull(); + + client.getKeys().flushall(); + + RedissonSyncCache cache = ac.getBean(RedissonSyncCache.class, Qualifiers.byName("test")); + AsyncCache asyncCache = cache.async(); + assertThat(asyncCache.get(3, Integer.class).get()).isEqualTo(Optional.empty()); + + CompletableFuture f = asyncCache.put(3, 4).toCompletableFuture(); + f.join(); + + assertThat(asyncCache.get(3, Integer.class).get()).isEqualTo(Optional.of(4)); + + } + } diff --git a/redisson-micronaut/redisson-micronaut-40/src/main/java/org/redisson/micronaut/cache/RedissonAsyncCache.java b/redisson-micronaut/redisson-micronaut-40/src/main/java/org/redisson/micronaut/cache/RedissonAsyncCache.java index 728efe8be..b5be0cbc1 100644 --- a/redisson-micronaut/redisson-micronaut-40/src/main/java/org/redisson/micronaut/cache/RedissonAsyncCache.java +++ b/redisson-micronaut/redisson-micronaut-40/src/main/java/org/redisson/micronaut/cache/RedissonAsyncCache.java @@ -56,7 +56,7 @@ public class RedissonAsyncCache implements AsyncCache> { return map.getAsync(key) .thenApply(v -> { if (v != null) { - return Optional.of((T)conversionService.convert(v, ConversionContext.of(requiredType))); + return conversionService.convert(v, ConversionContext.of(requiredType)); } return Optional.empty(); }) diff --git a/redisson-micronaut/redisson-micronaut-40/src/test/java/org/redisson/micronaut/RedissonCacheTest.java b/redisson-micronaut/redisson-micronaut-40/src/test/java/org/redisson/micronaut/RedissonCacheTest.java index c2b1cf579..fa73230f2 100644 --- a/redisson-micronaut/redisson-micronaut-40/src/test/java/org/redisson/micronaut/RedissonCacheTest.java +++ b/redisson-micronaut/redisson-micronaut-40/src/test/java/org/redisson/micronaut/RedissonCacheTest.java @@ -1,5 +1,6 @@ package org.redisson.micronaut; +import io.micronaut.cache.AsyncCache; import io.micronaut.context.ApplicationContext; import io.micronaut.inject.qualifiers.Qualifiers; import org.junit.jupiter.api.Test; @@ -12,6 +13,9 @@ import org.testcontainers.junit.jupiter.Testcontainers; import java.util.HashMap; import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import static org.assertj.core.api.Assertions.assertThat; @@ -49,6 +53,30 @@ public class RedissonCacheTest { cache.get(3, Integer.class); Thread.sleep(2000); assertThat(cache.get(3, Integer.class).isPresent()).isTrue(); + + } + + @Test + public void testAsyncCache() throws ExecutionException, InterruptedException { + Map map = new HashMap<>(); + map.put("redisson.threads", "10"); + map.put("redisson.single-server-config.address", "redis://127.0.0.1:" + REDIS.getFirstMappedPort()); + map.put("redisson.caches.test.expire-after-write", "10s"); + map.put("redisson.caches.test.expire-after-access", "10s"); + ApplicationContext ac = ApplicationContext.run(map); + + RedissonClient client = ac.getBean(RedissonClient.class); + assertThat(client).isNotNull(); + + RedissonSyncCache cache = ac.getBean(RedissonSyncCache.class, Qualifiers.byName("test")); + AsyncCache asyncCache = cache.async(); + assertThat(asyncCache.get(3, Integer.class).get()).isEqualTo(Optional.empty()); + + CompletableFuture f = asyncCache.put(3, 4).toCompletableFuture(); + f.join(); + + assertThat(asyncCache.get(3, Integer.class).get()).isEqualTo(Optional.of(4)); + } @Test