聯系QQ 3508551694,該資源(本人制作)付費使用,天生就對有償服務反感的人請繞行。
解耦是消息隊列要解決的最本質問題。
所謂解耦,簡單點講就是一個事務,只關心核心的流程。而需要依賴其他系統但不那么重要的事情,有通知即可,無需等待結果。
消息隊列的基本功能之一是進行廣播。
如果下游有很多系統關心你的系統發出的通知的時候,果斷地使用消息隊列吧。
掰開了揉碎了看,最簡單的消息隊列可以做成一個消息轉發器,把一次RPC做成兩次RPC。發送者把消息投遞到服務端,服務端再將消息轉發一手到接收端,就是這么簡單。
RabbitMQ是持久化的MQ。
隨時更新rabbitmq-c最新版本!Debug | Release 版本!一個發送接口 一個接收接口 簡單至極!
持續更新最新rabbitmq-c
Windows VS2010
Linux (CentOS)g++
登錄首頁:
http://localhost:15672/ 如果是異地服務器,需要填寫服務器的IP才能訪問
RabbitMQ服務器隊列
全部資源
百度網盤
最新rabbitmq-c的源碼編譯生成的庫文件
開發者可以直接使用CRabbitMQ類來解決上傳下載,接口更方便好用
升級日志
2017-02-05
Windows下,rabbitmq-c-master中增加了用CMake生成的sln工程
2016-12-29
修改鏈接失敗的內存泄漏問題
2016-07-03
添加全局變量err,及其獲取函數GetErr()
Windows可以編譯32位dll
Linux可以編譯so
發送和接收的示例代碼
#include
#include
#include
#include
#include "MessageQueue/RabbitMQ.h"
#include "MessageQueue/MessageBody.h"
#include
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 message_array;
CMessage message("");
//制作test_send_number個消息,用於發送到RabbitMQ服務器
for (int i=0;i
{
ostringstream oss;
oss<
//這里創建你要發送的數據,放到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<
return ;
}
else
{
cout<
}
//聲明一個交換機,聲明一次,下次不需要再次聲明
if(pro.exchange_declare(my_test_exchange, err) < 0)
{
cout<
return ;
}
else
{
cout<
}
//聲明一個隊列,聲明一次,下次不需要再次聲明
if( (pro.queue_declare(my_test_queue, err) < 0) )
{
cout<
return ;
}
else
{
cout<
}
//將交換機綁定到隊列, 綁定一次,后面不需要再綁定
if( (pro.queue_bind(my_test_queue,my_test_exchange,my_test_bind_key, err)<0) )
{
cout<
return ;
}
else
{
cout<
}
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<
}
else
{
cout<
for (vector::iterator itr = message_array.begin(); itr != message_array.end(); ++itr)
{
cout<
}
}
pro.__sleep(10);
pro.Disconnect();
}
//從RabbitMQ取數據的全部過程如下
void get_message_from_mq(void)
{
vector 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<
return ;
}
else
{
cout<
}
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<
}
else
{
cout<
for (int i=0;i
{
cout<
}
}
pro.__sleep(10);
pro.Disconnect();
}
int main(int ,char**)
{
cout<
//發送消息
send_message_to_mq();
//取消息
get_message_from_mq();
cout<
return 0;
};
Windows運行效果:
Linux運行效果: