Both the Environment and the Request are PerThread services. As I said, the services themselves are singletons / proxies. It doesn't matter how you pass around the services, they won't work on a non-request thread. The AlertManager points to the ApplicationStateManager which manages the session. This is also a PerThread service (and won't be able to access the session on a non-request thread).
If you want to get a handle on the 'real' request you can @Inject RequestGlobals and call getRequest().