@Override public void close() { logger.shutdown(); try { logger.awaitTermination(); eventProcessor.join(); } catch ( InterruptedException e ) { Thread.currentThread().interrupt(); } finally { out.flush(); out.close(); } }
@Override protected synchronized void doStop() throws IOException { asyncEventProcessor.shutdown(); asyncEventProcessor.awaitTermination(); outputSupplier.close(); }
@Test void mustNotProcessEventInSameThreadWhenNotShutDown() throws Exception { EventConsumer consumer = new EventConsumer(); AsyncEvents<Event> asyncEvents = new AsyncEvents<>( consumer, AsyncEvents.Monitor.NONE ); executor.submit( asyncEvents ); asyncEvents.send( new Event() ); Thread processingThread = consumer.poll( 10, TimeUnit.SECONDS ).processedBy; asyncEvents.shutdown(); assertThat( processingThread, is( not( Thread.currentThread() ) ) ); }
asyncEvents.shutdown(); awaitShutdownFuture.get();
@Test void eventsMustBeProcessedByBackgroundThread() throws Exception { EventConsumer consumer = new EventConsumer(); AsyncEvents<Event> asyncEvents = new AsyncEvents<>( consumer, AsyncEvents.Monitor.NONE ); executor.submit( asyncEvents ); Event firstSentEvent = new Event(); asyncEvents.send( firstSentEvent ); Event firstProcessedEvent = consumer.poll( 10, TimeUnit.SECONDS ); Event secondSentEvent = new Event(); asyncEvents.send( secondSentEvent ); Event secondProcessedEvent = consumer.poll( 10, TimeUnit.SECONDS ); asyncEvents.shutdown(); assertThat( firstProcessedEvent, is( firstSentEvent ) ); assertThat( secondProcessedEvent, is( secondSentEvent ) ); }
@Test void mustProcessEventsDirectlyWhenShutDown() { assertTimeout( ofSeconds( 10 ), () -> { EventConsumer consumer = new EventConsumer(); AsyncEvents<Event> asyncEvents = new AsyncEvents<>( consumer, AsyncEvents.Monitor.NONE ); executor.submit( asyncEvents ); asyncEvents.send( new Event() ); Thread threadForFirstEvent = consumer.poll( 10, TimeUnit.SECONDS ).processedBy; asyncEvents.shutdown(); assertThat( threadForFirstEvent, is( not( Thread.currentThread() ) ) ); Thread threadForSubsequentEvents; do { asyncEvents.send( new Event() ); threadForSubsequentEvents = consumer.poll( 10, TimeUnit.SECONDS ).processedBy; } while ( threadForSubsequentEvents != Thread.currentThread() ); } ); }
@Override public void close() { logger.shutdown(); try { logger.awaitTermination(); } finally { out.flush(); out.close(); } }
@Override protected synchronized void doStop() throws IOException { asyncEventProcessor.shutdown(); asyncEventProcessor.awaitTermination(); outputSupplier.close(); }