magnusp
10/19/2018 - 5:56 PM

Result

name=PropertiesConfig
appenders = console

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n

rootLogger.level = trace
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT
dependencyManagement {
    imports {
        mavenBom "io.projectreactor:reactor-bom:Californium-RELEASE"
    }
}

dependencies {
    compile 'io.projectreactor:reactor-core'
    compile 'io.projectreactor.netty:reactor-netty'
    /*
    compile "org.slf4j:slf4j-api:1.7.13"
    compile "org.slf4j:log4j-over-slf4j:1.7.13"
    compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.11.1'
    */
    testCompile 'io.projectreactor:reactor-test'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
package foo;

import org.junit.Test;
import reactor.core.publisher.Mono;
import reactor.netty.NettyPipeline;
import reactor.netty.http.client.HttpClient;
import reactor.netty.http.server.HttpServer;
import reactor.test.StepVerifier;

import java.nio.charset.Charset;

public class SomeTest {
    @Test
    public void doStuff() {
        var server = HttpServer.create()
                .port(8080)
                .wiretap()
                .handle((req, res) -> {
                    return res
                            .sendWebsocket((in, out) -> {
                                return out
                                        .options(NettyPipeline.SendOptions::flushOnEach)
                                        .sendString(Mono.just("foo"))
                                        .then(out.sendClose());
                            });

                })

                .bindNow();

        StepVerifier.create(HttpClient.create()
                .port(server.port())
                .wiretap()
                .websocket()
                .handle((in, out) -> {
                    return in
                            .receiveFrames()
                            .log()
                            .map(webSocketFrame -> webSocketFrame.content())
                            .map(byteBuf -> byteBuf.toString(Charset.defaultCharset()))
                            .doOnNext(x -> System.err.println(x))
                            .then();

                }))
                .expectComplete()
                .verify();

        server.disposeNow();
    }
}
[DEBUG] (main) Using Console logging
[ WARN] (main) [http] resources will use the default LoopResources: DefaultLoopResources {prefix=reactor-http, daemon=true, selectCount=4, workerCount=4}
[ WARN] (main) [http] resources will use the default ConnectionProvider: PooledConnectionProvider {name=http, poolFactory=reactor.netty.resources.ConnectionProvider$$Lambda$92/0x0000000100175c40@865dd6}
[DEBUG] (main) Default Epoll support : false
[DEBUG] (main) Default KQueue support : false
[DEBUG] (reactor-http-nio-1) [id: 0xce7565b4, L:/127.0.0.1:8080] Bound new server
[DEBUG] (main) Creating new client pool [http] for /127.0.0.1:8080
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b] Created new pooled channel, now 0 active connections and 1 inactive connections
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b] Initialized pipeline DefaultChannelPipeline{(reactor.left.loggingHandler = io.netty.handler.logging.LoggingHandler), (BootstrapHandlers$BootstrapInitializerHandler#0 = reactor.netty.channel.BootstrapHandlers$BootstrapInitializerHandler), (SimpleChannelPool$1#0 = io.netty.channel.pool.SimpleChannelPool$1), (reactor.left.httpCodec = io.netty.handler.codec.http.HttpClientCodec), (reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080] onStateChange(PooledConnection{channel=[id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080]}, [connected])
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080] onStateChange(GET{uri=/, connection=PooledConnection{channel=[id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080]}}, [configured])
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080] Registering pool release on close event for channel
[DEBUG] (reactor-http-nio-2) [id: 0x4fe96828, L:/127.0.0.1:8080 - R:/127.0.0.1:53606] New http connection, requesting read
[DEBUG] (reactor-http-nio-2) [id: 0x4fe96828, L:/127.0.0.1:8080 - R:/127.0.0.1:53606] Initialized pipeline DefaultChannelPipeline{(reactor.left.loggingHandler = io.netty.handler.logging.LoggingHandler), (BootstrapHandlers$BootstrapInitializerHandler#0 = reactor.netty.channel.BootstrapHandlers$BootstrapInitializerHandler), (reactor.left.httpCodec = io.netty.handler.codec.http.HttpServerCodec), (reactor.left.httpTrafficHandler = reactor.netty.http.server.HttpTrafficHandler), (reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080] Handler is being applied: {uri=ws://127.0.0.1:8080/, method=GET}
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080] Added encoder [reactor.left.httpAggregator] at the beginning of the user pipeline, full pipeline: [reactor.left.loggingHandler, reactor.left.httpCodec, reactor.left.httpAggregator, reactor.right.reactiveBridge, DefaultChannelPipeline$TailContext#0]
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080] Writing object DefaultFullHttpRequest(decodeResult: success, version: HTTP/1.1, content: UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 0, widx: 0, cap: 0))
GET / HTTP/1.1
user-agent: ReactorNetty/0.8.1.RELEASE
accept: */*
upgrade: websocket
connection: upgrade
sec-websocket-key: kFlY9EmkEQ3hYVPEnNWFvA==
host: 127.0.0.1:8080
sec-websocket-origin: http://127.0.0.1:8080
sec-websocket-version: 13
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080] Channel connected, now 1 active connections and 0 inactive connections
[DEBUG] (reactor-http-nio-2) [id: 0x4fe96828, L:/127.0.0.1:8080 - R:/127.0.0.1:53606] Increasing pending responses, now 1
[DEBUG] (reactor-http-nio-2) [id: 0x4fe96828, L:/127.0.0.1:8080 - R:/127.0.0.1:53606] Handler is being applied: foo.SomeTest$$Lambda$71/0x0000000100125c40@5559c52e
[DEBUG] (reactor-http-nio-2) [id: 0x4fe96828, L:/127.0.0.1:8080 - R:/127.0.0.1:53606] Removed handler: reactor.left.httpTrafficHandler, pipeline: DefaultChannelPipeline{(reactor.left.loggingHandler = io.netty.handler.logging.LoggingHandler), (reactor.left.httpCodec = io.netty.handler.codec.http.HttpServerCodec), (reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
[DEBUG] (reactor-http-nio-2) [id: 0x4fe96828, L:/127.0.0.1:8080 - R:/127.0.0.1:53606] Writing object DefaultFullHttpResponse(decodeResult: success, version: HTTP/1.1, content: UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 0, widx: 0, cap: 0))
HTTP/1.1 101 Switching Protocols
upgrade: websocket
connection: upgrade
sec-websocket-accept: F1ybhWXOqWM0byT8EI4vNzWG7RA=
[TRACE] (reactor-http-nio-2) [id: 0x4fe96828, L:/127.0.0.1:8080 - R:/127.0.0.1:53606] End of the pipeline, User event reactor.netty.NettyPipeline$SendOptionsChangeEvent@47c16d13
[DEBUG] (reactor-http-nio-2) [id: 0x4fe96828, L:/127.0.0.1:8080 - R:/127.0.0.1:53606] New sending options
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080] onStateChange(ws{uri=/, connection=PooledConnection{channel=[id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080]}}, [response_received])
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080] Subscribing inbound receiver [pending: 0, cancelled:false, inboundDone: false]
[ INFO] (reactor-http-nio-1) onSubscribe(FluxMap.MapSubscriber)
[ INFO] (reactor-http-nio-1) request(unbounded)
[DEBUG] (reactor-http-nio-2) [id: 0x4fe96828, L:/127.0.0.1:8080 - R:/127.0.0.1:53606] Writing object 
foo
[ INFO] (reactor-http-nio-1) onNext(TextWebSocketFrame(data: PooledUnsafeDirectByteBuf(ridx: 0, widx: 3, cap: 3)))
[DEBUG] (reactor-http-nio-2) [id: 0x4fe96828, L:/127.0.0.1:8080 - R:/127.0.0.1:53606] Writing object CloseWebSocketFrame(data: UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 0, widx: 0, cap: 0))
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080] CloseWebSocketFrame detected. Closing Websocket
[ INFO] (reactor-http-nio-1) onComplete()
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 - R:/127.0.0.1:8080] Writing object CloseWebSocketFrame(data: PooledUnsafeDirectByteBuf(ridx: 0, widx: 0, cap: 0))
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 ! R:/127.0.0.1:8080] Channel cleaned, now 0 active connections and 1 inactive connections
[ERROR] (reactor-http-nio-1) Operator called default onErrorDropped - java.lang.NullPointerException
java.lang.NullPointerException
[TRACE] (reactor-http-nio-2) [id: 0x4fe96828, L:/127.0.0.1:8080 ! R:/127.0.0.1:53606] Disposing ChannelOperation from a channel - java.lang.Exception: ChannelOperation terminal stack
java.lang.Exception: ChannelOperation terminal stack
	at reactor.util.Loggers$ConsoleLogger.format(Loggers.java:474)
	at reactor.util.Loggers$ConsoleLogger.debug(Loggers.java:514)
	at reactor.netty.ReactorNetty.removeHandler(ReactorNetty.java:209)
	at reactor.netty.Connection.removeHandler(Connection.java:334)
	at reactor.netty.http.client.HttpClientOperations.removeHandler(HttpClientOperations.java:187)
	at reactor.netty.http.client.HttpClientOperations.removeHandler(HttpClientOperations.java:87)
	at reactor.netty.ReactorNetty.lambda$registerForClose$0(ReactorNetty.java:194)
	at reactor.core.publisher.LambdaMonoSubscriber.onComplete(LambdaMonoSubscriber.java:101)
	at reactor.core.publisher.FluxFirstEmitting$FirstEmittingSubscriber.onComplete(FluxFirstEmitting.java:350)
	at reactor.netty.FutureMono$FutureSubscription.operationComplete(FutureMono.java:301)
	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:504)
	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:483)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424)
	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:103)
	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
	at io.netty.channel.AbstractChannel$CloseFuture.setClosed(AbstractChannel.java:1148)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.doClose0(AbstractChannel.java:764)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:740)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:611)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.close(DefaultChannelPipeline.java:1376)
	at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:624)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:608)
	at io.netty.handler.logging.LoggingHandler.close(LoggingHandler.java:217)
	at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:624)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:608)
	at io.netty.channel.ChannelOutboundHandlerAdapter.close(ChannelOutboundHandlerAdapter.java:71)
	at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:624)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:608)
	at io.netty.channel.ChannelDuplexHandler.close(ChannelDuplexHandler.java:73)
	at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:624)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:608)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:465)
	at io.netty.channel.DefaultChannelPipeline.close(DefaultChannelPipeline.java:1003)
	at io.netty.channel.AbstractChannel.close(AbstractChannel.java:238)
	at io.netty.channel.ChannelFutureListener$1.operationComplete(ChannelFutureListener.java:44)
	at io.netty.channel.ChannelFutureListener$1.operationComplete(ChannelFutureListener.java:41)
	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511)
	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424)
	at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:162)
	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95)
	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30)
	at reactor.netty.http.client.WebsocketClientOperations.sendCloseNow(WebsocketClientOperations.java:210)
	at reactor.netty.http.client.WebsocketClientOperations.onInboundNext(WebsocketClientOperations.java:136)
	at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:141)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310)
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	at io.netty.handler.logging.LoggingHandler.channelRead(LoggingHandler.java:241)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:628)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:528)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:482)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442)
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
	at java.base/java.lang.Thread.run(Thread.java:834)
	at reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:363)
	at reactor.netty.channel.ChannelOperations.onInboundClose(ChannelOperations.java:332)
	at reactor.netty.channel.ChannelOperationsHandler.channelInactive(ChannelOperationsHandler.java:121)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:224)
	at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:377)
	at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:342)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:224)
	at io.netty.handler.logging.LoggingHandler.channelInactive(LoggingHandler.java:167)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:224)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1429)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
	at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:947)
	at io.netty.channel.AbstractChannel$AbstractUnsafe$8.run(AbstractChannel.java:822)
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446)
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
	at java.base/java.lang.Thread.run(Thread.java:834)
[DEBUG] (main) Disposing pool for /127.0.0.1:8080
Oct 19, 2018 7:53:43 PM io.netty.util.concurrent.DefaultPromise notifyListener0
WARNING: An exception was thrown by reactor.netty.FutureMono$FutureSubscription.operationComplete()
reactor.core.Exceptions$BubblingException: java.lang.NullPointerException
	at reactor.core.Exceptions.bubble(Exceptions.java:154)
	at reactor.core.publisher.Operators.onErrorDropped(Operators.java:512)
	at reactor.core.publisher.LambdaMonoSubscriber.onComplete(LambdaMonoSubscriber.java:104)
	at reactor.core.publisher.FluxFirstEmitting$FirstEmittingSubscriber.onComplete(FluxFirstEmitting.java:350)
	at reactor.netty.FutureMono$FutureSubscription.operationComplete(FutureMono.java:301)
	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:504)
	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:483)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424)
	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:103)
	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
	at io.netty.channel.AbstractChannel$CloseFuture.setClosed(AbstractChannel.java:1148)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.doClose0(AbstractChannel.java:764)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:740)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:611)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.close(DefaultChannelPipeline.java:1376)
	at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:624)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:608)
	at io.netty.handler.logging.LoggingHandler.close(LoggingHandler.java:217)
	at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:624)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:608)
	at io.netty.channel.ChannelOutboundHandlerAdapter.close(ChannelOutboundHandlerAdapter.java:71)
	at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:624)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:608)
	at io.netty.channel.ChannelDuplexHandler.close(ChannelDuplexHandler.java:73)
	at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:624)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:608)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:465)
	at io.netty.channel.DefaultChannelPipeline.close(DefaultChannelPipeline.java:1003)
	at io.netty.channel.AbstractChannel.close(AbstractChannel.java:238)
	at io.netty.channel.ChannelFutureListener$1.operationComplete(ChannelFutureListener.java:44)
	at io.netty.channel.ChannelFutureListener$1.operationComplete(ChannelFutureListener.java:41)
	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511)
	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424)
	at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:162)
	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95)
	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30)
	at reactor.netty.http.client.WebsocketClientOperations.sendCloseNow(WebsocketClientOperations.java:210)
	at reactor.netty.http.client.WebsocketClientOperations.onInboundNext(WebsocketClientOperations.java:136)
	at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:141)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310)
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	at io.netty.handler.logging.LoggingHandler.channelRead(LoggingHandler.java:241)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:628)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:528)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:482)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442)
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NullPointerException
	at reactor.util.Loggers$ConsoleLogger.format(Loggers.java:474)
	at reactor.util.Loggers$ConsoleLogger.debug(Loggers.java:514)
	at reactor.netty.ReactorNetty.removeHandler(ReactorNetty.java:209)
	at reactor.netty.Connection.removeHandler(Connection.java:334)
	at reactor.netty.http.client.HttpClientOperations.removeHandler(HttpClientOperations.java:187)
	at reactor.netty.http.client.HttpClientOperations.removeHandler(HttpClientOperations.java:87)
	at reactor.netty.ReactorNetty.lambda$registerForClose$0(ReactorNetty.java:194)
	at reactor.core.publisher.LambdaMonoSubscriber.onComplete(LambdaMonoSubscriber.java:101)
	... 61 more

[TRACE] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 ! R:/127.0.0.1:8080] Disposing ChannelOperation from a channel - java.lang.Exception: ChannelOperation terminal stack
java.lang.Exception: ChannelOperation terminal stack
	at reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:363)
	at reactor.netty.http.client.WebsocketClientOperations.onInboundClose(WebsocketClientOperations.java:155)
	at reactor.netty.channel.ChannelOperationsHandler.channelInactive(ChannelOperationsHandler.java:121)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:224)
	at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:377)
	at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:342)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:224)
	at io.netty.handler.logging.LoggingHandler.channelInactive(LoggingHandler.java:167)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:224)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1429)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
	at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:947)
	at io.netty.channel.AbstractChannel$AbstractUnsafe$8.run(AbstractChannel.java:822)
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446)
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
	at java.base/java.lang.Thread.run(Thread.java:834)
[DEBUG] (reactor-http-nio-1) [id: 0x64dff69b, L:/127.0.0.1:53606 ! R:/127.0.0.1:8080] onStateChange(ws{uri=/, connection=PooledConnection{channel=[id: 0x64dff69b, L:/127.0.0.1:53606 ! R:/127.0.0.1:8080]}}, [disconnecting])

Process finished with exit code 0