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
