diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java index a735f8455d3..a40aab3ae59 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java @@ -467,12 +467,10 @@ private Runnable buildProcessRequestHandler(ChannelHandlerContext ctx, RemotingC */ public void processResponseCommand(ChannelHandlerContext ctx, RemotingCommand cmd) { final int opaque = cmd.getOpaque(); - final ResponseFuture responseFuture = responseTable.get(opaque); + final ResponseFuture responseFuture = responseTable.remove(opaque); if (responseFuture != null) { responseFuture.setResponseCommand(cmd); - responseTable.remove(opaque); - if (responseFuture.getInvokeCallback() != null) { executeInvokeCallback(responseFuture); } else { @@ -564,10 +562,12 @@ public void scanResponseTable() { ResponseFuture rep = next.getValue(); if ((rep.getBeginTimestamp() + rep.getTimeoutMillis() + 1000) <= System.currentTimeMillis()) { - rep.release(); - it.remove(); - rfList.add(rep); - log.warn("remove timeout request, " + rep); + ResponseFuture removed = responseTable.remove(next.getKey()); + if (removed != null) { + removed.release(); + rfList.add(removed); + log.warn("remove timeout request, " + removed); + } } }