Cmakelist.txt之Liunx-rabbitmq

1.cmakelist.txt

复制代码
cmake_minimum_required(VERSION 3.16)
​
project(rabbitmq_linux_test LANGUAGES C)
​
add_library(examples-common OBJECT)
target_sources(examples-common PRIVATE
  utils.h
  utils.c)
if(WIN32)
  target_sources(examples-common PRIVATE win32/platform_utils.c)
else()
  target_sources(examples-common PRIVATE unix/platform_utils.c)
endif()
target_link_libraries(examples-common PRIVATE rabbitmq)
​
add_executable(rabbitmq_linux_test main.c)
​
​
target_link_libraries(rabbitmq_linux_test examples-common rabbitmq)
​
​
include(GNUInstallDirs)
install(TARGETS rabbitmq_linux_test
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
复制代码

2.测试代码

复制代码
// Copyright 2007 - 2021, Alan Antonuk and the rabbitmq-c contributors.
// SPDX-License-Identifier: mit

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <rabbitmq-c/amqp.h>
#include <rabbitmq-c/tcp_socket.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 = (int)(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, status;
    // int rate_limit;
    // int message_count;
    amqp_socket_t *socket = NULL;
    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]);

    char const *hostname = "localhost";// 直接定义主机名,这里假设为localhost
    int port = 5672; // 直接定义端口号,RabbitMQ默认端口是5672
    int rate_limit = 100; // 直接定义速率限制,这里假设为100
    int message_count = 1000; // 直接定义消息数量,这里假设为1000
    int status;

    conn = amqp_new_connection();

    socket = amqp_tcp_socket_new(conn);
    if (!socket) {
        die("creating TCP socket");
    }

    status = amqp_socket_open(socket, hostname, port);
    if (status) {
        die("opening TCP socket");
    }

    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;
}
复制代码

3.结果

相关推荐
回家路上绕了弯1 天前
深入解析Agent Subagent架构:原理、协同逻辑与实战落地指南
分布式·后端
用户8307196840821 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
用户8307196840823 天前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者4 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者6 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧7 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖7 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农7 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者7 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀7 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式