RabbitMQ C++客户端 RabbitMQ Client for Windows 超简单接收发送接口(多线程版)-最近更新2018-05-21

该库特点:

该接口本身不支持多线程,也就是说多个线程不能同时访问一个接口对象。

支持多线程:

但是,由于该接口是值语义,所以在多线程场景中使用没有任何问题。

下面的例子就展示了多线程环境下程序的Demo和结果。

要完成的功能:

1 A线程发送0-99这一百个整数到RabbitMQ队列;

2 同时B线程发送0-99这一百个整数到RabbitMQ队列;

3 C线程(一秒钟之后)一次性取回来A B发送的所有数据;

4 D线程(两秒之后)检查C线程取回的数据是否完整

如有需要:扫码我的博客头像加我即可(还是要先说明一下,该资源时付费资源)

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

//--------------------------需要开发者自己填写的信息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 = "localhost";
//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 = 100;
int test_get_number = 200;
//--------------------------建议开发者设置批量操作end--------------------------------------
//引用全局变量
std::multiset<int> MySet;
//发送数据到RabbitMQ服务的全部过程如下:
//!!!每次publish之前必须调用Connect,publish之后调用Disconnect!!!
DWORD WINAPI  send_message_to_mq(LPVOID lpParameter)
{
	vector<CMessage> message_array;
	CMessage message("");
	//制作test_send_number个消息,用于发送到RabbitMQ服务器
	for (int i=0;i<test_send_number;++i)
	{
		//这里创建你要发送的数据,放到CMessage的m_data成员变量中,从服务端取的时候也是一样从这个成员中取string
		message.m_data = std::to_string((long long)i);
		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 -1;
	}
	else
	{
		cout<<"连接成功!"<<endl;
	}

	//声明一个交换机,声明一次,下次不需要再次声明
	if(pro.exchange_declare(my_test_exchange, err) < 0)
	{
		cout<<"声明交换机失败!"<<endl;
		return -1;
	}
	else
	{
		cout<<"声明交换机成功!"<<endl;
	}
	//声明一个队列,声明一次,下次不需要再次声明
	if( (pro.queue_declare(my_test_queue, err) < 0) ) 
	{
		cout<<"声明队列失败!"<<endl;
		return -1;
	}
	else
	{
		cout<<"声明队列成功!"<<endl;
	}
	//将交换机绑定到队列, 绑定一次,后面不需要再绑定
	if( (pro.queue_bind(my_test_queue,my_test_exchange,my_test_bind_key, err)<0) ) 
	{
		cout<<"绑定队列失败!"<<endl;
		return -1;
	}
	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<<" ";
		}
		cout<<endl;
	}
	pro.__sleep(10);
	pro.Disconnect();

	return 0;
}
//从RabbitMQ取数据的全部过程如下
//!!!每次consumer之前必须调用Connect,publish之后调用Disconnect!!!
DWORD WINAPI   get_message_from_mq(LPVOID lpParameter)
{
	vector<CMessage> message_array;
	string& err = GetErr();    

	//RabbitMQ服务器的连接信息,这里改成你自己的IP/PORT
	CRabbitMQ pro(rabbitmq_server_ip,rabbitmq_server_port,rabbitmq_server_user,rabbitmq_server_psw);
	pro.__sleep(1000);//等待生产者发送完毕再取
	if(pro.Connect(err)<0)
	{
		cout<<"取消息时连接失败!"<<endl;
		return -1;
	}
	else
	{
		cout<<"取消息时连接成功!"<<endl;
	}
	message_array.clear();
	//一次性取1000個消息,不足1000也无妨,有多少取到多少
	int get_number= test_get_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<<" ";
			MySet.insert(std::stoi(message_array[i].m_data));
		}
		cout<<endl;
	}
	pro.__sleep(10);
	pro.Disconnect();
}
DWORD WINAPI   test_assert_success(LPVOID lpParameter)
{
	CRabbitMQ pro;
	pro.__sleep(2000);
	cout<<"全部数据(验证是否丢失):"<<endl;
	for (auto itr = MySet.begin(); itr != MySet.end(); ++itr)
	{
		cout<<*itr<<" ";
	}
	cout<<endl;
	return 0;
}
int main(int ,char**)
{
	cout<<"Hello UseMQ!"<<endl;

	//创建线程  
	HANDLE t1 = CreateThread(NULL, 0, send_message_to_mq, 0, 0, NULL);  
	HANDLE t2 = CreateThread(NULL, 0, send_message_to_mq, 0, 0, NULL); 

	HANDLE t3 = CreateThread(NULL, 0, get_message_from_mq, 0, 0, NULL); 

	HANDLE t4 = CreateThread(NULL, 0, test_assert_success, 0, 0, NULL); 
	//发送消息
	//send_message_to_mq();
	//取消息
	//get_message_from_mq();

	//等待线程退出  
	WaitForSingleObject(t1, INFINITE);  
	WaitForSingleObject(t2, INFINITE);  
	WaitForSingleObject(t3, INFINITE);  
	WaitForSingleObject(t4, INFINITE);  

	cout<<"Hello UseMQ end!";
	return 0;
};

运行验证结果:


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值