RabbitMQ C++客戶端 RabbitMQ Client for Windows/Linux 超簡單接收發送接口-最近更新2019-09-06

消息隊列設計精要

解耦是消息隊列要解決的最本質問題。
所謂解耦,簡單點講就是一個事務,只關心核心的流程。而需要依賴其他系統但不那麼重要的事情,有通知即可,無需等待結果。

如果下游有很多系統關心你的系統發出的通知的時候,果斷地使用消息隊列吧。

掰開了揉碎了看,最簡單的消息隊列可以做成一個消息轉發器,把一次RPC做成兩次RPC。發送者把消息投遞到服務端,服務端再將消息轉發一手到接收端,就是這麼簡單。

多線程版本示例 RabbitMQ C++客戶端 RabbitMQ Client for Windows 超簡單接收發送接口(多線程版)-最近更新2018-05-21
C接口版本示例 RabbitMQ C 客戶端 超簡單接收發送json接口
用戶登錄權限

rabbitmq的web管理界面無法使用guest用戶登錄

該資源(本人整理製作,知識付費,請尊重勞動者的成果)。需要的話掃描聯繫本文博客頭像

關於服務端的安裝與配置,請參考:Windows RabbitMQ服務端安裝與配置詳解 


消息隊列的基本功能之一是進行廣播。

RabbitMQ是持久化的MQ。

隨時更新rabbitmq-c最新版本!Debug | Release 版本!一個發送接口 一個接收接口 簡單至極!

持續更新最新rabbitmq-c

最近更新:

2019-09-06

測試結果:

(1)每次先建立連接,1秒鐘發送110次,每次發送100條message,發送完1次斷開連接,1秒發送1w條記錄

(2)第一次建立連接,連接建立後重復調用publish發送,每次發送100條記錄,不斷開連接,平均每秒發送4.2w條記錄

2019-03-23 支持到VS2015 Win23/x64/Release/Debug 使用最新的CMake
2018-05-02 周**的項目中連接失敗發現內存泄漏,經過我跟蹤發現上次的修改有BUG,現在已經改好,不再有內存泄漏。
2017-09-06 熱心網友“『路遙』”修改了兩種類型的內存泄漏
2017-02-05 Windows下,rabbitmq-c-master中增加了用CMake生成的sln工程
2016-12-29 修改鏈接失敗的內存泄漏問題
2016-07-03 添加全局變量err,及其獲取函數GetErr();Windows可以編譯32位dll ;Linux可以編譯so

Windows VS2017  

登錄首頁:

http://localhost:15672/    如果是異地服務器,需要填寫服務器的IP才能訪問

RabbitMQ服務器隊列

全部資源

百度網盤

 

 

最新rabbitmq-c的源碼編譯生成的庫文件

開發者可以直接使用CRabbitMQ類來解決上傳下載,接口更方便好用

發送和接收的示例代碼

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include "MessageQueue/RabbitMQ.h"
#include "MessageQueue/MessageBody.h"
#include <ctime>
using namespace std;


//--------------------------需要開發者自己填寫的信息begin--------------------------------------
//服務端的一個Exchange,客戶端發送的時候,如果沒有則會創建;客戶端取的時候,如果沒有則取不到數據
CExchange my_test_exchange("MyTestExchange");
//服務端的一個消息隊列,客戶端發送的時候,如果沒有則會創建;客戶端取的時候,如果沒有則取不到數據
CQueue my_test_queue("MyTestQueue");
//服務端Exchange與消息隊列之間的綁定key,客戶端發送的時候,如果沒有則不能發送;客戶端取的時候,如果沒有則取不到數據
string my_test_bind_key("MyTestBindKey");
//RabbitMQ服務端IP
string rabbitmq_server_ip = "127.0.0.1";
//RabbitMQ服務端端口
int rabbitmq_server_port = 5672;
//RabbitMQ服務端登錄用戶名
string rabbitmq_server_user = "guest";
//RabbitMQ服務端登錄密碼
string rabbitmq_server_psw = "guest";
//--------------------------需要開發者自己填寫的信息end--------------------------------------


//--------------------------建議開發者設置批量操作begin--------------------------------------
//建議將此值設置成500,或者1000.這樣可以節省時間和網絡資源。沒有必要一條一條的發送或者取
int test_send_number = 10;
//--------------------------建議開發者設置批量操作end--------------------------------------
//引用全局變量

//發送數據到RabbitMQ服務的全部過程如下
void send_message_to_mq(void)
{
		vector<CMessage> message_array;
		CMessage message("");
		//製作test_send_number個消息,用於發送到RabbitMQ服務器
		for (int i=0;i<test_send_number;++i)
		{
			ostringstream oss;
			oss<<i;
			//這裏創建你要發送的數據,放到CMessage的m_data成員變量中,從服務端取的時候也是一樣從這個成員中取string
			message.m_data = "Hello"+oss.str();
			message_array.push_back(message);
		}
		string& err = GetErr();    
		//RabbitMQ服務器的連接信息,這裏改成你自己的IP/PORT
		CRabbitMQ pro(rabbitmq_server_ip,rabbitmq_server_port,rabbitmq_server_user,rabbitmq_server_psw);

		if(pro.Connect(err)<0)
		{
			cout<<"連接失敗!"<<endl;
			return ;
		}
		else
		{
			cout<<"連接成功!"<<endl;
		}

		//聲明一個交換機,聲明一次,下次不需要再次聲明
		if(pro.exchange_declare(my_test_exchange, err) < 0)
		{
			cout<<"聲明交換機失敗!"<<endl;
			return ;
		}
		else
		{
			cout<<"聲明交換機成功!"<<endl;
		}
		//聲明一個隊列,聲明一次,下次不需要再次聲明
		if( (pro.queue_declare(my_test_queue, err) < 0) ) 
		{
			cout<<"聲明隊列失敗!"<<endl;
			return ;
		}
		else
		{
			cout<<"聲明隊列成功!"<<endl;
		}
		//將交換機綁定到隊列, 綁定一次,後面不需要再綁定
		if( (pro.queue_bind(my_test_queue,my_test_exchange,my_test_bind_key, err)<0) ) 
		{
			cout<<"綁定隊列失敗!"<<endl;
			return ;
		}
		else
		{
			cout<<"綁定隊列成功!"<<endl;
		}
		string my_test_root_key=my_test_bind_key;
		//發送數據到RabbitMQ服務器,可以反覆調用從而實現連續發送數據
		int flag = pro.publish(message_array,my_test_root_key,err);

		if(flag<0)
		{
			cout<<"投遞消息到MQ失敗"<<endl;
		}
		else
		{
			cout<<"投遞消息到MQ成功"<<endl;
			for (vector<CMessage>::iterator itr = message_array.begin(); itr != message_array.end(); ++itr)
			{
				cout<<"投遞了:"<<(*itr).m_data<<endl;
			}
		}
		pro.__sleep(10);
		pro.Disconnect();
}
//從RabbitMQ取數據的全部過程如下
void get_message_from_mq(void)
{
		vector<CMessage> message_array;
		string& err = GetErr();    

		//RabbitMQ服務器的連接信息,這裏改成你自己的IP/PORT
		CRabbitMQ pro(rabbitmq_server_ip,rabbitmq_server_port,rabbitmq_server_user,rabbitmq_server_psw);

		if(pro.Connect(err)<0)
		{
			cout<<"取消息時連接失敗!"<<endl;
			return ;
		}
		else
		{
			cout<<"取消息時連接成功!"<<endl;
		}
		message_array.clear();
		//一次性取1000個消息,不足1000也無妨,有多少取到多少
		int get_number= test_send_number;
		::timeval tvb={0,10};
		//從RabbitMQ服務器取消息
		if(pro.consumer(my_test_queue,message_array,get_number,&tvb,err)<0)
		{
			cout<<"取消息失敗!"<<endl;
		}
		else
		{
			cout<<"取消息成功!取到了"<<message_array.size()<<"個消息"<<endl;
			for (int i=0;i<message_array.size();i++)
			{
				cout<<"取到的消息:"<<message_array[i].m_data<<endl;
			}
		}
		pro.__sleep(10);
		pro.Disconnect();
}

int main(int ,char**)
{
	cout<<"Hello UseMQ!"<<endl;
	//發送消息
	send_message_to_mq();
	//取消息
	get_message_from_mq();
	cout<<"Hello UseMQ end!";
	return 0;
};

 

Windows運行效果:

 

Linux運行效果:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章