diff --git a/proxy/src/main/java/org/apache/rocketmq/proxy/remoting/RemotingProtocolServer.java b/proxy/src/main/java/org/apache/rocketmq/proxy/remoting/RemotingProtocolServer.java index 4f16a530c76..91473e3c4c3 100644 --- a/proxy/src/main/java/org/apache/rocketmq/proxy/remoting/RemotingProtocolServer.java +++ b/proxy/src/main/java/org/apache/rocketmq/proxy/remoting/RemotingProtocolServer.java @@ -393,11 +393,26 @@ protected void cleanExpiredRequestInQueue(ThreadPoolExecutor threadPoolExecutor, } else { break; } - } catch (Throwable ignored) { + } catch (Throwable t) { + log.warn("clean expired remoting request failed. queueSize:{}, maxWaitTimeMillsInQueue:{}", + safeQueueSize(threadPoolExecutor), maxWaitTimeMillsInQueue, t); + break; } } } + private int safeQueueSize(ThreadPoolExecutor threadPoolExecutor) { + try { + BlockingQueue queue = threadPoolExecutor == null ? null : threadPoolExecutor.getQueue(); + if (queue == null) { + return -1; + } + return queue.size(); + } catch (Throwable ignored) { + return -1; + } + } + private RequestTask castRunnable(final Runnable runnable) { try { if (runnable instanceof FutureTaskExt) { diff --git a/proxy/src/test/java/org/apache/rocketmq/proxy/remoting/RemotingProtocolServerTest.java b/proxy/src/test/java/org/apache/rocketmq/proxy/remoting/RemotingProtocolServerTest.java index acd9c1c2d44..ca9a99715ed 100644 --- a/proxy/src/test/java/org/apache/rocketmq/proxy/remoting/RemotingProtocolServerTest.java +++ b/proxy/src/test/java/org/apache/rocketmq/proxy/remoting/RemotingProtocolServerTest.java @@ -17,6 +17,7 @@ package org.apache.rocketmq.proxy.remoting; +import java.util.concurrent.ThreadPoolExecutor; import org.apache.rocketmq.remoting.RemotingServer; import org.apache.rocketmq.remoting.protocol.RequestHeaderRegistry; import org.junit.Test; @@ -44,4 +45,15 @@ public void shouldInitializeRequestHeaderRegistryWhenRegisteringProcessors() { verify(requestHeaderRegistry).initialize(); } } + + @Test(timeout = 1000) + public void testCleanExpiredRequestInQueueBreaksWhenQueueAccessFails() { + RemotingProtocolServer server = Mockito.mock(RemotingProtocolServer.class, Mockito.CALLS_REAL_METHODS); + ThreadPoolExecutor executor = Mockito.mock(ThreadPoolExecutor.class); + Mockito.when(executor.getQueue()).thenThrow(new RuntimeException("queue unavailable")); + + server.cleanExpiredRequestInQueue(executor, 1); + + Mockito.verify(executor, Mockito.atMost(2)).getQueue(); + } }