Инъекция Guice Request-scoped без сервлета (в RPC-сервере)

Для справки, я обрабатываю RPC-запросы в сервисе Thrift (хотя мой вопрос не относится к Thrift). То, что я хочу, похоже, должно быть простым, но я не могу найти примеров: как я могу повторно использовать привязки com.google.inject.servlet.RequestScoped, не начиная с нуля?

Ясно, что я мог следовать инструкциям по созданию пользовательского Scope. Но это кажется слишком сложным. Что я хочу сделать: при обработке входящего (экономичного) RPC создайте новый RequestContext для каждого входящего вызова; затем используйте стандартную инъекцию RequestScoped при обработке.

По сути, кажется, что мой код должен выглядеть (примерно) так:

void main() {
// Configure appropriate bindings, create injector
Injector injector = Guice.createInjector(new ServerHandlerModule()); 

ThriftServer server = new ThriftServer.ThriftServerBuilder("MyService", port).withThreadCount(threads).build();`  
server.start(new MyService.Processor(new MyHandler()));

// For each incoming request, Thrift will call the appropriate method on the (singleton) instance of MyHandler.  
// Let's say MyHandler exposes a method void ProcessInput()
}

class MyHandler {

@Override
void ProcessInput(Input myInput) {  // myInput was constructed by Thrift
  // I want the following instance of RequestContext to be injected
  // (provided by Guice) as (say) a constructor arg to any constructor 
  // needing one when that construction happens in this thread.
  RequestContext rc = new RequestContext(myInput); 
  doWork();
  }

1 ответ

Guice предоставляет служебный класс для этого: ServletScopes.

Если вы используете Java 7+:

void ProcessInput(Input myInput) {
    RequestScoper scope = ServletScopes.scopeRequest(Collections.emptyMap());
    try ( RequestScoper.CloseableScope ignored = scope.open() ) {
        doWork();
    }
}
Другие вопросы по тегам