diff --git a/common/src/main/java/org/apache/rocketmq/common/message/MessageClientIDSetter.java b/common/src/main/java/org/apache/rocketmq/common/message/MessageClientIDSetter.java index df11556383de6c18d18751f43aa5cc7496197697..9d6ec95a5d2deacb6bdef3fbd9bffc2dd757d96e 100644 --- a/common/src/main/java/org/apache/rocketmq/common/message/MessageClientIDSetter.java +++ b/common/src/main/java/org/apache/rocketmq/common/message/MessageClientIDSetter.java @@ -39,11 +39,8 @@ public class MessageClientIDSetter { } LEN = ip.length + 2 + 4 + 4 + 2; ByteBuffer tempBuffer = ByteBuffer.allocate(ip.length + 2 + 4); - tempBuffer.position(0); tempBuffer.put(ip); - tempBuffer.position(ip.length); - tempBuffer.putInt(UtilAll.getPid()); - tempBuffer.position(ip.length + 2); + tempBuffer.putShort((short) UtilAll.getPid()); tempBuffer.putInt(MessageClientIDSetter.class.getClassLoader().hashCode()); FIX_STRING = UtilAll.bytes2string(tempBuffer.array()); setStartTime(System.currentTimeMillis()); @@ -107,6 +104,13 @@ public class MessageClientIDSetter { return result; } + public static short getPidFromID(String msgID) { + byte[] bytes = UtilAll.string2bytes(msgID); + ByteBuffer wrap = ByteBuffer.wrap(bytes); + wrap.position(bytes.length - 2 - 4 - 4 - 2); + return wrap.getShort(); + } + public static String createUniqID() { StringBuilder sb = new StringBuilder(LEN * 2); sb.append(FIX_STRING); @@ -120,7 +124,6 @@ public class MessageClientIDSetter { if (current >= nextStartTime) { setStartTime(current); } - buffer.position(0); buffer.putInt((int) (System.currentTimeMillis() - startTime)); buffer.putShort((short) COUNTER.getAndIncrement()); return buffer.array(); @@ -145,4 +148,3 @@ public class MessageClientIDSetter { return fakeIP; } } - diff --git a/common/src/test/java/org/apache/rocketmq/common/message/MessageClientIDSetterTest.java b/common/src/test/java/org/apache/rocketmq/common/message/MessageClientIDSetterTest.java index 1ec6d93cffc2391a9e049b545f5b3f3956585cdb..55aa5058da8f11f97cb058e90c99265592995a9b 100644 --- a/common/src/test/java/org/apache/rocketmq/common/message/MessageClientIDSetterTest.java +++ b/common/src/test/java/org/apache/rocketmq/common/message/MessageClientIDSetterTest.java @@ -17,6 +17,7 @@ package org.apache.rocketmq.common.message; +import org.apache.rocketmq.common.UtilAll; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -25,12 +26,22 @@ public class MessageClientIDSetterTest { @Test public void testGetIPStrFromID() { - String ipv4HostMsgId = "C0A803CA00002A9F0000000000031367"; - String ipv6HostMsgId = "24084004018081003FAA1DDE2B3F898A00002A9F0000000000000CA0"; - String v4Ip = "192.168.3.202"; - String v6Ip = "2408:4004:0180:8100:3faa:1dde:2b3f:898a"; - assertThat(MessageClientIDSetter.getIPStrFromID(ipv4HostMsgId)).isEqualTo(v4Ip); - assertThat(MessageClientIDSetter.getIPStrFromID(ipv6HostMsgId)).isEqualTo(v6Ip); + byte[] ip = UtilAll.getIP(); + String ipStr = (4 == ip.length) ? UtilAll.ipToIPv4Str(ip) : UtilAll.ipToIPv6Str(ip); + + String uniqID = MessageClientIDSetter.createUniqID(); + String ipStrFromID = MessageClientIDSetter.getIPStrFromID(uniqID); + + assertThat(ipStr).isEqualTo(ipStrFromID); } + @Test + public void testGetPidFromID() { + int pid = UtilAll.getPid(); + + String uniqID = MessageClientIDSetter.createUniqID(); + short pidFromID = MessageClientIDSetter.getPidFromID(uniqID); + + assertThat(pid).isEqualTo(pidFromID); + } }