解耦是消息隊列要解決的最本質問題。
所謂解耦,簡單點講就是一個事務,只關心核心的流程。而需要依賴其他系統但不那麼重要的事情,有通知即可,無需等待結果。
如果下游有很多系統關心你的系統發出的通知的時候,果斷地使用消息隊列吧。
掰開了揉碎了看,最簡單的消息隊列可以做成一個消息轉發器,把一次RPC做成兩次RPC。發送者把消息投遞到服務端,服務端再將消息轉發一手到接收端,就是這麼簡單。
多線程版本示例 | RabbitMQ C++客戶端 RabbitMQ Client for Windows 超簡單接收發送接口(多線程版)-最近更新2018-05-21 |
C接口版本示例 | RabbitMQ C 客戶端 超簡單接收發送json接口 |
用戶登錄權限 |
該資源(本人整理製作,知識付費,請尊重勞動者的成果)。需要的話掃描聯繫本文博客頭像
關於服務端的安裝與配置,請參考: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運行效果: