fix bug in mq C++

This commit is contained in:
lnk
2026-04-30 15:45:34 +08:00
parent 073c98e89a
commit 3c98bf7eae
5 changed files with 109 additions and 94 deletions

View File

@@ -45,11 +45,15 @@
using namespace std;
static std::once_flag g_consumer_once;
static std::once_flag g_producer_once;
extern std::string G_ROCKETMQ_PRODUCER;//rocketmq producer
extern std::string G_ROCKETMQ_IPPORT;//rocketmq ip+port
extern std::string G_ROCKETMQ_TOPIC;//topie
extern std::string G_ROCKETMQ_TAG;//tag
extern std::string G_ROCKETMQ_KEY;//key
extern std::string G_ROCKETMQ_TOPIC_TEST;//topie
extern std::string G_ROCKETMQ_TAG_TEST;//tag
extern std::string G_ROCKETMQ_KEY_TEST;//key
extern std::string G_MQCONSUMER_TOPIC_LOG;
extern std::string G_MQCONSUMER_TOPIC_SET;
@@ -57,6 +61,8 @@ extern std::string G_MQCONSUMER_TOPIC_RC;
extern std::string G_MQCONSUMER_TOPIC_UD;
extern std::string G_MQCONSUMER_TOPIC_RT;
extern std::string G_MQCONSUMER_TOPIC_TEST;
extern std::string FRONT_INST;
extern bool DEBUGOPEN;
@@ -110,8 +116,8 @@ public:
RocketMQConsumer(const std::string& consumerName, const std::string& nameServer);
// 禁用拷贝和赋值
//RocketMQConsumer(const RocketMQConsumer&) {}
RocketMQConsumer& operator=(const RocketMQConsumer&) { return *this; }
RocketMQConsumer(const RocketMQConsumer&) = delete;
RocketMQConsumer& operator=(const RocketMQConsumer&) = delete;
// 订阅主题和标签,并注册回调
void subscribe(const std::string& topic,
@@ -227,24 +233,25 @@ RocketMQConsumer::RocketMQConsumer(const std::string& consumerGroup,
G_MQCONSUMER_CHANNEL
);
// 限制消费线程池,防止 ConsumeTP 爆炸
consumer_.setConsumeThreadCount(4);
listener_ = new InternalListener(this);
}
// 启动消费者
void RocketMQConsumer::start()
{
/*if (StartPushConsumer(consumer_) != 0) {
pthread_mutex_lock(&g_consumerMapMutex);
g_consumerMap.erase(consumer_);
pthread_mutex_unlock(&g_consumerMapMutex);
DestroyPushConsumer(consumer_);
throw std::runtime_error("Failed to start push consumer.");
static bool started = false;
if (started) {
std::cout << "Consumer already started" << std::endl;
return;
}
else{
std::cout << "RocketMQ Consumer started." << std::endl;
}*/
consumer_.registerMessageListener(listener_);
consumer_.start();
started = true;
}
void RocketMQConsumer::subscribe(const std::string& topic, const std::string& tag, MessageCallBack callback)
@@ -361,6 +368,8 @@ RocketMQConsumer::~RocketMQConsumer()
} catch (...) {
}
sleep(1); // 等内部线程退出
delete listener_;
listener_ = NULL;
@@ -434,16 +443,13 @@ void rocketmq_consumer_receive(
const std::string& nameServer,
const std::vector<Subscription>& subscriptions) // 接收多个订阅
{
if (g_consumer == NULL) {
std::call_once(g_consumer_once, [&](){
try {
//InitializeConsumer(consumerName, nameServer, topic, tag, callback);//初始化后mq库内部来完成消息的获取
InitializeConsumer(consumerName, nameServer, subscriptions); // 初始化后MQ库内部开始获取消息
}
catch (...) {
InitializeConsumer(consumerName, nameServer, subscriptions);
} catch (...) {
std::cerr << "Cannot consume message because consumer initialization failed." << std::endl;
return;
}
}
});
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -848,14 +854,9 @@ void rocketmq_producer_send(const std::string& body,
const std::string& tags,
const std::string& keys)
{
if (g_producer == NULL) {
try {
InitializeProducer();
} catch (...) {
std::cerr << "Cannot send message because producer initialization failed." << std::endl;
return;
}
}
std::call_once(g_producer_once, [&](){
InitializeProducer();
});
try {
g_producer->sendMessage(body, topic, tags, keys);
@@ -876,9 +877,9 @@ void StartSendMessage(CProducer* producer)
CSendResult result;
// create message and set some values for it
CMessage* msg = CreateMessage(G_ROCKETMQ_TOPIC.c_str());
SetMessageTags(msg, G_ROCKETMQ_TAG.c_str());
SetMessageKeys(msg, G_ROCKETMQ_KEY.c_str());
CMessage* msg = CreateMessage(G_ROCKETMQ_TOPIC_TEST.c_str());
SetMessageTags(msg, G_ROCKETMQ_TAG_TEST.c_str());
SetMessageKeys(msg, G_ROCKETMQ_KEY_TEST.c_str());
for (int i = 0; i < 10; i++)
{
@@ -902,9 +903,9 @@ void StartSendMessage(CProducer* producer,const char* strbody)
CSendResult result;
// create message and set some values for it
CMessage* msg = CreateMessage(G_ROCKETMQ_TOPIC.c_str());
SetMessageTags(msg, G_ROCKETMQ_TAG.c_str());
SetMessageKeys(msg, G_ROCKETMQ_KEY.c_str());
CMessage* msg = CreateMessage(G_ROCKETMQ_TOPIC_TEST.c_str());
SetMessageTags(msg, G_ROCKETMQ_TAG_TEST.c_str());
SetMessageKeys(msg, G_ROCKETMQ_KEY_TEST.c_str());
SetMessageBody(msg, strbody);
// send message
@@ -963,7 +964,7 @@ void rocketmq_test_rt()
{
Ckafka_data_t data;
data.monitor_id = 123123;
data.strTopic = QString::fromStdString(std::string(FRONT_INST) + "_" + G_MQCONSUMER_TOPIC_RT);
data.strTopic = QString::fromStdString(G_MQCONSUMER_TOPIC_RT);
std::ifstream file("rt.txt"); // 文件中存储长字符串
std::stringstream buffer;
buffer << file.rdbuf(); // 读取整个文件内容
@@ -977,7 +978,7 @@ void rocketmq_test_ud()//用来测试台账更新
{
Ckafka_data_t data;
data.monitor_id = 123123;
data.strTopic = QString::fromStdString(std::string(FRONT_INST) + "_" + G_MQCONSUMER_TOPIC_UD);
data.strTopic = QString::fromStdString(G_MQCONSUMER_TOPIC_UD);
std::ifstream file("ud.txt"); // 文件中存储长字符串
std::stringstream buffer;
buffer << file.rdbuf(); // 读取整个文件内容
@@ -991,7 +992,7 @@ void rocketmq_test_set()//用来测试进程控制脚本
{
Ckafka_data_t data;
data.monitor_id = 123123;
data.strTopic = QString::fromStdString(std::string(FRONT_INST) + "_" + G_MQCONSUMER_TOPIC_SET);
data.strTopic = QString::fromStdString(G_MQCONSUMER_TOPIC_SET);
std::ifstream file("set.txt"); // 文件中存储长字符串
std::stringstream buffer;
buffer << file.rdbuf(); // 读取整个文件内容
@@ -1005,8 +1006,8 @@ void rocketmq_test_only()//用来测试进程控制脚本
{
Ckafka_data_t data;
data.monitor_id = 123123;
data.strTopic = QString::fromStdString(std::string(FRONT_INST) + "_" + G_MQCONSUMER_TOPIC_SET);
std::ifstream file("set_debug.txt"); // 文件中存储长字符串
data.strTopic = QString::fromStdString(G_MQCONSUMER_TOPIC_TEST);
std::ifstream file("test.txt"); // 文件中存储长字符串
std::stringstream buffer;
buffer << file.rdbuf(); // 读取整个文件内容
@@ -1020,7 +1021,7 @@ void rocketmq_test_rc()
{
Ckafka_data_t data;
data.monitor_id = 123123;
data.strTopic = QString::fromStdString(std::string(FRONT_INST) + "_" + G_MQCONSUMER_TOPIC_RC);
data.strTopic = QString::fromStdString(G_MQCONSUMER_TOPIC_RC);
std::ifstream file("rc.txt"); // 文件中存储长字符串
std::stringstream buffer;
buffer << file.rdbuf(); // 读取整个文件内容
@@ -1035,7 +1036,7 @@ void rocketmq_test_log()
{
Ckafka_data_t data;
data.monitor_id = 123123;
data.strTopic = QString::fromStdString(std::string(FRONT_INST) + "_" + G_MQCONSUMER_TOPIC_LOG);
data.strTopic = QString::fromStdString(G_MQCONSUMER_TOPIC_LOG);
std::ifstream file("log_test.txt"); // 文件中存储长字符串
std::stringstream buffer;
buffer << file.rdbuf(); // 读取整个文件内容