接收rabbitmq消息

以下是一個使用純Java(非Spring Boot)接收RabbitMQ消息的完整實現,包含Maven依賴和持續監聽消息的循環:

1. 首先添加Maven依賴 (pom.xml)

<dependencies><!-- RabbitMQ Java Client --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.16.0</version></dependency><!-- 日志框架 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>2.0.7</version></dependency>
</dependencies>

2. RabbitMQ消息接收器實現

import com.rabbitmq.client.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class RabbitMQReceiver {private static final Logger logger = LoggerFactory.getLogger(RabbitMQReceiver.class);private final ConnectionFactory factory;private Connection connection;private Channel channel;private volatile boolean running = true;public RabbitMQReceiver(String host, int port, String username, String password) {factory = new ConnectionFactory();factory.setHost(host);factory.setPort(port);factory.setUsername(username);factory.setPassword(password);}public void startListening(String queueName) {try {// 建立連接connection = factory.newConnection();channel = connection.createChannel();// 聲明隊列(如果不存在則創建)channel.queueDeclare(queueName, true, false, false, null);logger.info("連接到隊列: {}", queueName);// 設置每次只接收一條消息(公平分發)channel.basicQos(1);// 創建消費者DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");logger.info("收到消息 [{}]: {}", delivery.getEnvelope().getDeliveryTag(), message);try {// 在這里處理你的業務邏輯processMessage(message);// 手動確認消息channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);} catch (Exception e) {logger.error("消息處理失敗", e);// 處理失敗時拒絕消息(不重新入隊)channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, false);}};// 取消消費者回調CancelCallback cancelCallback = consumerTag -> {logger.warn("消費者被取消: {}", consumerTag);};// 開始消費消息channel.basicConsume(queueName, false, deliverCallback, cancelCallback);logger.info("開始監聽消息... (按CTRL+C停止)");// 保持程序運行while (running) {Thread.sleep(1000); // 防止CPU空轉}} catch (IOException | TimeoutException | InterruptedException e) {logger.error("RabbitMQ連接失敗", e);} finally {closeResources();}}private void processMessage(String message) {// 這里是你的業務邏輯處理logger.info("處理消息: {}", message);// 示例:打印消息長度System.out.println("消息長度: " + message.length());}public void stop() {running = false;logger.info("停止監聽...");}private void closeResources() {try {if (channel != null && channel.isOpen()) {channel.close();}if (connection != null && connection.isOpen()) {connection.close();}logger.info("RabbitMQ連接已關閉");} catch (IOException | TimeoutException e) {logger.error("關閉資源時出錯", e);}}public static void main(String[] args) {// 配置RabbitMQ連接參數String host = "localhost";int port = 5672;String username = "guest";String password = "guest";String queueName = "my_queue";RabbitMQReceiver receiver = new RabbitMQReceiver(host, port, username, password);// 添加關閉鉤子Runtime.getRuntime().addShutdownHook(new Thread(() -> {receiver.stop();receiver.closeResources();}));// 開始監聽receiver.startListening(queueName);}
}

關鍵功能說明:

  1. 持續監聽機制

    while (running) {Thread.sleep(1000); // 防止CPU空轉
    }
    

    使用running標志控制循環,優雅退出

  2. 消息處理流程

    • 聲明隊列確保存在
    • 設置QoS為1(公平分發)
    • 使用DeliverCallback處理消息
    • 手動消息確認(ACK/NACK)
    • 異常處理與錯誤恢復
  3. 資源管理

    • 使用finally塊確保關閉連接
    • 添加Shutdown Hook處理程序終止
    • 線程安全的狀態管理(volatile running
  4. 日志記錄

    • 使用SLF4J進行日志記錄
    • 關鍵操作都有日志輸出

使用說明:

  1. 啟動消費者

    mvn compile exec:java -Dexec.mainClass="RabbitMQReceiver"
    
  2. 發送測試消息(使用RabbitMQ管理界面或命令行工具):

    rabbitmqadmin publish exchange=amq.default routing_key=my_queue payload="hello world"
    
  3. 停止程序

    • CTRL+C優雅停止
    • 程序會自動關閉連接

自定義配置:

  1. 修改連接參數

    String host = "your.rabbitmq.host";
    int port = 5672;
    String username = "your_user";
    String password = "your_password";
    String queueName = "your_queue_name";
    
  2. 自定義消息處理
    修改processMessage方法實現你的業務邏輯:

    private void processMessage(String message) {// 示例:解析JSON消息// JSONObject json = new JSONObject(message);// System.out.println("收到訂單: " + json.getString("orderId"));// 你的實際業務邏輯
    }
    
  3. 配置調整

    • 修改channel.basicQos()調整預取數量
    • 修改basicNackrequeue參數控制是否重新入隊
    • 添加交換機綁定邏輯(如果需要)

這個實現遵循了RabbitMQ最佳實踐,包括:

  • 手動消息確認
  • 公平分發(QoS設置)
  • 連接和通道的異常處理
  • 資源清理
  • 優雅關閉機制

如果需要處理更復雜的場景(如多個隊列、消息持久化、死信隊列等),可以在channel.queueDeclarechannel.basicConsume方法中添加相應參數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86597.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86597.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86597.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL進階之旅 Day 23:事務隔離級別與性能優化

【SQL進階之旅 Day 23】事務隔離級別與性能優化 文章簡述 在數據庫系統中&#xff0c;事務是確保數據一致性和完整性的核心機制。隨著業務復雜度的提升&#xff0c;如何合理設置事務隔離級別以平衡并發性能與數據一致性成為開發人員必須掌握的關鍵技能。本文深入解析事務隔離級…

六.原型模式

一.原型模式的定義 原型模式是一種創建型設計模式&#xff0c;通過復制現有對象&#xff08;原型&#xff09;生成新對象&#xff0c;避免重復初始化成本。需了解以下關鍵概念&#xff1a; ?淺拷貝?&#xff1a;復制基本類型字段&#xff0c;引用類型字段共享內存地址&#…

【筆記】LoRA 理論與實現|大模型輕量級微調

論文鏈接&#xff1a;LoRA: Low-Rank Adaptation of Large Language Models 官方實現&#xff1a;microsoft/LoRA 非官方實現&#xff1a;huggingface/peft、huggingface/diffusers 這篇文章要介紹的是一種大模型/擴散模型的微調方法&#xff0c;叫做低秩適應&#xff08;也就是…

Cilium動手實驗室: 精通之旅---15.Isovalent Enterprise for Cilium: Network Policies

Cilium動手實驗室: 精通之旅---15.Isovalent Enterprise for Cilium: Network Policies 1. 環境信息2. 測試環境部署3. 默認規則3.1 測試默認規則3.2 小測驗 4. 網絡策略可視化4.1 通過可視化創建策略4.2 小測試 5. 測試策略5.1 應用策略5.2 流量觀測5.3 Hubble觀測5.4 小測試 …

opencv RGB圖像轉灰度圖

這段代碼的作用是將一個 3通道的 RGB 圖像&#xff08;CV_8UC3&#xff09;轉換為灰度圖像&#xff08;CV_8UC1&#xff09;&#xff0c;并使用 OpenCV 的 parallel_for_ 對圖像處理進行并行加速。 &#x1f50d; 一、函數功能總結 if (CV_8UC3 img.type()) {// 創建灰度圖 d…

React Hooks 的原理、常用函數及用途詳解

1. ??Hooks 是什么&#xff1f;?? Hooks 是 React 16.8 引入的函數式組件特性&#xff0c;允許在不編寫 class 的情況下使用 state 和其他 React 特性&#xff08;如生命周期、副作用等&#xff09;。??本質是一類特殊函數??&#xff0c;它們掛載到 React 的調度系統中…

學習路之PHP--webman協程學習

學習路之PHP--webman協程學習 一、準備二、配置三、啟動四、使用 協程是一種比線程更輕量級的用戶級并發機制&#xff0c;能夠在進程中實現多任務調度。它通過手動控制掛起和恢復來實現協程間的切換&#xff0c;避免了進程上下文切換的開銷 一、準備 PHP > 8.1 Workerman &g…

linux libusb使用libusb_claim_interface失敗(-6,Resource busy)解決方案

linux libusb使用libusb_claim_interface失敗&#xff08;-6&#xff0c;Resource busy&#xff09;解決方案 ? 問題原因&#x1f6e0;? 解決方案&#x1f538; 方法一&#xff1a;分離內核驅動 libusb_detach_kernel_driver()&#x1f538; 方法二&#xff1a;使用 usb-devi…

使用mpu6500/6050, PID,互補濾波實現一個簡單的飛行自穩控制系統

首先&#xff0c;參考ai給出的客機飛機的比較平穩的最大仰府&#xff0c;偏轉&#xff0c;和防滾角度&#xff0c;如下&#xff1a; 客機的最大平穩仰俯&#xff08;Pitch&#xff09;、偏轉&#xff08;Yaw&#xff09;和防滾&#xff08;Roll&#xff09;角度&#xff0c;通…

深度解析AD7685ARMZRL7:16位精密ADC在低功耗系統中的設計價值

產品概述 AD7685ARMZRL7是16位逐次逼近型&#xff08;SAR&#xff09;ADC&#xff0c;采用MSOP-10緊湊封裝。其核心架構基于電荷再分配技術&#xff0c;支持2.3V至5.5V單電源供電&#xff0c;集成低噪聲采樣保持電路與內部轉換時鐘。器件采用偽差分輸入結構&#xff08;IN/-&a…

EXCEL 實現“點擊跳轉到指定 Sheet”的方法

&#x1f4cc; WPS 表格技巧&#xff1a;如何實現點擊單元格跳轉到指定 Sheet 在使用 WPS 表格&#xff08;或 Excel&#xff09;時&#xff0c;我們經常會希望通過點擊一個單元格&#xff0c;直接跳轉到工作簿中的另一個工作表&#xff08;Sheet&#xff09;。這在制作目錄頁…

Python格式化:讓數據輸出更優雅

Python格式化&#xff1a;讓數據輸出更優雅 Python的格式化功能能讓數據輸出瞬間變得優雅又規范。不管是對齊文本、控制數字精度&#xff0c;還是動態填充內容&#xff0c;它都能輕松搞定。 一、基礎格式化&#xff1a;從簡單拼接開始 1. 百分號&#xff08;%&#xff09;格式…

2025年滲透測試面試題總結-小鵬[實習]安全工程師(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 小鵬[實習]安全工程師 1. 自我介紹 2. 有沒有挖過src&#xff1f; 3. 平時web滲透怎么學的&#xff0c;有…

VSCode科技風主題設計詳細指南

1. 科技風設計的核心特點 科技風設計是一種強調未來感、現代感和高科技感的設計風格,在VSCode主題設計中,可以通過以下幾個核心特點來體現: 1.1 色彩特點 冷色調為主:藍色、紫色、青色等冷色調是科技風設計的主要色彩高對比度:深色背景配合明亮的霓虹色,形成強烈的視覺…

android知識總結

Activity啟動模式 standard (標準模式) 每次啟動該 Activity&#xff08;例如&#xff0c;通過 startActivity()&#xff09;&#xff0c;系統總會創建一個新的實例&#xff0c;并將其放入調用者&#xff08;啟動它的那個 Activity&#xff09;所在的任務棧中。 singleTop (棧…

第3章 MySQL數據類型

MySQL數據類型 1、數字數據類型1.1 整數類型1.2 定點類型1.3 浮點類型1.4位值類型1.5 超出范圍和溢出處理1.5.1 超出范圍處理1.5.2 溢出處理 2、日期和時間數據類型3、字符串數據類型3.1 char和varchar類型3.2 binary和varbinary類型3.3 blob 和 text類型3.4 enum類型3.4.1 創建…

label-studio的使用教程(導入本地路徑)

文章目錄 1. 準備環境2. 腳本啟動2.1 Windows2.2 Linux 3. 安裝label-studio機器學習后端3.1 pip安裝(推薦)3.2 GitHub倉庫安裝 4. 后端配置4.1 yolo環境4.2 引入后端模型4.3 修改腳本4.4 啟動后端 5. 標注工程5.1 創建工程5.2 配置圖片路徑5.3 配置工程類型標簽5.4 配置模型5.…

mysql為什么一個表中不能同時存在兩個字段自增

背景。設置sort自增。會引發錯誤 通常自增字段都是用于表示數據的唯一性。數據庫限制。需要自定義排序字段大小。

牛客round95D

原題鏈接&#xff1a;D-小紅的區間修改&#xff08;一&#xff09;_牛客周賽 Round 95 題目背景&#xff1a; 初始擁有一個長度10^100元素全為0的數組&#xff0c;進行q查詢&#xff0c;每次查詢如果區間內的元素都為0就將區間變為首項為 1、公差為 1 的等差數列&#xff1b;否…

visual studio 2022更改主題為深色

visual studio 2022更改主題為深色 點擊visual studio 上方的 工具-> 選項 在選項窗口中&#xff0c;選擇 環境 -> 常規 &#xff0c;將其中的顏色主題改成深色 點擊確定&#xff0c;更改完成