This makes sense, you're keeping the state that the async part needs. I was
going to suggest something similar. I'll check this against the specs and
make sure we don't have a bug here.

Jon

On Wed, Oct 9, 2019 at 12:00 AM Paul Carter-Brown
<paul.carter-br...@jini.guru> wrote:

> Hi Jon,
>
> I've attached a new version with an implementation that works along with
> the one that fails.
>
> I got it to work by getting the injected class to implement a method as
> follows:
>
> public SomeContext getForAsync() {
>         return this;
> }
>
> That in combination with eagerly loading the required data from context
> injected variables at @PostConstruct means that so long as the instance
> obtained from getForAsync() is used, then when subsequent threads invoke
> the object, there is no proxy in the way and no need to access other
> injected classes that would complain about the different thread being used.
>
> Works for my use case.
>
> 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: p...@jini.guru
>
> 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 Tue, Oct 8, 2019 at 12:42 AM Jonathan Gallimore <
> jonathan.gallim...@gmail.com> wrote:
>
>> 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
>> <paul.carter-br...@jini.guru> 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: p...@jini.guru
>> >
>> > 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
>> > <paul.carter-br...@jini.guru> 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: p...@jini.guru
>> >>
>> >> 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 <
>> >> jonathan.gallim...@gmail.com> 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
>> >>> <paul.carter-br...@jini.guru> 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: p...@jini.guru
>> >>> >
>> >>> > 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.
>> >>> >
>> >>>
>> >>
>>
>

Reply via email to