Affects: \Spring-WebFlux 5.1.9:RELEASE

Hello, I catch this error often on Debian 9 and very rarely on Windows 10 (OpenJDK 12.0.2+10). I do this: 1. Create very long WebClient responses chain; 2. Subscribe to the Publisher and set the Disposable to a member value of Configuration class; 3. In onComplete i can publish a special async (For ex: SpecEvent) event to Configuration; 4. (AsyncEventListener) In SpecEventHandler i invoke dispose(), sleep one second and close current ApplicationContext; 5. And I get such error:

[17:56:07][Step 1/1] java.lang.IllegalStateException: java.lang.IllegalStateException: Socket couldn't be stopped within 3000ms
[17:56:07][Step 1/1]    at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext$ServerManager.stop(ReactiveWebServerApplicationContext.java:233)
[17:56:07][Step 1/1]    at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.stopAndReleaseReactiveWebServer(ReactiveWebServerApplicationContext.java:157)
[17:56:07][Step 1/1]    at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.onClose(ReactiveWebServerApplicationContext.java:151)
[17:56:07][Step 1/1]    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1032)
[17:56:07][Step 1/1]    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:975)
[17:56:07][Step 1/1]    at com.myexample.external.pendingResolver.PendingResolver.handleStopEvent(PendingResolver.java:112) // My async handler
[17:56:07][Step 1/1]    at com.myexample.external.pendingResolver.PendingResolver$$FastClassBySpringCGLIB$$2fb70d9d.invoke(<generated>)
[17:56:07][Step 1/1]    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
[17:56:07][Step 1/1]    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
[17:56:07][Step 1/1]    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
[17:56:07][Step 1/1]    at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
[17:56:07][Step 1/1]    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[17:56:07][Step 1/1]    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
[17:56:07][Step 1/1]    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
[17:56:07][Step 1/1]    at java.base/java.lang.Thread.run(Thread.java:835)
[17:56:07][Step 1/1] Caused by: java.lang.IllegalStateException: Socket couldn't be stopped within 3000ms
[17:56:07][Step 1/1]    at reactor.netty.DisposableChannel.disposeNow(DisposableChannel.java:98)
[17:56:07][Step 1/1]    at reactor.netty.DisposableChannel.disposeNow(DisposableChannel.java:82)
[17:56:07][Step 1/1]    at org.springframework.boot.web.embedded.netty.NettyWebServer.stop(NettyWebServer.java:120)
[17:56:07][Step 1/1]    at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext$ServerManager.stop(ReactiveWebServerApplicationContext.java:230)
[17:56:07][Step 1/1]    ... 14 common frames omitted
[17:56:07][Step 1/1] Process exited with code 0

I can increase my sleep time, and the error will appear less.

Also i found the similar issue.

Comment From: Bittuw

I found the issue. In Configuration i also receive ContextCloseEvent and in this async handler was also called dispose of the same Disposable. I thought that dispose is thread-safe. I was wrong. But i didn't find the explanation of the difference in behavior on different platforms...