No he probado esto todavía, pero creo que esto funcionará. Para cada encargo alcance/contexto que desea en su aplicación, sólo hay que añadir que el contexto a través de una extensión cuando el contenedor se inicializa:
public void afterBeanDiscovery(@Observes AfterBeanDiscover afterBeanDiscovery, BeanManager beanManager)
{
CustomContext customContext = new CustomContext();
afterBeanDiscovery.addContext(customContext);
beanManager ...
}
Ahora, el truco es, es necesario mantener una referencia a ese contexto Entonces, cuando quieras comenzar o detenerlo, puedes. Eso sería algo así como:
@Inject
protected HttpRequestLifecycle httpRequestLifecycle;
public void doSomething()
{
startContext();
doStuff();
stopContext();
}
public void startContext()
{
httpRequestContextLifecycle.getHttpRequestContext().activate();
}
Eso debería hacerlo, no hay una gran cantidad de documentación por ahí, así que espero que esto ayude.
Cualquier persona interesada, echa un vistazo a la fuente aquí: http://github.com/walterjwhite/server.web.application
Walter
En realidad, esto me hizo muy cerca. Incluso después de iniciar el contexto al establecerlo activo, sigo recibiendo No Contexts Active para el ámbito ... –
Otra nota aquí: no puede insertar el contexto a menos que lo convierta en un singleton. Si tiene un ámbito de aplicación, no tiene garantía de que obtendrá el mismo contexto que está en el mapa de contextos. Eso significa que el contexto que activa es un contexto ficticio, no controla nada. Lo que terminé haciendo fue mantener una referencia en mis clases de administración del ciclo de vida y luego inyectar ese ciclo de vida y obtener el contexto. –
Si fuera @Singleton, ¿cómo diferenciaría varias solicitudes? ¿No deberías crear y activar el contexto en algún lugar del oyente de contexto? –