This is an automated email from the ASF dual-hosted git repository.

lizhanhui pushed a commit to branch cpp_dev
in repository https://gitbox.apache.org/repos/asf/rocketmq-clients.git

commit b33b68d5b4617bcb55fcb3aea279bccdb7e0b0cc
Author: Li Zhanhui <[email protected]>
AuthorDate: Fri Jul 29 10:33:13 2022 +0800

    Make clientId() a free function following: Effective C++ Item 23 Prefer 
non-member non-friend functions to member functions
---
 cpp/source/rocketmq/ClientImpl.cpp           | 20 +++++++++-----------
 cpp/source/rocketmq/include/ClientImpl.h     | 20 ++++++++++----------
 cpp/source/rocketmq/tests/BUILD.bazel        |  8 ++++++++
 cpp/source/rocketmq/tests/ClientImplTest.cpp | 20 ++++++++++++++++++++
 4 files changed, 47 insertions(+), 21 deletions(-)

diff --git a/cpp/source/rocketmq/ClientImpl.cpp 
b/cpp/source/rocketmq/ClientImpl.cpp
index bccfe37..4c8b199 100644
--- a/cpp/source/rocketmq/ClientImpl.cpp
+++ b/cpp/source/rocketmq/ClientImpl.cpp
@@ -16,6 +16,8 @@
  */
 #include "ClientImpl.h"
 
+#include <unistd.h>
+
 #include <algorithm>
 #include <atomic>
 #include <chrono>
@@ -31,9 +33,8 @@
 
 #include "ClientManagerImpl.h"
 #include "InvocationContext.h"
-#include "rocketmq/Logger.h"
-#include "spdlog/spdlog.h"
 #include "MessageExt.h"
+#include "MixAll.h"
 #include "NamingScheme.h"
 #include "SessionImpl.h"
 #include "Signature.h"
@@ -42,9 +43,12 @@
 #include "absl/strings/numbers.h"
 #include "absl/strings/str_join.h"
 #include "absl/strings/str_split.h"
+#include "fmt/format.h"
 #include "opencensus/stats/stats.h"
+#include "rocketmq/Logger.h"
 #include "rocketmq/Message.h"
 #include "rocketmq/MessageListener.h"
+#include "spdlog/spdlog.h"
 
 ROCKETMQ_NAMESPACE_BEGIN
 
@@ -601,16 +605,10 @@ void ClientImpl::notifyClientTermination(const 
NotifyClientTerminationRequest& r
   }
 }
 
-std::string ClientImpl::clientId() {
+std::string clientId() {
   static std::atomic_uint32_t sequence;
-  std::stringstream ss;
-  ss << UtilAll::hostname();
-  ss << "@";
-  std::string processID = std::to_string(getpid());
-  ss << processID << "#";
-  ss << sequence.fetch_add(1, std::memory_order_relaxed);
-  ss << "_" << 
MixAll::millisecondsOf(std::chrono::system_clock::now().time_since_epoch());
-  return ss.str();
+  return fmt::format("{}@{}#{}_{}", UtilAll::hostname(), getpid(), 
sequence.fetch_add(1, std::memory_order_relaxed),
+                     
MixAll::millisecondsOf(std::chrono::system_clock::now().time_since_epoch()));
 }
 
 ROCKETMQ_NAMESPACE_END
\ No newline at end of file
diff --git a/cpp/source/rocketmq/include/ClientImpl.h 
b/cpp/source/rocketmq/include/ClientImpl.h
index 78d2759..8fc6355 100644
--- a/cpp/source/rocketmq/include/ClientImpl.h
+++ b/cpp/source/rocketmq/include/ClientImpl.h
@@ -228,17 +228,17 @@ private:
 
   void doVerify(std::string target, std::string command_id, MessageConstPtr 
message);
 
-  /**
-   * ClientID is required to remain unique in the following scenarios:
-   *
-   * 1. Create multiple clients;
-   * 2. Restart the client program in container deployments;
-   *
-   * @return Unique Client-ID
-   */
-  static std::string clientId();
-
   std::string metricServiceEndpoint() const;
 };
 
+/**
+ * ClientID is required to remain unique in the following scenarios:
+ *
+ * 1. Create multiple clients;
+ * 2. Restart the client program in container deployments;
+ *
+ * @return Unique Client-ID
+ */
+std::string clientId();
+
 ROCKETMQ_NAMESPACE_END
\ No newline at end of file
diff --git a/cpp/source/rocketmq/tests/BUILD.bazel 
b/cpp/source/rocketmq/tests/BUILD.bazel
index 40d9f61..25303d7 100644
--- a/cpp/source/rocketmq/tests/BUILD.bazel
+++ b/cpp/source/rocketmq/tests/BUILD.bazel
@@ -36,3 +36,11 @@ cc_test(
     ],
     deps = base_deps,
 )
+
+cc_test(
+    name = "client_impl_test",
+    srcs = [
+        "ClientImplTest.cpp",
+    ],
+    deps = base_deps,
+)
\ No newline at end of file
diff --git a/cpp/source/rocketmq/tests/ClientImplTest.cpp 
b/cpp/source/rocketmq/tests/ClientImplTest.cpp
new file mode 100644
index 0000000..1dcdb25
--- /dev/null
+++ b/cpp/source/rocketmq/tests/ClientImplTest.cpp
@@ -0,0 +1,20 @@
+#include <cstddef>
+#include <unordered_set>
+
+#include "ClientImpl.h"
+#include "gtest/gtest.h"
+#include "rocketmq/RocketMQ.h"
+
+ROCKETMQ_NAMESPACE_BEGIN
+
+TEST(ClientImplTest, testClientId) {
+  std::unordered_set<std::string> client_ids;
+  for (std::size_t i = 0; i < 128; i++) {
+    auto&& client_id = clientId();
+    std::cout << client_id << std::endl;
+    ASSERT_EQ(client_ids.find(client_id), client_ids.end());
+    client_ids.insert(std::move(client_id));
+  }
+}
+
+ROCKETMQ_NAMESPACE_END
\ No newline at end of file

Reply via email to