66#include " MessageAccessor.h"
77#include " Signature.h"
88#include " absl/strings/str_join.h"
9+ #include " absl/strings/str_split.h"
910#include " apache/rocketmq/v1/definition.pb.h"
1011#include " rocketmq/MQMessageExt.h"
12+ #include < algorithm>
1113#include < chrono>
14+ #include < cstdint>
15+ #include < iterator>
1216#include < memory>
1317#include < string>
18+ #include < utility>
1419
1520ROCKETMQ_NAMESPACE_BEGIN
1621
@@ -53,7 +58,7 @@ void ClientImpl::start() {
5358 };
5459 name_server_update_handle_ =
5560 client_manager_->getScheduler ().schedule (name_server_update_functor, UPDATE_NAME_SERVER_LIST_TASK_NAME,
56- std::chrono::milliseconds (0 ), std::chrono::seconds (30 ));
61+ std::chrono::milliseconds (0 ), std::chrono::seconds (30 ));
5762 }
5863
5964 auto route_update_functor = [ptr]() {
@@ -64,7 +69,7 @@ void ClientImpl::start() {
6469 };
6570
6671 route_update_handle_ = client_manager_->getScheduler ().schedule (route_update_functor, UPDATE_ROUTE_TASK_NAME,
67- std::chrono::seconds (10 ), std::chrono::seconds (30 ));
72+ std::chrono::seconds (10 ), std::chrono::seconds (30 ));
6873 state_.store (State::STARTED);
6974}
7075
@@ -236,6 +241,37 @@ void ClientImpl::fetchRouteFor(const std::string& topic, const std::function<voi
236241 QueryRouteRequest request;
237242 request.mutable_topic ()->set_arn (arn_);
238243 request.mutable_topic ()->set_name (topic);
244+ auto endpoints = request.mutable_endpoints ()->mutable_addresses ();
245+ std::vector<std::pair<std::string, std::uint16_t >> pairs;
246+ {
247+ absl::MutexLock lk (&name_server_list_mtx_);
248+ for (const auto & name_server_item : name_server_list_) {
249+ std::string::size_type pos = name_server_item.rfind (" :" );
250+ if (std::string::npos == pos) {
251+ continue ;
252+ }
253+ std::string host (name_server_item.substr (0 , pos));
254+ std::string port (name_server_item.substr (pos + 1 ));
255+ pairs.emplace_back (std::make_pair (host, std::stoi (port)));
256+ }
257+ }
258+
259+ if (!pairs.empty ()) {
260+ for (const auto & host_port : pairs) {
261+ auto address = new rmq::Address ();
262+ address->set_port (host_port.second );
263+ address->set_host (host_port.first );
264+ endpoints->AddAllocated (address);
265+ }
266+
267+ if (MixAll::isIPv4 (pairs.begin ()->first )) {
268+ request.mutable_endpoints ()->set_scheme (rmq::AddressScheme::IPv4);
269+ } else if (absl::StrContains (pairs.begin ()->first , ' :' )) {
270+ request.mutable_endpoints ()->set_scheme (rmq::AddressScheme::IPv6);
271+ } else {
272+ request.mutable_endpoints ()->set_scheme (rmq::AddressScheme::DOMAIN_NAME);
273+ }
274+ }
239275
240276 absl::flat_hash_map<std::string, std::string> metadata;
241277 Signature::sign (this , metadata);
@@ -346,7 +382,7 @@ void ClientImpl::multiplexing(const std::string& target, const MultiplexingReque
346382 absl::flat_hash_map<std::string, std::string> metadata;
347383 Signature::sign (this , metadata);
348384 client_manager_->multiplexingCall (target, metadata, request, absl::ToChronoMilliseconds (long_polling_timeout_),
349- std::bind (&ClientImpl::onMultiplexingResponse, this , std::placeholders::_1));
385+ std::bind (&ClientImpl::onMultiplexingResponse, this , std::placeholders::_1));
350386}
351387
352388void ClientImpl::onMultiplexingResponse (const InvocationContext<MultiplexingResponse>* ctx) {
@@ -359,7 +395,7 @@ void ClientImpl::onMultiplexingResponse(const InvocationContext<MultiplexingResp
359395 };
360396 static std::string task_name = " Initiate multiplex request later" ;
361397 client_manager_->getScheduler ().schedule (multiplexingLater, task_name, std::chrono::seconds (3 ),
362- std::chrono::seconds (0 ));
398+ std::chrono::seconds (0 ));
363399 return ;
364400 }
365401
@@ -373,7 +409,7 @@ void ClientImpl::onMultiplexingResponse(const InvocationContext<MultiplexingResp
373409 absl::flat_hash_map<std::string, std::string> metadata;
374410 Signature::sign (this , metadata);
375411 client_manager_->multiplexingCall (ctx->remote_address , metadata, request, absl::ToChronoMilliseconds (io_timeout_),
376- std::bind (&ClientImpl::onMultiplexingResponse, this , std::placeholders::_1));
412+ std::bind (&ClientImpl::onMultiplexingResponse, this , std::placeholders::_1));
377413 break ;
378414 }
379415
0 commit comments