-
Question
-
Resolution: Unresolved
-
Major
-
None
-
None
-
None
Phenomenon
Hello.
We are using the below library for WebSocket.
- org.springframework.boot:spring-boot-starter-undertow:2.7.4
- io.undertow:undertow-core:2.2.19.Final
- io.undertow:undertow-servlet:2.2.19.Final
- io.undertow:undertow-websockets-jsr:2.2.19.Final
Recently I received the following error message.
java.io.IOException: UT000094: Blocking await method called from IO thread. Blocking IO must be dispatched to a worker thread or deadlocks will result. at io.undertow.server.protocol.framed.AbstractFramedStreamSinkChannel.awaitWritable(AbstractFramedStreamSinkChannel.java:295) at io.undertow.server.protocol.framed.AbstractFramedStreamSinkChannel.awaitWritable(AbstractFramedStreamSinkChannel.java:289) at org.xnio.channels.Channels.flushBlocking(Channels.java:64) at io.undertow.websockets.jsr.WebSocketSessionRemoteEndpoint$BasicWebSocketSessionRemoteEndpoint.sendText(WebSocketSessionRemoteEndpoint.java:287) at org.springframework.web.socket.adapter.standard.StandardWebSocketSession.sendTextMessage(StandardWebSocketSession.java:215) at org.springframework.web.socket.adapter.AbstractWebSocketSession.sendMessage(AbstractWebSocketSession.java:106) at com.kakaomobility.bone.connection.handler.WebSocketMessageHandler.handleTextMessage(WebSocketMessageHandler.java:126) at org.springframework.web.socket.handler.AbstractWebSocketHandler.handleMessage(AbstractWebSocketHandler.java:43) at org.springframework.web.socket.handler.WebSocketHandlerDecorator.handleMessage(WebSocketHandlerDecorator.java:75) at org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator.handleMessage(LoggingWebSocketHandlerDecorator.java:56) at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.handleMessage(ExceptionWebSocketHandlerDecorator.java:58) at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.handleTextMessage(StandardWebSocketHandlerAdapter.java:114) at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.access$000(StandardWebSocketHandlerAdapter.java:43) at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:85) at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:82) at io.undertow.websockets.jsr.FrameHandler$7.run(FrameHandler.java:288) at io.undertow.websockets.jsr.ServerWebSocketContainer$1.call(ServerWebSocketContainer.java:170) at io.undertow.websockets.jsr.ServerWebSocketContainer$1.call(ServerWebSocketContainer.java:167) at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43) at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:610) at io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:600) at io.undertow.websockets.jsr.FrameHandler.invokeTextHandler(FrameHandler.java:268) at io.undertow.websockets.jsr.FrameHandler.onFullTextMessage(FrameHandler.java:319) at io.undertow.websockets.core.AbstractReceiveListener$2.complete(AbstractReceiveListener.java:156) at io.undertow.websockets.core.AbstractReceiveListener$2.complete(AbstractReceiveListener.java:152) at io.undertow.websockets.core.BufferedTextMessage.read(BufferedTextMessage.java:105) at io.undertow.websockets.core.AbstractReceiveListener.readBufferedText(AbstractReceiveListener.java:152) at io.undertow.websockets.core.AbstractReceiveListener.bufferFullMessage(AbstractReceiveListener.java:90) at io.undertow.websockets.jsr.FrameHandler.onText(FrameHandler.java:184) at io.undertow.websockets.core.AbstractReceiveListener.handleEvent(AbstractReceiveListener.java:44) at io.undertow.websockets.core.AbstractReceiveListener.handleEvent(AbstractReceiveListener.java:33) at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92) at io.undertow.server.protocol.framed.AbstractFramedChannel$FrameReadListener.handleEvent(AbstractFramedChannel.java:959) at io.undertow.server.protocol.framed.AbstractFramedChannel$FrameReadListener.handleEvent(AbstractFramedChannel.java:939) at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92) at org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66) at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:89) at org.xnio.nio.WorkerThread.run(WorkerThread.java:591)
When looking at the undertow code, it is understood that it is called in the flow below.
- org.xnio.channels.Channels.flushBlocking()
- io.undertow.server.protocol.framed.AbstractFramedStreamSinkChannel.
awaitWritable()
In the last called "awaitWritable()", it is understood that if the current thread is an IO thread, it will throw an exception.
Question
Regarding this, I have a few questions.
- Why raise an exception when the current thread is an IO thread?
- Any possible causes for this error to occur?
Thank you.