@Override public final void onSubscribe(Subscription subscription) { this.subscription = subscription; this.emitter.onTimeout(() -> { if (logger.isTraceEnabled()) { logger.trace("Connection timeout for " + this.emitter); } terminate(); this.emitter.complete(); }); this.emitter.onError(this.emitter::completeWithError); subscription.request(1); }
logger.trace("Publisher for " + this.emitter + " completed"); this.emitter.complete();
@Override public final void onSubscribe(Subscription subscription) { this.subscription = subscription; this.emitter.onTimeout(() -> { if (logger.isTraceEnabled()) { logger.trace("Connection timeout for " + this.emitter); } terminate(); this.emitter.complete(); }); this.emitter.onError(this.emitter::completeWithError); subscription.request(1); }
logger.trace("Publisher for " + this.emitter + " completed"); this.emitter.complete();
@Test(expected = IllegalStateException.class) public void sendFailsAfterComplete() throws Exception { this.emitter.complete(); this.emitter.send("foo"); }
logger.trace("Publisher for " + this.emitter + " completed"); this.emitter.complete();
@Test public void sendDuplicateBeforeHandlerInitialized() throws Exception { this.emitter.send("foo", MediaType.TEXT_PLAIN); this.emitter.send("foo", MediaType.TEXT_PLAIN); this.emitter.complete(); verifyNoMoreInteractions(this.handler); this.emitter.initialize(this.handler); verify(this.handler, times(2)).send("foo", MediaType.TEXT_PLAIN); verify(this.handler).complete(); verifyNoMoreInteractions(this.handler); }
@Test public void sendBeforeHandlerInitialized() throws Exception { this.emitter.send("foo", MediaType.TEXT_PLAIN); this.emitter.send("bar", MediaType.TEXT_PLAIN); this.emitter.complete(); verifyNoMoreInteractions(this.handler); this.emitter.initialize(this.handler); verify(this.handler).send("foo", MediaType.TEXT_PLAIN); verify(this.handler).send("bar", MediaType.TEXT_PLAIN); verify(this.handler).complete(); verifyNoMoreInteractions(this.handler); }
@Test public void sendAfterHandlerInitialized() throws Exception { this.emitter.initialize(this.handler); verify(this.handler).onTimeout(any()); verify(this.handler).onError(any()); verify(this.handler).onCompletion(any()); verifyNoMoreInteractions(this.handler); this.emitter.send("foo", MediaType.TEXT_PLAIN); this.emitter.send("bar", MediaType.TEXT_PLAIN); this.emitter.complete(); verify(this.handler).send("foo", MediaType.TEXT_PLAIN); verify(this.handler).send("bar", MediaType.TEXT_PLAIN); verify(this.handler).complete(); verifyNoMoreInteractions(this.handler); }
@Test public void responseBodyEmitter() throws Exception { MethodParameter type = on(TestController.class).resolveReturnType(ResponseBodyEmitter.class); ResponseBodyEmitter emitter = new ResponseBodyEmitter(); this.handler.handleReturnValue(emitter, type, this.mavContainer, this.webRequest); assertTrue(this.request.isAsyncStarted()); assertEquals("", this.response.getContentAsString()); SimpleBean bean = new SimpleBean(); bean.setId(1L); bean.setName("Joe"); emitter.send(bean); emitter.send("\n"); bean.setId(2L); bean.setName("John"); emitter.send(bean); emitter.send("\n"); bean.setId(3L); bean.setName("Jason"); emitter.send(bean); assertEquals("{\"id\":1,\"name\":\"Joe\"}\n" + "{\"id\":2,\"name\":\"John\"}\n" + "{\"id\":3,\"name\":\"Jason\"}", this.response.getContentAsString()); MockAsyncContext asyncContext = (MockAsyncContext) this.request.getAsyncContext(); assertNull(asyncContext.getDispatchedPath()); emitter.complete(); assertNotNull(asyncContext.getDispatchedPath()); }
@Override public void onComplete() { if(!completed) { completed = true; responseBodyEmitter.complete(); } }
private void close() { emitter.complete(); jobsManager.getSubscriptions().unsubscribe(this); } }
@Override public final void onSubscribe(Subscription subscription) { this.subscription = subscription; this.emitter.onTimeout(() -> { if (logger.isTraceEnabled()) { logger.trace("Connection timeout for " + this.emitter); } terminate(); this.emitter.complete(); }); this.emitter.onError(this.emitter::completeWithError); subscription.request(1); }
@RequestMapping(value = "/{job:.*}/logStream", method = GET, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseBodyEmitter getJobLogStream(@PathVariable("job") String job) { JobInstance ji = jobsManager.getJob(job); ExtendedAssert.notFound(ji, "Job was not found by id: " + job); ResponseBodyEmitter emitter = new ResponseBodyEmitter(TimeUnit.MINUTES.toMillis(10L)); JobEventConsumer consumer = new JobEventConsumer(this.jobsManager, emitter, ji); ji.atEnd().addListener(() -> { // it need for job which finish before request emitter.complete(); }, ExecutorUtils.DIRECT); // TODO we may want to consume history, also. Subscription subs = jobsManager.getSubscriptions().openSubscriptionOnKey(consumer, ji.getInfo()); emitter.onCompletion(() -> { // Emitter not invoke this at client disconnect, // may be it will be fix in future versions subs.close(); }); return emitter; }