From e2c9b9703a8896effc4c839e6dd25d3555ae604a Mon Sep 17 00:00:00 2001 From: Clement Escoffier Date: Tue, 23 Aug 2022 17:22:07 +0200 Subject: [PATCH] Demo / Reproducer of the context issues with the new CDI scoped stored on the duplicated context instead of thread local --- .../main/java/org/acme/hibernate/MyBean.java | 20 +++++++++++++ .../reactive/FruitMutinyResource.java | 6 ++++ .../acme/rest/client/ExtensionsResource.java | 15 ++++++++-- .../java/org/acme/rest/client/MyBean.java | 25 ++++++++++++++++ .../org/acme/rest/client/MyRequestFilter.java | 29 +++++++++++++++++++ .../acme/rest/client/MyResponseFilter.java | 27 +++++++++++++++++ 6 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 hibernate-reactive-quickstart/src/main/java/org/acme/hibernate/MyBean.java create mode 100644 rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/MyBean.java create mode 100644 rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/MyRequestFilter.java create mode 100644 rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/MyResponseFilter.java diff --git a/hibernate-reactive-quickstart/src/main/java/org/acme/hibernate/MyBean.java b/hibernate-reactive-quickstart/src/main/java/org/acme/hibernate/MyBean.java new file mode 100644 index 0000000000..bcffec723d --- /dev/null +++ b/hibernate-reactive-quickstart/src/main/java/org/acme/hibernate/MyBean.java @@ -0,0 +1,20 @@ +package org.acme.hibernate; + +import javax.annotation.PreDestroy; +import javax.enterprise.context.RequestScoped; + +@RequestScoped +public class MyBean { + + int count = 0; + + public int incrAndGet() { + return count++; + } + + @PreDestroy + public void destroy() { + System.out.println("Oh no! I'm going to be destroyed"); + } + +} diff --git a/hibernate-reactive-quickstart/src/main/java/org/acme/hibernate/reactive/FruitMutinyResource.java b/hibernate-reactive-quickstart/src/main/java/org/acme/hibernate/reactive/FruitMutinyResource.java index 4a35f40b62..628ed3ff42 100644 --- a/hibernate-reactive-quickstart/src/main/java/org/acme/hibernate/reactive/FruitMutinyResource.java +++ b/hibernate-reactive-quickstart/src/main/java/org/acme/hibernate/reactive/FruitMutinyResource.java @@ -19,6 +19,8 @@ import javax.ws.rs.core.Response; import io.smallrye.mutiny.Uni; + +import org.acme.hibernate.MyBean; import org.hibernate.reactive.mutiny.Mutiny.SessionFactory; @Path("fruits") @@ -30,11 +32,15 @@ public class FruitMutinyResource { @Inject SessionFactory sf; + @Inject MyBean bean; + @GET public Uni> get() { + System.out.println(">> " + bean.incrAndGet()); return sf.withTransaction((s,t) -> s .createNamedQuery("Fruits.findAll", Fruit.class) .getResultList() + .invoke(() -> System.out.println(">> " + bean.incrAndGet())) ); } diff --git a/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/ExtensionsResource.java b/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/ExtensionsResource.java index 3e6f17fa57..2bb790fd3f 100644 --- a/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/ExtensionsResource.java +++ b/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/ExtensionsResource.java @@ -2,8 +2,11 @@ import io.smallrye.common.annotation.Blocking; import io.smallrye.mutiny.Uni; +import io.vertx.mutiny.core.Vertx; + import org.eclipse.microprofile.rest.client.inject.RestClient; +import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import java.util.Set; @@ -15,23 +18,31 @@ public class ExtensionsResource { @RestClient ExtensionsService extensionsService; + @Inject MyBean bean; @GET @Path("/id/{id}") @Blocking public Set id(String id) { + bean.log(); return extensionsService.getById(id); } @GET @Path("/id-async/{id}") public CompletionStage> idAsync(String id) { - return extensionsService.getByIdAsync(id); + bean.log(); + return extensionsService.getByIdAsync(id) + .whenComplete((r, f) -> bean.log()); } @GET @Path("/id-uni/{id}") public Uni> idUni(String id) { - return extensionsService.getByIdAsUni(id); + bean.log(); + System.out.println("DC is " + Vertx.currentContext()); + return extensionsService.getByIdAsUni(id) + .invoke(() -> bean.log()); // PB HERE - request scope suspended and not resumed, so no access. + } } diff --git a/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/MyBean.java b/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/MyBean.java new file mode 100644 index 0000000000..4e6eef311a --- /dev/null +++ b/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/MyBean.java @@ -0,0 +1,25 @@ +package org.acme.rest.client; + +import javax.annotation.PreDestroy; +import javax.enterprise.context.RequestScoped; + +@RequestScoped +public class MyBean { + + int count = 0; + + public int incrAndGet() { + return count++; + } + + @PreDestroy + public void destroy() { + System.out.println(this + " - Oh no! I'm going to be destroyed"); + } + + public void log() { + System.out.println(this + " >> " + incrAndGet()); + } + +} + diff --git a/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/MyRequestFilter.java b/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/MyRequestFilter.java new file mode 100644 index 0000000000..9030a2f4a6 --- /dev/null +++ b/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/MyRequestFilter.java @@ -0,0 +1,29 @@ +package org.acme.rest.client; + +import org.jboss.resteasy.reactive.client.spi.ResteasyReactiveClientRequestContext; +import org.jboss.resteasy.reactive.client.spi.ResteasyReactiveClientRequestFilter; + +import io.quarkus.arc.Arc; +import io.vertx.core.Vertx; + +import javax.annotation.Priority; +import javax.enterprise.context.control.ActivateRequestContext; +import javax.inject.Inject; +import javax.ws.rs.ext.Provider; + +@Provider +@Priority(1) +public class MyRequestFilter implements ResteasyReactiveClientRequestFilter { + + @Inject + MyBean myRequestScopedBean; + + @Override + @ActivateRequestContext + public void filter(ResteasyReactiveClientRequestContext requestContext) { + System.out.println("MyRequestFilter " + Arc.container().requestContext()); + System.out.println("Is active? " + Arc.container().requestContext().isActive()); + System.out.println("in req filter DC is " + Vertx.currentContext()); + myRequestScopedBean.log(); + } +} diff --git a/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/MyResponseFilter.java b/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/MyResponseFilter.java new file mode 100644 index 0000000000..75e3c0de75 --- /dev/null +++ b/rest-client-reactive-quickstart/src/main/java/org/acme/rest/client/MyResponseFilter.java @@ -0,0 +1,27 @@ +package org.acme.rest.client; + +import org.jboss.resteasy.reactive.client.spi.ResteasyReactiveClientRequestContext; +import org.jboss.resteasy.reactive.client.spi.ResteasyReactiveClientResponseFilter; + +import io.quarkus.arc.Arc; +import io.vertx.core.Vertx; + +import javax.enterprise.context.control.ActivateRequestContext; +import javax.inject.Inject; +import javax.ws.rs.client.ClientResponseContext; +import javax.ws.rs.ext.Provider; + +@Provider +public class MyResponseFilter implements ResteasyReactiveClientResponseFilter{ + @Inject + MyBean myRequestScopedBean; + + @Override + @ActivateRequestContext + public void filter(ResteasyReactiveClientRequestContext requestContext, ClientResponseContext responseContext) { + System.out.println("Response filter called on " + Thread.currentThread().getName()); + System.out.println("MyResponseFilter " + Arc.container().requestContext() + " / " + Arc.container().requestContext().isActive()); + System.out.println("in resp filter DC is " + Vertx.currentContext()); + myRequestScopedBean.log(); + } +}