From 0221151323846d159fbe9f9a9a6986768c1ce4c7 Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期三, 30 六月 2021 13:10:16 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.5.5:10010/r/valib/bhshmq
---
src/topic_node.cpp | 68 +++++++++++++++++++++-------------
1 files changed, 42 insertions(+), 26 deletions(-)
diff --git a/src/topic_node.cpp b/src/topic_node.cpp
index 3c38121..6096fbb 100644
--- a/src/topic_node.cpp
+++ b/src/topic_node.cpp
@@ -50,8 +50,8 @@
} // namespace
-TopicNode::TopicNode(SharedMemory &shm) :
- shm_(shm), state_(eStateUninited)
+TopicNode::TopicNode(SharedMemory &shm, MQId ssn_id) :
+ shm_(shm), state_(eStateUninited), ssn_id_(ssn_id)
{
}
@@ -497,9 +497,10 @@
out_msg_id = msg_id;
- auto SendTo = [this, msg_id](const MQInfo &remote, const MsgRequestTopic &req, const RequestResultCB &cb) {
+ auto SendTo = [this, remote_addr, msg_id](const MQInfo &remote, const MsgRequestTopic &req, const RequestResultCB &cb) {
auto &sock = SockClient();
BHMsgHead head(InitMsgHead(GetType(req), proc_id(), ssn(), msg_id));
+ *head.mutable_dest() = remote_addr;
AddRoute(head, sock);
head.set_topic(req.topic());
@@ -519,8 +520,12 @@
};
try {
- BHAddress addr;
- return (ClientQueryRPCTopic(req.topic(), addr, 3000)) && SendTo(MQInfo{addr.mq_id(), addr.abs_addr()}, req, cb);
+ if (remote_addr.ip().empty()) {
+ BHAddress addr;
+ return (ClientQueryRPCTopic(req.topic(), addr, 3000)) && SendTo(MQInfo{addr.mq_id(), addr.abs_addr()}, req, cb);
+ } else {
+ return SendTo(CenterAddr(), req, cb);
+ }
} catch (...) {
SetLastError(eError, "internal error.");
return false;
@@ -536,26 +541,36 @@
try {
auto &sock = SockClient();
-
- BHAddress addr;
- if (ClientQueryRPCTopic(request.topic(), addr, timeout_ms)) {
- LOG_TRACE() << "node: " << SockNode().id() << ", topic dest: " << addr.mq_id();
- BHMsgHead head(InitMsgHead(GetType(request), proc_id(), ssn()));
- AddRoute(head, sock);
- head.set_topic(request.topic());
-
- MsgI reply_msg(shm());
- DEFER1(reply_msg.Release(););
- BHMsgHead reply_head;
-
- if (sock.SendAndRecv({addr.mq_id(), addr.abs_addr()}, head, request, reply_msg, reply_head, timeout_ms) &&
- reply_head.type() == kMsgTypeRequestTopicReply &&
- reply_msg.ParseBody(out_reply)) {
- reply_head.mutable_proc_id()->swap(out_proc_id);
- return true;
+ MQInfo dest;
+ if (!remote_addr.ip().empty()) {
+ dest = CenterAddr();
+ } else {
+ BHAddress addr;
+ if (ClientQueryRPCTopic(request.topic(), addr, timeout_ms)) {
+ dest.offset_ = addr.abs_addr();
+ dest.id_ = addr.mq_id();
+ } else {
+ return false;
}
}
- } catch (...) {
+
+ BHMsgHead head(InitMsgHead(GetType(request), proc_id(), ssn()));
+ *head.mutable_dest() = remote_addr;
+ AddRoute(head, sock);
+ head.set_topic(request.topic());
+
+ MsgI reply_msg(shm());
+ DEFER1(reply_msg.Release(););
+ BHMsgHead reply_head;
+
+ if (sock.SendAndRecv(dest, head, request, reply_msg, reply_head, timeout_ms) &&
+ reply_head.type() == kMsgTypeRequestTopicReply &&
+ reply_msg.ParseBody(out_reply)) {
+ reply_head.mutable_proc_id()->swap(out_proc_id);
+ return true;
+ }
+ } catch (std::exception &e) {
+ LOG_ERROR() << __func__ << " exception: " << e.what();
SetLastError(eError, __func__ + std::string(" internal errer."));
}
return false;
@@ -613,6 +628,7 @@
auto &sock = SockPub();
BHMsgHead head(InitMsgHead(GetType(pub), proc_id(), ssn()));
AddRoute(head, sock);
+ head.set_topic(pub.topic());
if (timeout_ms == 0) {
return sock.Send(BusAddr(), head, pub);
@@ -633,7 +649,7 @@
// subscribe
-bool TopicNode::Subscribe(MsgTopicList &topics, MsgCommonReply &reply_body, const int timeout_ms)
+bool TopicNode::DoSubscribe(MsgTopicList &topics, const bool net, MsgCommonReply &reply_body, const int timeout_ms)
{
if (!IsOnline()) {
SetLastError(eNotRegistered, kErrMsgNotRegistered);
@@ -643,6 +659,7 @@
try {
auto &sock = SockSub();
MsgSubscribe sub;
+ sub.set_network(net);
sub.mutable_topics()->Swap(&topics);
BHMsgHead head(InitMsgHead(GetType(sub), proc_id(), ssn()));
@@ -658,7 +675,6 @@
reply.ParseBody(reply_body) &&
IsSuccess(reply_body.errmsg().errcode());
}
- // TODO wait for result?
} catch (...) {
return false;
}
@@ -704,12 +720,12 @@
return false;
}
}
- //TODO error msg.
if (head.type() == kMsgTypePublish) {
if (pub.ParseFromString(body)) {
head.mutable_proc_id()->swap(proc_id);
return true;
}
}
+ SetLastError(eError, "invalid subcribe msg received.");
return false;
}
\ No newline at end of file
--
Gitblit v1.8.0