diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/PopReviveService.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/PopReviveService.java index 07f16e98965..e5eec54f5b9 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/PopReviveService.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/PopReviveService.java @@ -53,6 +53,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -725,7 +726,7 @@ ArrayList genSortList() { return sortList; } sortList = new ArrayList<>(map.values()); - sortList.sort((o1, o2) -> (int) (o1.getReviveOffset() - o2.getReviveOffset())); + sortList.sort(Comparator.comparingLong(PopCheckPoint::getReviveOffset)); return sortList; } } diff --git a/broker/src/test/java/org/apache/rocketmq/broker/processor/PopReviveServiceTest.java b/broker/src/test/java/org/apache/rocketmq/broker/processor/PopReviveServiceTest.java index fa7e9982e1f..7b9f9e7fddc 100644 --- a/broker/src/test/java/org/apache/rocketmq/broker/processor/PopReviveServiceTest.java +++ b/broker/src/test/java/org/apache/rocketmq/broker/processor/PopReviveServiceTest.java @@ -442,6 +442,20 @@ public void testReviveMsgFromBatchAck() throws Throwable { assertEquals(1, commitOffsetCaptor.getValue().longValue()); } + @Test + public void testGenSortListShouldSortLargeReviveOffsets() { + PopReviveService.ConsumeReviveObj consumeReviveObj = new PopReviveService.ConsumeReviveObj(); + PopCheckPoint lowOffsetCk = buildPopCheckPoint(0, 0, 1); + PopCheckPoint highOffsetCk = buildPopCheckPoint(1, 0, (long) Integer.MAX_VALUE + 2); + consumeReviveObj.map.put("high", highOffsetCk); + consumeReviveObj.map.put("low", lowOffsetCk); + + List sortList = consumeReviveObj.genSortList(); + + assertEquals(lowOffsetCk, sortList.get(0)); + assertEquals(highOffsetCk, sortList.get(1)); + } + public static MessageExtBrokerInner buildBatchAckMsg(BatchAckMsg batchAckMsg, long deliverMs, long reviveOffset, long deliverTime) { MessageExtBrokerInner result = buildBatchAckInnerMessage(REVIVE_TOPIC, batchAckMsg, REVIVE_QUEUE_ID, STORE_HOST, deliverMs, PopMessageProcessor.genAckUniqueId(batchAckMsg)); result.setQueueOffset(reviveOffset);