Инъекция 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();
}
}