diff --git a/cache/caffeine/src/main/java/io/quarkus/ts/cache/caffeine/ReactiveWithCacheResource.java b/cache/caffeine/src/main/java/io/quarkus/ts/cache/caffeine/ReactiveWithCacheResource.java index 76bb2c9094..0ef8adb0b1 100644 --- a/cache/caffeine/src/main/java/io/quarkus/ts/cache/caffeine/ReactiveWithCacheResource.java +++ b/cache/caffeine/src/main/java/io/quarkus/ts/cache/caffeine/ReactiveWithCacheResource.java @@ -4,6 +4,7 @@ import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.core.Response; import io.quarkus.cache.CacheInvalidate; import io.quarkus.cache.CacheInvalidateAll; @@ -53,4 +54,23 @@ public Uni invalidateWithPrefix(@PathParam("prefix") @CacheKey String pref public Uni invalidateAll() { return Uni.createFrom().nullItem(); } + + @GET + @Path("/failure/{key}") + @CacheResult(cacheName = CACHE_NAME) + public Uni getValueWithFailure(@PathParam("key") @CacheKey String key) { + + int currentCounter = incrementCounter(); + // Simulate a failure based on the key + if (counter == 1) { + return Uni.createFrom().failure(new RuntimeException("Simulated failure for key: " + key)); + } else { + return Uni.createFrom().item(Response.ok("Success for key: " + key).build()); + } + } + + private synchronized int incrementCounter() { + return counter++; + } + } diff --git a/cache/caffeine/src/test/java/io/quarkus/ts/cache/caffeine/cache/caffeine/CaffeineCacheIT.java b/cache/caffeine/src/test/java/io/quarkus/ts/cache/caffeine/cache/caffeine/CaffeineCacheIT.java index 33b9b368dc..04bd132196 100644 --- a/cache/caffeine/src/test/java/io/quarkus/ts/cache/caffeine/cache/caffeine/CaffeineCacheIT.java +++ b/cache/caffeine/src/test/java/io/quarkus/ts/cache/caffeine/cache/caffeine/CaffeineCacheIT.java @@ -7,10 +7,13 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals; import org.apache.http.HttpStatus; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import io.quarkus.test.scenarios.QuarkusScenario; +import io.restassured.response.Response; @QuarkusScenario public class CaffeineCacheIT { @@ -72,6 +75,32 @@ public void shouldGetTheSameValueForSamePrefixesWhenGettingValueFromPath(String "Value was equal which means @CacheKey didn't work"); } + /** + * Ensure that failed unis are not cached + */ + @Tag("QUARKUS-4541") + @Test + public void shouldNotCacheFailures() { + String path = RESOURCE_REACTIVE_API_PATH + "/failure/key-failure"; + + // First call to register the failure + given() + .when().get(path) + .then() + .statusCode(500); + + // second call should be success + Response response = given() + .when().get(path) + .then() + .extract() + .response(); + + assertNotEquals(500, response.statusCode(), "The failure has been cached and should not be"); + assertEquals("Success for key: key-failure", response.asString()); + + } + /** * Check whether the `@CacheInvalidate` annotation does not invalidate all the caches */