Hi.

Yes, the custom scope example on the page do not solve the problem. To be
more explicit on my proposition, the enterRequest method on a different
scope may look like this:
class CustumMultiRequestPerThreadScope extends Scope {

private volatile ThreadLocal<Map<Key<?>, Object>>
currentRequestInjectionResults = null;

public void enterRequest(CustomFrameworkRequestInfo requestData) {
  currentRequestInjectionResults = requestData.getInjectionResults();
}

}

Here currentRequestInjectionResults is ThreadLocal only to allow a single
instance of the scope implementation, but in each thread You need to enter
and exit the request data "During the time that the thread calculations are
working on a specific request" - this is the key.

On Tue, Dec 20, 2016 at 10:52 AM, Stephan Classen <st.clas...@gmx.ch> wrote:

> This does not solve the problem. The custom scope example uses a
> ThreadLocal<Map<Key<?>, Object>> to store the scoped values. I am currently
> also looking for a "RequestScope" in an environment where a request may be
> handled by more than one thread.
>
> On 20.12.2016 08:57, Paweł Cesar Sanjuan Szklarz wrote:
>
> Hi.
>
> If the request dependencies are created in a specific moment on time in a
> single thread, then You can make a custom scope to setup the correct
> request context.
>
> The basic scope idea is that You create a specialized provider from a more
> general one:
> https://github.com/google/guice/blob/36542433938113806c8d1e3e4b41c6
> 4d9b8a0dca/core/src/com/google/inject/Scope.java#L44
>
> Just like on the example of custom scope:
> https://github.com/google/guice/wiki/CustomScopes#triggering-the-scope
>
> You can trigger/setup the scope implementation to provide the correct
> provider.
>
> A example of scope use in a single thread for multiple request may be:
> for (int i = 0; i < workAndData.length; i++) {
> workAndData = workAndData[i];
> scope.enterRequest(workAndData.getRequest());
> workAndData.runJob();
> scope.exitRequest();
> }
>
> Of course You need to setup the scope in every thread where the request
> scope will be used.
>
> Pawel.
>
> On Tue, Dec 20, 2016 at 8:36 AM, Greg Methvin <greg.meth...@gmail.com>
> wrote:
>
>> Hi everyone,
>>
>> I currently one of the maintainers of Play Framework, a Java/Scala web
>> framework that integrates with Guice. Play uses non-blocking I/O, and since
>> one thread may handle multiple requests at once, we can't use thread locals
>> to scope dependencies.
>>
>> So I'm wondering if there is a recommended way to bind instances only in
>> the context of a particular object (like a request) without using any
>> global or thread-local state.
>>
>> I can basically do what I want by creating a child injector for each
>> request. The child injector also binds the request and a module with
>> request-scoped dependencies. It then uses that injector to obtain an
>> instance of the relevant controller to handle the request, which may have
>> dependencies bound that use the request instance. Of course that means you
>> need to create a new child injector per request, which doesn't seem like a
>> good idea.
>>
>> Does it make sense to use Guice to solve this problem? Is there a better
>> way to do it than what I've tried?
>>
>> Thanks,
>> Greg
>> --
>> You received this message because you are subscribed to the Google Groups
>> "google-guice" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to google-guice+unsubscr...@googlegroups.com.
>> To post to this group, send email to <google-guice@googlegroups.com>
>> google-guice@googlegroups.com.
>> Visit this group at https://groups.google.com/group/google-guice.
>> To view this discussion on the web visit
>> <https://groups.google.com/d/msgid/google-guice/7494eddd-a7ea-4351-965a-2b3d96c8f14f%40googlegroups.com?utm_medium=email&utm_source=footer>
>> https://groups.google.com/d/msgid/google-guice/7494eddd-a7ea
>> -4351-965a-2b3d96c8f14f%40googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
> --
> You received this message because you are subscribed to the Google Groups
> "google-guice" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to google-guice+unsubscr...@googlegroups.com.
> To post to this group, send email to google-guice@googlegroups.com.
> Visit this group at https://groups.google.com/group/google-guice.
> To view this discussion on the web visit
> <https://groups.google.com/d/msgid/google-guice/CAGReoCQhkV-FrJoo-K%3DkXvmC-2WSBcPVg8Ogyt6dtPoj-b6P%3DA%40mail.gmail.com?utm_medium=email&utm_source=footer>
> https://groups.google.com/d/msgid/google-guice/
> CAGReoCQhkV-FrJoo-K%3DkXvmC-2WSBcPVg8Ogyt6dtPoj-b6P%3DA%40mail.gmail.com.
> For more options, visit https://groups.google.com/d/optout.
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "google-guice" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to google-guice+unsubscr...@googlegroups.com.
> To post to this group, send email to google-guice@googlegroups.com.
> Visit this group at https://groups.google.com/group/google-guice.
> To view this discussion on the web visit https://groups.google.com/d/
> msgid/google-guice/b5e469fd-1789-110d-f589-30e6a0bcb5c5%40gmx.ch
> <https://groups.google.com/d/msgid/google-guice/b5e469fd-1789-110d-f589-30e6a0bcb5c5%40gmx.ch?utm_medium=email&utm_source=footer>
> .
>
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
Visit this group at https://groups.google.com/group/google-guice.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-guice/CAGReoCQ%2Bzt%3DH65mtJjQO3cbczDY6kturWhJ4bNbaJXxQBiWqVQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to