Awesome, thanks for this. Haven't had a chance to look at this yet, but I'll have a go with it tomorrow.
Jon On Mon, Oct 7, 2019 at 9:07 PM Paul Carter-Brown <[email protected]> wrote: > Hi Jon, > > I've created a basic example of the issue as attached. > > mvn install -Prun > > then: > > curl "http://localhost:8000/basic-service/basic/async?echo=111" > > Paul Carter-Brown > Director > Jini Guru > m: +27 (0) 83 442 7179 <+27834427179> > a: 1st Floor, Golf House, Design Quarter, Cnr. William Nicol and Leslie > Johannesburg, South Africa > w: jini.guru e: [email protected] > > Disclaimer: This message and/or attachment(s) may contain > privileged, confidential and/or personal information. If you are not the > intended recipient you may not disclose or distribute any of > the information contained within this message. In such case you must > destroy this message and inform the sender of the error. Jini Guru may not > accept liability for any errors, omissions, information and viruses > contained in the transmission of this message. Any opinions, conclusions > and other information contained within this message not related to Jini > Guru official business is deemed to be that of the individual only and is > not endorsed by Jini Guru. > > > > On Mon, Oct 7, 2019 at 3:02 PM Paul Carter-Brown > <[email protected]> wrote: > >> Hi Jon, >> >> Not easy to create a working example but hopefully this will help explain: >> >> @Stateless >> public class myEJb() { >> @Inject >> private UserContext userContext; >> >> // Gets called from a JAX-RS context >> public void go(AsyncResponse asyncResponse) { >> CompletionStage<Foo> cs1 = userContext.doSomething(); >> cs1.thenAccept((Foo foo) -> { >> ... this is now on a different thread to the previous threads >> >> CompletionStage<Bar> cs2 = userContext.doSomethingElse(foo) >> ... this gets IllegalStateException >> cs2.thenAccept((Bar bar) -> { >> asyncResponse.resume(bar); >> }); >> }); >> } >> } >> >> @RequestScoped >> public class UserContext { >> >> @Context >> private HttpServletRequest httpRequest; >> >> private Object someVal; >> >> public CompletionStage<Foo> doSomething() { >> ... >> ... >> Use httpRequest ... all OK >> someVal = httpRequest.getAttribute("someVal"); >> ... >> } >> >> public CompletionStage<Bar> doSomethingElse(Foo foo) { >> ... >> ... >> if (someVal == null) { >> // will go in here as someVal is null >> someVal = httpRequest.getAttribute("someVal"); ... >> java.lang.IllegalStateException: No CXF message usable for JAX-RS @Context >> injections in that thread so can't use interface >> javax.servlet.http.HttpServletRequest >> } >> ... >> } >> } >> >> Paul Carter-Brown >> Director >> Jini Guru >> m: +27 (0) 83 442 7179 <+27834427179> >> a: 1st Floor, Golf House, Design Quarter, Cnr. William Nicol and Leslie >> Johannesburg, South Africa >> w: jini.guru e: [email protected] >> >> Disclaimer: This message and/or attachment(s) may contain >> privileged, confidential and/or personal information. If you are not the >> intended recipient you may not disclose or distribute any of >> the information contained within this message. In such case you must >> destroy this message and inform the sender of the error. Jini Guru may not >> accept liability for any errors, omissions, information and viruses >> contained in the transmission of this message. Any opinions, conclusions >> and other information contained within this message not related to Jini >> Guru official business is deemed to be that of the individual only and is >> not endorsed by Jini Guru. >> >> >> >> On Mon, Oct 7, 2019 at 2:29 PM Jonathan Gallimore < >> [email protected]> wrote: >> >>> Hi Paul >>> >>> You able to create an as small as possible sample, maybe based on >>> https://github.com/apache/tomee/tree/master/examples/async-servlet? I'm >>> struggling a little to picture the code in my head. It sounds likely >>> related to the two different threads. I'm sure we can at least help >>> figure >>> out a workaround. >>> >>> Jon >>> >>> On Mon, Oct 7, 2019 at 1:01 PM Paul Carter-Brown >>> <[email protected]> wrote: >>> >>> > Hi, >>> > >>> > I have a scenario as follows: >>> > >>> > 1) JAX-RS request comes into TomEE 8.0.0 and hits a stateless EJB of >>> mine >>> > 2) The EJB has an object called UserContext injected which is >>> > @RequestScoped >>> > 3) userContext in turn injects HttpServletRequest with @Context >>> > 4) I use userContext fine. All is good and it can access the >>> > HttpServletRequest >>> > 5) My EJB does a rest call to another system. This rest call uses >>> asynhttp >>> > with reactive programming and returns a CompletionStage. >>> > 6) my EJB code does a .thenAccept on the completionstage and in this >>> code >>> > we try and use the injected UserContext. Here we get an error when >>> > UserCOntext tries to use HttpServletRequest. >>> > >>> > java.lang.IllegalStateException: No CXF message usable for JAX-RS >>> > @Context injections in that thread so can't use interface >>> > javax.servlet.http.HttpServletRequest >>> > >>> > >>> > I believe this is due to the completionstage being executed on a >>> different >>> > thread. E.g.. steps 1-5 use TomEE-Exec-1 while step 6 uses >>> async-http-3-3. >>> > >>> > To resolve this I got UserContext to eagerly load the data it needs >>> > from HttpServletRequest >>> > in step 3 so that at step 6 no calls to HttpServletRequest are needed. >>> It >>> > seems though that the userContext is proxied by webbeans and I get a >>> > different instance on the different thread and this new instance has >>> none >>> > of my eagerly loaded data in it. >>> > >>> > Does anyone know how to resolve this issue. Basically I want to >>> somehow get >>> > step 6 to use the exact instance of UserContext as step 2 even though >>> they >>> > are on different threads. >>> > >>> > Paul Carter-Brown >>> > Director >>> > Jini Guru >>> > m: +27 (0) 83 442 7179 <+27834427179> >>> > a: 1st Floor, Golf House, Design Quarter, Cnr. William Nicol and Leslie >>> > Johannesburg, South Africa >>> > w: jini.guru e: [email protected] >>> > >>> > Disclaimer: This message and/or attachment(s) may contain >>> > privileged, confidential and/or personal information. If you are not >>> the >>> > intended recipient you may not disclose or distribute any of >>> > the information contained within this message. In such case you must >>> > destroy this message and inform the sender of the error. Jini Guru may >>> not >>> > accept liability for any errors, omissions, information and viruses >>> > contained in the transmission of this message. Any opinions, >>> conclusions >>> > and other information contained within this message not related to Jini >>> > Guru official business is deemed to be that of the individual only and >>> is >>> > not endorsed by Jini Guru. >>> > >>> >>
