fix bug in mq C++
This commit is contained in:
@@ -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(); // 读取整个文件内容
|
||||
|
||||
@@ -280,9 +280,9 @@ extern int g_front_seg_num;
|
||||
//生产者
|
||||
std::string G_ROCKETMQ_PRODUCER = "";//rocketmq producer
|
||||
std::string G_ROCKETMQ_IPPORT = "";//rocketmq ip+port
|
||||
std::string G_ROCKETMQ_TOPIC = "";//topie
|
||||
std::string G_ROCKETMQ_TAG = "";//tag
|
||||
std::string G_ROCKETMQ_KEY = "";//key
|
||||
std::string G_ROCKETMQ_TOPIC_TEST = "";//topie
|
||||
std::string G_ROCKETMQ_TAG_TEST = "";//tag
|
||||
std::string G_ROCKETMQ_KEY_TEST = "";//key
|
||||
int QUEUENUM = 0;
|
||||
std::string BROKERNAME = "";
|
||||
//消费者
|
||||
@@ -327,6 +327,8 @@ std::string G_MQCONSUMER_TOPIC_FILE = "";//consumer topie
|
||||
std::string G_MQCONSUMER_TAG_FILE = "";//consumer tag
|
||||
std::string G_MQCONSUMER_KEY_FILE = "";//consumer key
|
||||
|
||||
std::string G_MQCONSUMER_TOPIC_TEST = "";
|
||||
|
||||
int G_TEST_FLAG = 0;
|
||||
int G_TEST_NUM = 0;
|
||||
int G_TEST_TYPE = 0;
|
||||
@@ -644,12 +646,12 @@ void init_config() {
|
||||
G_ROCKETMQ_PRODUCER = strdup(ba.data());
|
||||
ba = settings.value("RocketMq/Ipport", "").toString().toLatin1();
|
||||
G_ROCKETMQ_IPPORT = strdup(ba.data());
|
||||
ba = settings.value("RocketMq/Topic", "").toString().toLatin1();
|
||||
G_ROCKETMQ_TOPIC = strdup(ba.data());
|
||||
ba = settings.value("RocketMq/Tag", "").toString().toLatin1();
|
||||
G_ROCKETMQ_TAG = strdup(ba.data());
|
||||
ba = settings.value("RocketMq/Key", "").toString().toLatin1();
|
||||
G_ROCKETMQ_KEY = strdup(ba.data());
|
||||
ba = settings.value("RocketMq/TESTTopic", "").toString().toLatin1();
|
||||
G_ROCKETMQ_TOPIC_TEST = strdup(ba.data());
|
||||
ba = settings.value("RocketMq/TESTTag", "").toString().toLatin1();
|
||||
G_ROCKETMQ_TAG_TEST = strdup(ba.data());
|
||||
ba = settings.value("RocketMq/TESTKey", "").toString().toLatin1();
|
||||
G_ROCKETMQ_KEY_TEST = strdup(ba.data());
|
||||
QUEUENUM = settings.value("RocketMq/Queuenum", 0).toInt();
|
||||
|
||||
//心跳
|
||||
@@ -724,13 +726,16 @@ void init_config() {
|
||||
G_CONNECT_KEY = strdup(ba.data());
|
||||
|
||||
//lnk20260310添加文件管理的topic和tag
|
||||
ba = settings.value("RocketMq/ConsumerTopicFile", "").toString().toLatin1();
|
||||
ba = settings.value("RocketMq/ConsumerTopicFILE", "").toString().toLatin1();
|
||||
G_MQCONSUMER_TOPIC_FILE = strdup(ba.data());
|
||||
ba = settings.value("RocketMq/ConsumerTagFile", "").toString().toLatin1();
|
||||
ba = settings.value("RocketMq/ConsumerTagFILE", "").toString().toLatin1();
|
||||
G_MQCONSUMER_TAG_FILE = strdup(ba.data());
|
||||
ba = settings.value("RocketMq/ConsumerKeyFile", "").toString().toLatin1();
|
||||
ba = settings.value("RocketMq/ConsumerKeyFILE", "").toString().toLatin1();
|
||||
G_MQCONSUMER_KEY_FILE = strdup(ba.data());
|
||||
|
||||
ba = settings.value("RocketMq/ConsumerTopicTEST", "").toString().toLatin1();
|
||||
G_MQCONSUMER_TOPIC_TEST = strdup(ba.data());
|
||||
|
||||
|
||||
//MQ测试
|
||||
G_TEST_FLAG = settings.value("RocketMq/Testflag", 0).toInt();
|
||||
@@ -747,9 +752,9 @@ void init_config() {
|
||||
//生产者相关打印
|
||||
std::cout << "Read G_ROCKETMQ_PRODUCER:" << G_ROCKETMQ_PRODUCER << std::endl;
|
||||
std::cout << "Read G_ROCKETMQ_IPPORT:" << G_ROCKETMQ_IPPORT << std::endl;
|
||||
std::cout << "Read G_ROCKETMQ_TOPIC:" << G_ROCKETMQ_TOPIC << std::endl;
|
||||
std::cout << "Read G_ROCKETMQ_TAG:" << G_ROCKETMQ_TAG << std::endl;
|
||||
std::cout << "Read G_ROCKETMQ_KEY:" << G_ROCKETMQ_KEY << std::endl;
|
||||
std::cout << "Read G_ROCKETMQ_TOPIC_TEST:" << G_ROCKETMQ_TOPIC_TEST << std::endl;
|
||||
std::cout << "Read G_ROCKETMQ_TAG_TEST:" << G_ROCKETMQ_TAG_TEST << std::endl;
|
||||
std::cout << "Read G_ROCKETMQ_KEY_TEST:" << G_ROCKETMQ_KEY_TEST << std::endl;
|
||||
std::cout << "Read QUEUENUM:" << QUEUENUM << std::endl;
|
||||
std::cout << "Read G_LOG_TOPIC:" << G_LOG_TOPIC << std::endl;
|
||||
std::cout << "Read G_LOG_TAG:" << G_LOG_TAG << std::endl;
|
||||
@@ -6528,7 +6533,7 @@ bool shouldSkipTerminal(const char* terminal_id) {
|
||||
|
||||
void rocketmq_test_300(int mpnum,int front_index,int type) {
|
||||
Ckafka_data_t data;
|
||||
data.strTopic = QString::fromStdString(G_ROCKETMQ_TOPIC);
|
||||
data.strTopic = QString::fromStdString(G_ROCKETMQ_TOPIC_TEST);
|
||||
data.mp_id = "0";
|
||||
|
||||
// 读取文件内容
|
||||
|
||||
Reference in New Issue
Block a user