RabbitMQ-C初探

RabbitMQ-C使用开发详解(Windows环境) 目录 一、概述 二、编译RabbitMQ-c 三、核心原理 3.1生产者与交换机关系 3.2交换机与队列关系 3.3队列与消费者关系 3.4交换机与交换机的关系 四、开发者 4.1接口文件 4.2交换机 声明交换机 删除交换机 向交换机绑定路由键 从交换机解绑路由键 交换机之间绑定路由键 交换机之间解绑路由键 4.3队列 声明队列 清空队列 删除队列 4.... 阅读详情

http://blog.youkuaiyun.com/cnhome/article/details/9222833

  RabbitMQ着实是个好东西,当然了也有对C语言client开发的支持。例子和文档少的可怜,只能去项目里去查看example来理解,简单整理了一些,以免走些弯路。主要是在版本对应上,这点就没Maven好了,只能对好类库和例子。接下来我们简单看看需要的东东。

环境:Ubuntu 13.04

rabbitmq-server 默认的3.0.2-1

librabbitmq-dev 默认的0.0.1.hg216-1

项目构造用的qmake(这样简单不少)

1 consumer

1.1 consumer.pro的内容

SOURCES=utils.cpp amqp_consumer.cpp platform_utils.cpp

HEADERS=utils.h

VPATH+=/usr/include

CONFIG+=release

TARGET=consumer

LIBS += -lrabbitmq

1.2 amqp_consumer.cpp代码

  这里的代码来自于rabbitmq-c-v0.3.0 具体查看 https://github.com/alanxz/rabbitmq-c/blob/rabbitmq-c-v0.3.0/examples/amqp_consumer.c。(对于几个特殊的宏引用作了调整)

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <stdint.h>

#include <amqp.h>

#include <amqp_framing.h>

#include <assert.h>

#include "utils.h"

#define SUMMARY_EVERY_US 1000000


static void run(amqp_connection_state_t conn)

{

  uint64_t start_time = now_microseconds();

  int received = 0;

  int previous_received = 0;

  uint64_t previous_report_time = start_time;

  uint64_t next_summary_time = start_time + SUMMARY_EVERY_US;

  amqp_frame_t frame;

  int result;

  size_t body_received;

  size_t body_target;

  uint64_t now;


  while (1) {

    now = now_microseconds();

    if (now > next_summary_time) {

      int countOverInterval = received - previous_received;

      double intervalRate = countOverInterval / ((now - previous_report_time) / 1000000.0);

      printf("%d ms: Received %d - %d since last report (%d Hz)\n",

    (int)(now - start_time) / 1000, received, countOverInterval, (int) intervalRate);

      previous_received = received;

      previous_report_time = now;

      next_summary_time += SUMMARY_EVERY_US;

    }

    amqp_maybe_release_buffers(conn);

    result = amqp_simple_wait_frame(conn, &frame);

    if (result < 0)

      return;

    if (frame.frame_type != AMQP_FRAME_METHOD)

      continue;

    if (frame.payload.method.id != AMQP_BASIC_DELIVER_METHOD)

      continue;


    result = amqp_simple_wait_frame(conn, &frame);

    if (result < 0)

      return;

    if (frame.frame_type != AMQP_FRAME_HEADER) {

      fprintf(stderr, "Expected header!");

      abort();

    }

    body_target = frame.payload.properties.body_size;

    body_received = 0;


    while (body_received < body_target) {

      result = amqp_simple_wait_frame(conn, &frame);

      if (result < 0)

        return;

     if (frame.frame_type != AMQP_FRAME_BODY) {

        fprintf(stderr, "Expected body!");

        abort();

      }

      body_received += frame.payload.body_fragment.len;

      assert(body_received <= body_target);

      amqp_dump(frame.payload.body_fragment.bytes,frame.payload.body_fragment.len);

    }

    received++;

  }

}


int main(int argc, char const * const *argv) {

  char const *hostname;

  int port;

  char const *exchange;

  char const *bindingkey;

  int sockfd;

  amqp_connection_state_t conn;

  amqp_bytes_t queuename;


  if (argc < 3) {

    fprintf(stderr, "Usage: amqp_consumer host port\n");

    return 1;

  }

  hostname = argv[1];

  port = atoi(argv[2]);

  exchange = "amq.direct"; /* argv[3]; */

  bindingkey = "test queue"; /* argv[4]; */

  conn = amqp_new_connection();

  die_on_error(sockfd = amqp_open_socket(hostname, port), "Opening socket");

  amqp_set_sockfd(conn, sockfd);

  die_on_amqp_error(amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "guest", "guest"),

   "Logging in");

  amqp_channel_open(conn, 1);

  die_on_amqp_error(amqp_get_rpc_reply(conn), "Opening channel");

  {

    amqp_queue_declare_ok_t *r = amqp_queue_declare(conn, 1, AMQP_EMPTY_BYTES/*amqp_empty_bytes*/, 0, 0, 0, 1,

   AMQP_EMPTY_TABLE/*amqp_empty_table*/);

    die_on_amqp_error(amqp_get_rpc_reply(conn), "Declaring queue");

    queuename = amqp_bytes_malloc_dup(r->queue);

    if (queuename.bytes == NULL) {

      fprintf(stderr, "Out of memory while copying queue name");

      return 1;

    }

  }

  amqp_queue_bind(conn, 1, queuename, amqp_cstring_bytes(exchange), amqp_cstring_bytes(bindingkey),

 AMQP_EMPTY_TABLE/*amqp_empty_table*/);

  die_on_amqp_error(amqp_get_rpc_reply(conn), "Binding queue");

  amqp_basic_consume(conn, 1, queuename, AMQP_EMPTY_BYTES/*amqp_empty_bytes*/, 0, 1, 0, AMQP_EMPTY_TABLE/*amqp_empty_table*/);

  die_on_amqp_error(amqp_get_rpc_reply(conn), "Consuming");

  run(conn);

  die_on_amqp_error(amqp_channel_close(conn, 1, AMQP_REPLY_SUCCESS), "Closing channel");

  die_on_amqp_error(amqp_connection_close(conn, AMQP_REPLY_SUCCESS), "Closing connection");

  die_on_error(amqp_destroy_connection(conn), "Ending connection");

  return 0;

}

2 producer

2.1 producer.pro的内容

SOURCES=utils.cpp amqp_producer.cpp platform_utils.cpp
HEADERS=utils.h
VPATH+=/usr/include 
CONFIG+=release
TARGET=producer
LIBS += -lrabbitmq

2.2 amqp_producer.cpp代码

  这里的代码来自于rabbitmq-c-v0.3.0 具体查看https://github.com/alanxz/rabbitmq-c/blob/rabbitmq-c-v0.3.0/examples/amqp_producer.c。(对于几个特殊的宏引用作了调整)

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <stdint.h>

#include <amqp.h>

#include <amqp_framing.h>

#include "utils.h"

#define SUMMARY_EVERY_US 1000000


static void send_batch(amqp_connection_state_t conn,

      char const *queue_name,

      int rate_limit,

      int message_count)

{

  uint64_t start_time = now_microseconds();

  int i;

  int sent = 0;

  int previous_sent = 0;

  uint64_t previous_report_time = start_time;

  uint64_t next_summary_time = start_time + SUMMARY_EVERY_US;

  char message[256];

  amqp_bytes_t message_bytes;


  for (i = 0; i < (int)sizeof(message); i++) {

    message[i] = i & 0xff;

  }

  message_bytes.len = sizeof(message);

  message_bytes.bytes = message;

  for (i = 0; i < message_count; i++) {

    uint64_t now = now_microseconds();

    die_on_error(amqp_basic_publish(conn,1,amqp_cstring_bytes("amq.direct"),amqp_cstring_bytes(queue_name),

      0,0,NULL,message_bytes),"Publishing");

    sent++;

    if (now > next_summary_time) {

      int countOverInterval = sent - previous_sent;

      double intervalRate = countOverInterval / ((now - previous_report_time) / 1000000.0);

      printf("%d ms: Sent %d - %d since last report (%d Hz)\n",(int)(now - start_time) / 1000, sent,

         countOverInterval, (int) intervalRate);

      previous_sent = sent;

      previous_report_time = now;

      next_summary_time += SUMMARY_EVERY_US;

    }

    while (((i * 1000000.0) / (now - start_time)) > rate_limit) {

      microsleep(2000);

      now = now_microseconds();

    }

  }

  {

    uint64_t stop_time = now_microseconds();

    int total_delta = stop_time - start_time;

    printf("PRODUCER - Message count: %d\n", message_count);

    printf("Total time, milliseconds: %d\n", total_delta / 1000);

    printf("Overall messages-per-second: %g\n", (message_count / (total_delta / 1000000.0)));

  }

}


int main(int argc, char const * const *argv) {

  char const *hostname;

  int port;

  int rate_limit;

  int message_count;

 int sockfd;

  amqp_connection_state_t conn;

  if (argc < 5) {

    fprintf(stderr, "Usage: amqp_producer host port rate_limit message_count\n");

    return 1;

  }

  hostname = argv[1];

  port = atoi(argv[2]);

  rate_limit = atoi(argv[3]);

  message_count = atoi(argv[4]);

  conn = amqp_new_connection();

  die_on_error(sockfd = amqp_open_socket(hostname, port), "Opening socket");

  amqp_set_sockfd(conn, sockfd);

  die_on_amqp_error(amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "guest", "guest"),

   "Logging in");

  amqp_channel_open(conn, 1);

  die_on_amqp_error(amqp_get_rpc_reply(conn), "Opening channel");

  send_batch(conn, "test queue", rate_limit, message_count);

  die_on_amqp_error(amqp_channel_close(conn, 1, AMQP_REPLY_SUCCESS), "Closing channel");

  die_on_amqp_error(amqp_connection_close(conn, AMQP_REPLY_SUCCESS), "Closing connection");

  die_on_error(amqp_destroy_connection(conn), "Ending connection");

  return 0;

}

RabbitMQ C 客户端收发数据实例解析 rabbitmq-c客户端,github地址:https://github.com/alanxz/rabbitmq-c rabbitmq-c是一个C语言操作的AMQP客户端库,用来与RabbitMQ broker进行交互 Building and installing: 需要:CMake2.6或以上版本 1、下载安装包后解压,进入主目录, 2、mkdir build && cd build 3、cmake .. 4、cmake --build . 完成后,build目录下会出现librab 阅读详情

相关推荐

基于rabbitmq-c的Rabbitmq C++客户端的实现

基于rabbitmq-c的Rabbitmq C++ Client 仅做记录,后续有问题再修改。

庄生晓梦 3767

rabbitmq-c初探

RabbitMQ着实是个好东西,当然了也有对C语言client开发的支持。例子和文档少的可怜,只能去项目里去查看example来理解,简单整理了一些,以免走些弯路。主要是在版本对应上,这点就没Maven好了,只能对好类库和例子。 接下来我们简单看看需要的东东。 环境:Ubuntu 13.04 rabbitmq-server 默认的3.0.2-1 librabbitmq-dev 默认

cnhome的专栏 4032

Linux下RabbitMQ-C 安装说明

具体安装说明如下: 1. 安装 boost 下载地址:https://dl.bintray.com/boostorg/release/1.70.0/source/ 选择版本:boost_1_70_0.tar.gz tar -xzvf boost_1_70_0.tar.gz cd boost_1_70_0 ./bootstrap.sh ./bjam 2. 安装rabbitmq-c ...

CVer 5126

Rabbitmq-C 的简单使用(一) -- 准备工作和一个demo

https://blog.youkuaiyun.com/qq_17812167/article/details/75557115 参考此篇文章可以使用cmake编译出 lib文件和dll文件 https://blog.youkuaiyun.com/weixin_42148156/article/details/108534941#comments_14303134 这篇是我自己使用mqtt客户端写的,里面有使用cmake的步骤 上班排查公司的bug,最后发现是客户端接收mq的错误,还是别的同事帮忙检查的...

lizequan的博客 5673

在 Ubuntu 下使用 rabbitmq-c 库进行 RabbitMQ 消息收发的完整示例代码如下

消费者标签 (consumer_tag): 如果你希望手动设置消费者标签,可以传入一个非空的 amqp_bytes_t 对象作为 consumer_tag 参数。要订阅的队列名称,使用 amqp_cstring_bytes(QUEUE_NAME) 将队列名转换为 amqp_bytes_t 类型。一般可以传入 amqp_empty_bytes 表示不需要特定的消费者标签,由服务器自动生成。envelope.message.body.len 表示消息体的长度,通常是一个整数值,表示消息体的字节数。

jjjxxxhhh123的博客 1055

RabbitMQ C API 实现 RPC 通信实例

本文介绍了如何使用RabbitMQ的C API实现RPC(远程过程调用)功能。RPC允许程序调用远程服务,如同调用本地函数一样简单,具有异步通信、解耦合、负载均衡等优势。文章详细说明了环境搭建步骤,包括启动RabbitMQ服务和安装rabbitmq-c库。核心部分展示了服务端代码实现,通过监听请求队列、处理请求并返回响应来完成RPC调用。服务端代码涵盖了连接建立、队列声明、消息消费和响应发送等关键流程,并加入了错误处理和信号机制确保可靠性。该实例为C语言开发者提供了RabbitMQ实现分布式通信的完整参考方

Hi20240217的博客 1041

Windows下RabbitMQ安装及C/C++版客户端Rabbitmq-c库编译

RabbitMQ Windows安装 1. 安装Erlang 由于RabbitMQ是由Erlang语言编写的,因此需要先安装Erlang的环境 Erlang的安装包:https://www.erlang.org/downloads 直接按默认安装即可,无需更改配置,安装过程如下: 2. 下载RabbitMQ安装包 下载地址: https://www.rabbitmq.com/ins...

tianzhiyi1989sq的博客 5746

移植rabbitMQ-C

按照文档README.md的说法建立  mkdir build cd build cmake .. 然后修改CMakeCach.txt,根据编译链的实际情况,以及调试过程中需要的库,做出修改,其中红色部分是需要修改的地方。 # This is the CMakeCache file. # For build in directory: /rabbitmq-c-arm2/build #

virlhs的专栏 3145

Rabbitmq C++客户端(基于rabbitmq-c)

    最近项目使用了rabbitmq消息队列,需要基于rabbitmq-c(https://github.com/alanxz/rabbitmq-c)进行一层封装,然后根据官方自带示例以及网上代码整理了一下。    发送者需要声明exchange,并指定routekey进行数据发送;消费者需要声明一个Queue并绑定exchange和routekey,进行数据接收。RabbitmqClient头...

LT_lover的专栏 2万+

基于STM32的宠物智能照护嵌入式系统设计

嵌入式系统是实现物联网终端设备本地化感知、决策与执行的核心技术载体,其关键在于多传感器融合、低功耗执行控制与轻量级云边协同。本文围绕环境监测(温湿度、烟雾、余粮)、机电执行(步进电机食盘、继电器风扇)和可靠通信(MQTT+ESP8266)三大技术主线,深入解析STM32F103在资源约束下的外设调度策略、ADC采样抗干扰设计、DHT11时序精准控制及HX711称重滤波算法等工程实践要点。系统强调本地闭环优先原则,确保离线基础功能可用,同时通过阿里云IoT平台实现远程监控与告警联动,为中小型智能硬件项目提供可

weixin_29155599的博客 292

facebook协议

支持同时登录多个Facebook账号,按照关键词采集小组地址,群发小组,批量添加推荐人,群发推 荐人消息,采集个人Facebook用户,群发用户私信,群发主页评论。通过客服台管理功能,和粉丝互动聊天,通过话术快捷回复,自动翻译聊天记录。通过FaceBook小组采集小组成员id,或者通过FaceBook个人主页,采集主页上粉丝批量操作已FaceBook账号添加推荐热,可以指定添加某个国家的推荐人,可以设置每个账号添加推荐人个数去重模式:所有的FaceBook账号不添加重复的推荐人。

2503_90751938的博客 952

Windows c++中RabbitMQ-c特殊消息队列的保姆教程

RabbitMQ-c 从安装到c++客户端项目实战 实现需求: c++项目实现RabbitMQ客户端与客户服务端交互数据,MES信息传输。 # 1.安装RabbitMQ 此处只表示Windows10下的安装,其他Linux之类的安装请搜寻其他资料。 开发工具 visual studio 2015 cmake 3.21.3工具下载网址没有版本要求 RabbitMQ Windows版本地服务器 #(1)RabbitMQ服务器安装 RabbitMQ是要依赖Erlang的,安装之前先装Erlang。 Erlang下

qq_41876419的博客 5328

MATLAB不能识别已安装的visual studio 2015解决方法

首先,对于MATLAB识别已经安装的vs版本通过命令: mex -setup 下图为本电脑下同时安装的两个visual studio 如果搞清楚MATLAB识别电脑上安装vs的过程,可通过命令: mex -setup -v MATLAB输出识别编译器的整个过程。其中HKLM和HKCU分别是注册表中的HKEY_CURRENT_USER,HKEY_LOCAL_MA…的缩写,MATLAB没有找到对应编译器是由于注册表里没有对应信息(主要是文件路径,C++编译器的路径),或者在注册表里存在该信息,但是找不到

qq_36320710的博客 4895

RabbitMQ笔记-使用rabbitmq-c让生产者发送数据

目录 环境 下载地址 过程 环境 RabbitMQ和Erlang的版本如下: rabbitmq-c的版本 下载地址 RabbitMQ下载地址: https://www.rabbitmq.com/download.html 这里注意RabbitMQ 3.6.5的对应的Erlang的版本注意是19.X,不然web管控台插件会安装不上 rabb...

IT1995的博客 5950

SAP FICO 消息号 FAA_POST042 技术清算科目中的余额:分类账 0L,货币 00、RMB、10000.00-

SAP FICO 消息号 FAA_POST042 技术清算科目中的余额:分类账 0L,货币 00、RMB、10000.00-

我好像病了的博客 2138

【python】import pandas as pd用法

是 Python 里最常用的数据分析库之一。 的意思是:导入 pandas 库,并给它起个别名 。这样用起来更简洁: 下面总结 pandas 的常见用法(配例子)。目录🔹 1. 数据结构(1) Series(一维数据,类似于数组 + 标签)(2) DataFrame(二维数据表,类似于 Excel 表格)🔹 2. 数据读写🔹 3. 数据查看🔹 4. 数据选择与索引🔹 5. 数据清洗🔹 6. 数据运算🔹 7. 数据筛选(布尔索引)🔹 8. 分组与聚合🔹 9. 排序 Pandas 常用方

2401_86285609的博客 1530

Windows下编译RabbitMQ-C

一、前言 由于项目需要用的rabbitmq的c/c++客户端,所以尝试编译rabbitmq-c(注:我的机器是Windows7旗舰版,编译环境是VS2010)。 二、准备工作 下载 rabbitmq-c 源码包 http://hg.rabbitmq.com/rabbitmq-c/下载 rabbitmq-codegen 源码包 http://hg.rabbitmq.com/rabbitmq

獠的专栏 3676

RK3568-适配phy芯片ip101gri

复位时间查阅数据手册。

Paper_Love的博客 2643

Qt中使用RabbitMQ-c(一):使用CMake + MinGW编译RabbitMQ-c

Qt中使用RabbitMQ-c,使用CMake + MinGW编译RabbitMQ-c

zjzytnn的博客 6224

AgentScope Java 入门:Spring AI Alibaba 与 AgentScope 的定位与区别

摘要:Spring AI Alibaba是阿里基于Spring AI开发的本地化AI应用框架,旨在服务Java开发者。它提供模型接入、函数调用、RAG等功能,并与阿里云基础设施深度集成。同时,阿里开源了多智能体框架AgentScope,其Java版(AgentScope-Java)专注于Agentic设计理念。两者将协同发展:Spring AI Alibaba侧重Spring生态集成,AgentScope-Java强化智能体能力。未来计划包括支持AgentScope、升级Admin平台,以及推进Server

SmartSi 1528

python基础之语言发展历史

博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏。 目录一、前言二、发展历史1、Python是一种面向对象的解释型编程语言2、Python常被称为胶水语言3、Python由Guido开发4、Python连续多年入选编程语言TOP105、Python的发展历史三、总结 一、前言   由于Python语言的简洁性、易读性以及可扩展性,它在网络爬虫、数据分析、.

jiankang66的博客 3348

RabbitMQ的服务端和客户端RabbitMQ-c的简单使用。

1 安装openssl依赖。 apt-get install libssl-dev 2 安装 rabbitmq-c和 git clone https://github.com/alanxz/rabbitmq-c cd rabbitmq-c git clone https://github.com/rabbitmq/rabbitmq-codegen.git mv rabbi...

jenie的专栏 2331

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

目录 基本概念 代码与实例 基本概念 使用C语言接口完成官方的这个模型: 很有意思。感觉开源的东西真的好,不用自己去写C/C++服务端。 p为生产者不经过交换机,直接把数据传给消息队列,c为consumer用于消费。 这种结构在本科生的时候,经常自己写,现在用RabbitMQ来试试 代码与实例 这里有套Java的代码,其实C接口和Java接口差不...

IT1995的博客 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: Windows下编译SimpleAmqpClient
下一篇: Running a distribution (ARM EABI) Ubuntu at BeagleBoard
獠
獠
博客等级 码龄16年 43粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值