package org.enigma1510.async.springtomcat.web; import static reactor.event.selector.Selectors.$; import javax.annotation.PostConstruct; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.context.request.async.DeferredResult; import reactor.core.Environment; import reactor.core.Reactor; import reactor.core.spec.Reactors; import reactor.event.Event; import reactor.function.Consumer; @RequestMapping("/example") @Controller public class ExampleController { public Logger log = Logger.getLogger(getClass()); private Environment environment; private Reactor defaultEventLoopReactor; @PostConstruct public void init() { environment = new Environment(); defaultEventLoopReactor = Reactors.reactor().env(environment).dispatcher(Environment.EVENT_LOOP).get(); defaultEventLoopReactor.on($("request"), new Consumer<Event<RequestContext>>() { @Override public void accept(Event<RequestContext> event) { RequestContext context = event.getData(); DeferredResult<ExampleResponse> deferredResult = context.deferredResult; HttpServletResponse servletResponse = context.servletResponse; ExampleResponse exampleResponse = new ExampleResponse(); exampleResponse.setMessage( "success"); exampleResponse.setStatus( "OK"); log.info("setting response status"); servletResponse.setStatus( HttpServletResponse.SC_BAD_REQUEST); log.info("setting result."); deferredResult.setResult( exampleResponse); } }); } @RequestMapping(method = RequestMethod.GET, produces = "application/json") @ResponseBody public DeferredResult<ExampleResponse> deferredResultExample( HttpServletResponse servletResponse) { log.info("controller method invoked"); DeferredResult<ExampleResponse> deferredResult = new DeferredResult<ExampleResponse>( 2000l); RequestContext context = new RequestContext(); context.deferredResult = deferredResult; context.servletResponse = servletResponse; log.debug("controller method sending event with deferredResult"); defaultEventLoopReactor.notify("request", Event.wrap(context)); log.debug("controller method returning deferredResult"); return deferredResult; } private class RequestContext { private DeferredResult<ExampleResponse> deferredResult; private HttpServletResponse servletResponse; } }