C/C++笔记-使用RabbitMQ的C接口生产数据并消费

目录

 

 

基本概念

代码与实例


 

基本概念

使用C语言接口完成官方的这个模型:

很有意思。感觉开源的东西真的好,不用自己去写C/C++服务端。

p为生产者不经过交换机,直接把数据传给消息队列,c为consumer用于消费。

这种结构在本科生的时候,经常自己写,现在用RabbitMQ来试试

 

 

代码与实例

这里有套Java的代码,其实C接口和Java接口差不多。因为本人C/C++写得多。个人觉得比Java好用,但资料很少。只能慢慢啃官方实例和教程。这一点没有Java快。

Java版链接如下:https://blog.csdn.net/qq78442761/article/details/93045595

C语言版,程序运行如下:

其中RabbitMQ如下:

producter源码:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <amqp.h>
#include <amqp_framing.h>
#include <amqp_tcp_socket.h>
using namespace std;


int main(int *argc, int *argv[]){

	string hostName = "127.0.0.1";
	int port = 5672;
	amqp_socket_t *socket = nullptr;
	amqp_connection_state_t conn;

	conn = amqp_new_connection();
	socket = amqp_tcp_socket_new(conn);

	if(!socket){

		cout << "create socket failed!";
		exit(1);
	}

	if(amqp_socket_open(socket, hostName.c_str(), port)){

		cout << "opening TCP socket failed" << endl;
		exit(1);
	}

	//登录
	if(1 != amqp_login(conn, "/vhost_cff", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "cff", "123").reply_type){

		cout << "login failed" << endl;
	}
	
	//管道

	amqp_channel_open(conn, 1);

	while(1){

		char message[64] = {'\0'};
		cout << "please input the msg: ";
		cin.getline(message, sizeof(message));
		amqp_bytes_t  message_bytes;
		message_bytes.len = sizeof(message);
		message_bytes.bytes = message;

		amqp_basic_publish(conn, 1, amqp_cstring_bytes(""), amqp_cstring_bytes("test_simple_queue"), 0, 0, nullptr, message_bytes);

		cout << "send msg over!" << endl;
	}

	getchar();
	return 0;
}

consumer源码:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <amqp.h>
#include <amqp_framing.h>
#include <amqp_tcp_socket.h>
using namespace std;


int main(int *argc, int *argv[]){

	string hostName = "127.0.0.1";
	int port = 5672;
	amqp_socket_t *socket = nullptr;
	amqp_connection_state_t conn;

	conn = amqp_new_connection();
	socket = amqp_tcp_socket_new(conn);

	if(!socket){

		cout << "create socket failed!";
		exit(1);
	}

	if(amqp_socket_open(socket, hostName.c_str(), port)){

		cout << "opening TCP socket failed" << endl;
		exit(1);
	}

	//登录
	if(1 != amqp_login(conn, "/vhost_cff", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "cff", "123").reply_type){

		cout << "login failed" << endl;
		exit(1);
	}

	amqp_channel_open(conn, 1);
	while(1){

		amqp_basic_consume_ok_t *msg = amqp_basic_consume(conn, 1, amqp_cstring_bytes("test_simple_queue"), amqp_empty_bytes, 0, 1, 0, amqp_empty_table);
		amqp_envelope_t envelope;
		amqp_consume_message(conn, &envelope, NULL, 0);
		cout << "The result is : " << (char *)envelope.message.body.bytes << endl;
	}

	getchar();
	return 0;
}

这里只要把amqp_basic_xxxx中关于交换机和路由key设置为空,就可以直接发送到队列上,不需要经过交换机。也就是官方的这个模型

使用amqp_queue_declare这个函数可以声明一个队列,也就是当RabbitMQ没有队列的时候,会自动生成一个。在本实验中没有用到这个。

总体来说实现功能还是比较简单的,但写好一个程序还是有难度的。

 

源码打包下载:

https://github.com/fengfanchen/CAndCPP/tree/master/SampleRabbitMQ

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT1995

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

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

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

打赏作者

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

抵扣说明:

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

余额充值