raabitmq-c:amqp_basic_consume之no_ack

本文讨论了RabbitMQ中的no_ack参数对消息确认的影响。当no_ack设置为true时,消息队列会在接收到TCPACK后自动删除,但不保证消息处理;若设置为false,则需要手动发送Basic.Ack以确保消息成功处理,否则可能导致预设条件失败错误。

 no_ack参数代表后续是否需要发送Basic.Ack(代码中调用amqp_basic_ack)。

如果no_ack为true,那么后续不会发送Basic.Ack(调用amqp_basic_ack),mq服务在收到tcp的ack后,即可删除消息队列,不保证消息是否处理成功。

如果no_ack为false,那么后续需要发送Basic.Ack(调用amqp_basic_ack),mq服务在收到Basic.Ack才会删除队列消息,保证消息处理成功。

如果 no_ack为true,同时发送Basic.Ack(调用amqp_basic_ack),会出PRECONDITION_FAILED - unknown delivery tag 1的错误

参照:【原创】RabbitMQ 之 no_ack 分析-阿里云开发者社区 (aliyun.com)

(406, 'PRECONDITION_FAILED - unknown delivery tag 1') Rabbitmq-优快云博客

修改后 cmake_minimum_required(VERSION 3.31) project(amqp_c_sdk LANGUAGES C) set(CMAKE_C_STANDARD 11) # 设定构建运行路径,避免污染根目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/.archive) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/.library) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/.runtime) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/.runtime) set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/.library) ## 查找并导入库 #find_package(CURL CONFIG REQUIRED) #find_package(rabbitmq-c CONFIG REQUIRED) #find_package(json-c CONFIG REQUIRED) # 查找并导入库 find_package(CURL CONFIG REQUIRED) find_package(rabbitmq-c CONFIG REQUIRED) find_package(json-c CONFIG REQUIRED) find_package(OpenSSL REQUIRED) include_directories(${PROJECT_SOURCE_DIR}/src) include_directories(${CURL_INCLUDE_DIRS}) include_directories(${RABBITMQ-C_INCLUDE_DIRS}) include_directories(${JSONC_INCLUDE_DIRS}) include_directories(${OPENSSL_INCLUDE_DIR}) # 收集所有源文件 file(GLOB_RECURSE SOURCES "src/*.c") # 添加一个可执行文件,包含所有源文件 add_executable(amqp_c_sdk ${SOURCES}) ## 遍历项目src目录下所有的 .c 文件,自动添加 #file(GLOB_RECURSE files src/**.c src/**.cpp) #foreach (file ${files}) # 遍历所有发现的文件 # get_filename_component(name ${file} NAME) # 获取文件名 ## add_library(${name} SHARED ${file}) # 添加可执行文件 # add_executable(${name} ${file}) # 添加可执行文件 #endforeach () # 遍历结束 # 链接库 #target_link_libraries(${name}) # 链接库 target_link_libraries(amqp_c_sdk PRIVATE ${JSON_C_LIBRARIES} ${RABBITMQ_C_LIBRARIES} ${CURL_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto rpcrt4 ) 程序运行日志 ====================[ 构建 | amqp_c_sdk | Debug-Visual Studio ]=================== "D:\Program Files\JetBrains\CLion 2025.1.3\bin\cmake\win\x64\bin\cmake.exe" --build D:\work\code\CLionProjects\amqp-c-sdk\cmake-build-debug-visual-studio --target amqp_c_sdk -j 14 [1/5] Building C object CMakeFiles\amqp_c_sdk.dir\src\main.c.obj warning: amqp.h is deprecated, use rabbitmq-c/amqp.h instead. warning: amqp_tcp_socket.h is deprecated, use rabbitmq-c/tcp_socket.h instead. [2/5] Building C object CMakeFiles\amqp_c_sdk.dir\src\sdk_init_info_vo.c.obj [3/5] Building C object CMakeFiles\amqp_c_sdk.dir\src\sdk_init_info_dto.c.obj [4/5] Building C object CMakeFiles\amqp_c_sdk.dir\src\http.c.obj [5/5] Linking C executable D:\work\code\CLionProjects\amqp-c-sdk\.runtime\amqp_c_sdk.exe FAILED: D:/work/code/CLionProjects/amqp-c-sdk/.runtime/amqp_c_sdk.exe C:\WINDOWS\system32\cmd.exe /C "cd . && "D:\Program Files\JetBrains\CLion 2025.1.3\bin\cmake\win\x64\bin\cmake.exe" -E vs_link_exe --msvc-ver=1944 --intdir=CMakeFiles\amqp_c_sdk.dir --rc=D:\WINDOW~1\10\bin\100261~1.0\x64\rc.exe --mt=D:\WINDOW~1\10\bin\100261~1.0\x64\mt.exe --manifests -- D:\PROGRA~2\MICROS~1\2022\COMMUN~1\VC\Tools\MSVC\1444~1.352\bin\Hostx64\x64\link.exe /nologo CMakeFiles\amqp_c_sdk.dir\src\http.c.obj CMakeFiles\amqp_c_sdk.dir\src\main.c.obj CMakeFiles\amqp_c_sdk.dir\src\rabbitmq.c.obj CMakeFiles\amqp_c_sdk.dir\src\sdk_init_info_dto.c.obj CMakeFiles\amqp_c_sdk.dir\src\sdk_init_info_vo.c.obj CMakeFiles\amqp_c_sdk.dir\src\signature_utils.c.obj CMakeFiles\amqp_c_sdk.dir\src\url_utils.c.obj /out:D:\work\code\CLionProjects\amqp-c-sdk\.runtime\amqp_c_sdk.exe /implib:D:\work\code\CLionProjects\amqp-c-sdk\.archive\amqp_c_sdk.lib /pdb:D:\work\code\CLionProjects\amqp-c-sdk\.runtime\amqp_c_sdk.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console D:\work\soft\clion\.vcpkg-clion\vcpkg\installed\x64-windows\debug\lib\libcurl-d.lib D:\work\soft\clion\.vcpkg-clion\vcpkg\installed\x64-windows\debug\lib\libssl.lib D:\work\soft\clion\.vcpkg-clion\vcpkg\installed\x64-windows\debug\lib\libcrypto.lib rpcrt4.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && C:\WINDOWS\system32\cmd.exe /C "cd /D D:\work\code\CLionProjects\amqp-c-sdk\cmake-build-debug-visual-studio && C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -executionpolicy Bypass -file D:/work/soft/clion/.vcpkg-clion/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary D:/work/code/CLionProjects/amqp-c-sdk/.runtime/amqp_c_sdk.exe -installedDir D:/work/soft/clion/.vcpkg-clion/vcpkg/installed/x64-windows/debug/bin -OutVariable out"" LINK Pass 1: command "D:\PROGRA~2\MICROS~1\2022\COMMUN~1\VC\Tools\MSVC\1444~1.352\bin\Hostx64\x64\link.exe /nologo CMakeFiles\amqp_c_sdk.dir\src\http.c.obj CMakeFiles\amqp_c_sdk.dir\src\main.c.obj CMakeFiles\amqp_c_sdk.dir\src\rabbitmq.c.obj CMakeFiles\amqp_c_sdk.dir\src\sdk_init_info_dto.c.obj CMakeFiles\amqp_c_sdk.dir\src\sdk_init_info_vo.c.obj CMakeFiles\amqp_c_sdk.dir\src\signature_utils.c.obj CMakeFiles\amqp_c_sdk.dir\src\url_utils.c.obj /out:D:\work\code\CLionProjects\amqp-c-sdk\.runtime\amqp_c_sdk.exe /implib:D:\work\code\CLionProjects\amqp-c-sdk\.archive\amqp_c_sdk.lib /pdb:D:\work\code\CLionProjects\amqp-c-sdk\.runtime\amqp_c_sdk.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console D:\work\soft\clion\.vcpkg-clion\vcpkg\installed\x64-windows\debug\lib\libcurl-d.lib D:\work\soft\clion\.vcpkg-clion\vcpkg\installed\x64-windows\debug\lib\libssl.lib D:\work\soft\clion\.vcpkg-clion\vcpkg\installed\x64-windows\debug\lib\libcrypto.lib rpcrt4.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\amqp_c_sdk.dir/intermediate.manifest CMakeFiles\amqp_c_sdk.dir/manifest.res" failed (exit code 1120) with the following output: http.c.obj : error LNK2019: 无法解析的外部符号 json_object_put,函数 parse_json_response 中引用了该符号 http.c.obj : error LNK2019: 无法解析的外部符号 json_object_object_get,函数 parse_json_response 中引用了该符号 http.c.obj : error LNK2019: 无法解析的外部符号 json_object_get_int,函数 parse_json_response 中引用了该符号 http.c.obj : error LNK2019: 无法解析的外部符号 json_object_get_string,函数 parse_json_response 中引用了该符号 http.c.obj : error LNK2019: 无法解析的外部符号 json_tokener_parse,函数 parse_json_response 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_channel_open,函数 rabbitmq_connect 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_basic_consume,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_cstring_bytes,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_new_connection,函数 rabbitmq_connect 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_destroy_connection,函数 rabbitmq_close 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_maybe_release_buffers,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_get_rpc_reply,函数 rabbitmq_connect 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_login,函数 rabbitmq_connect 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_connection_close,函数 rabbitmq_close 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_basic_ack,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_consume_message,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_destroy_envelope,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_socket_open,函数 rabbitmq_connect 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_tcp_socket_new,函数 rabbitmq_connect 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_empty_bytes,函数 rabbitmq_basic_consume 中引用了该符号 rabbitmq.c.obj : error LNK2019: 无法解析的外部符号 __imp_amqp_empty_table,函数 rabbitmq_basic_consume 中引用了该符号 D:\work\code\CLionProjects\amqp-c-sdk\.runtime\amqp_c_sdk.exe : fatal error LNK1120: 21 个无法解析的外部命令 ninja: build stopped: subcommand failed. 还是存在部分LINK2019,怎么解决
最新发布
07-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值