最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang gin 監(jiān)聽rabbitmq隊(duì)列無限消費(fèi)的案例代碼

 更新時間:2022年12月01日 10:12:09   作者:lj907722644  
這篇文章主要介紹了golang gin 監(jiān)聽rabbitmq隊(duì)列無限消費(fèi),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

golang gin 監(jiān)聽rabbitmq隊(duì)列無限消費(fèi)

連接rabbitmq

package database

import (
	"github.com/streadway/amqp"
	"log"
	"reflect"
	"yy-data-processing/common/config"
)

var RabbitConn *amqp.Connection
var RabbitChannel *amqp.Channel

func InitRabbitmq() {
	var err error
	RabbitConn, err = amqp.Dial(config.Config.RabbitUrl)
	if err != nil {
		log.Println("連接RabbitMQ失敗")
		panic(err)
	}
	RabbitChannel, err = RabbitConn.Channel()
	if err != nil {
		log.Println("獲取RabbitMQ channel失敗")
		panic(err)
	}
}

// 0表示channel未關(guān)閉,1表示channel已關(guān)閉
func CheckRabbitClosed(ch amqp.Channel) int64 {
	d := reflect.ValueOf(ch)
	i := d.FieldByName("closed").Int()
	return i
}

創(chuàng)建生產(chǎn)者

package service

import (
	"encoding/json"
	"github.com/streadway/amqp"
	"log"
	"yy-data-processing/common/config"
	"yy-data-processing/common/database"
	"yy-data-processing/model"
)

func Producer() {
	// 聲明隊(duì)列,沒有則創(chuàng)建
	// 隊(duì)列名稱、是否持久化、所有消費(fèi)者與隊(duì)列斷開時是否自動刪除隊(duì)列、是否獨(dú)享(不同連接的channel能否使用該隊(duì)列)
	declare, err := database.RabbitChannel.QueueDeclare(config.Config.HawkSaveQueueName, true, false, false, false, nil)
	if err != nil {
		log.Printf("聲明隊(duì)列 %v 失敗, error: %v", config.Config.HawkSaveQueueName, err)
		panic(err)
	}

	request := model.Request{}
	marshal, _ := json.Marshal(request )
	// exchange、routing key、mandatory、immediate
	err = database.RabbitChannel.Publish("", declare.Name, false, false, amqp.Publishing{
		ContentType: "text/plain",
		Body:        []byte(marshal),
	})
	if err != nil {
		log.Printf("生產(chǎn)者發(fā)送消息失敗, error: %v", err)
	} else {
		log.Println("生產(chǎn)者發(fā)送消息成功")
	}
}

創(chuàng)建消費(fèi)者

package service

import (
	"encoding/json"
	"log"
	"os"
	"strings"
	"sync"
	"time"
	"yy-data-processing/common/config"
	"yy-data-processing/common/database"
	"yy-data-processing/model"
)

func Consumer() {
	// 聲明隊(duì)列,沒有則創(chuàng)建
	// 隊(duì)列名稱、是否持久化、所有消費(fèi)者與隊(duì)列斷開時是否自動刪除隊(duì)列、是否獨(dú)享(不同連接的channel能否使用該隊(duì)列)
	_, err := database.RabbitChannel.QueueDeclare(config.Config.QueueName, true, false, false, false, nil)
	if err != nil {
		log.Printf("聲明隊(duì)列 %v 失敗, error: %v", config.Config.QueueName, err)
		panic(err)
	}
    
	// 隊(duì)列名稱、consumer、auto-ack、是否獨(dú)享
	// deliveries是一個管道,有消息到隊(duì)列,就會消費(fèi),消費(fèi)者的消息只需要從deliveries這個管道獲取
	deliveries, err := database.RabbitChannel.Consume(config.Config.QueueName, "", true, false, false, false, nil)
	if err != nil {
		log.Printf("從隊(duì)列 %v 獲取數(shù)據(jù)失敗, error: %v", config.Config.QueueName, err)
	} else {
		log.Println("從消費(fèi)隊(duì)列獲取任務(wù)成功")
	}
    
    // 阻塞住
	for {
		select {
		case message := <-deliveries:
			closed := database.CheckRabbitClosed(*database.RabbitChannel)
			if closed == 1 { // channel 已關(guān)閉,重連一下
				database.InitRabbitmq()
			} else {
				msgData := string(message.Body)
				request := model.Request{}
				err := json.Unmarshal([]byte(msgData), &request)
				if err != nil {
					log.Printf("解析rabbitmq數(shù)據(jù) %v 失敗, error: %v", msgData, err)
				} else {
					// TODO...
                    // 處理邏輯
					
				}
			}
		}
	}
}

main方法協(xié)程調(diào)用

package main

import (
	"log"
	"yy-data-processing/common/config"
	"yy-data-processing/common/database"
	"yy-data-processing/router"
	"yy-data-processing/service"
)

func main() {
	// 初始化路由
	routers := router.InitRouters()

	// 初始化RabbitMQ
	database.InitRabbitmq()
	go service.Producer()
	go service.Consumer()

	port := config.Config.Port
	if err := routers.Run(":" + port); err != nil {
		log.Printf("啟動服務(wù)失敗: ", err)
	}

}

到此這篇關(guān)于golang gin 監(jiān)聽rabbitmq隊(duì)列無限消費(fèi)的文章就介紹到這了,更多相關(guān)golang監(jiān)聽rabbitmq內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go?tar包歸檔文件處理操作全面指南

    go?tar包歸檔文件處理操作全面指南

    這篇文章主要為大家介紹了使用go?tar包歸檔文件處理操作全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例

    Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例

    本篇文章主要介紹了Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Go?Gin框架優(yōu)雅重啟和停止實(shí)現(xiàn)方法示例

    Go?Gin框架優(yōu)雅重啟和停止實(shí)現(xiàn)方法示例

    Web應(yīng)用程序中,有時需要重啟或停止服務(wù)器,無論是因?yàn)楦麓a還是進(jìn)行例行維護(hù),這時需要保證應(yīng)用程序的可用性和數(shù)據(jù)的一致性,就需要優(yōu)雅地關(guān)閉和重啟應(yīng)用程序,即不丟失正在處理的請求和不拒絕新的請求,本文將詳解如何在Go語言中使用Gin這個框架實(shí)現(xiàn)優(yōu)雅的重啟停止
    2024-01-01
  • Go語言開發(fā)kube-scheduler整體架構(gòu)深度剖析

    Go語言開發(fā)kube-scheduler整體架構(gòu)深度剖析

    這篇文章主要為大家介紹了Go語言開發(fā)kube-scheduler整體架構(gòu)深度剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Go高級特性探究之處理1分鐘百萬請求詳解

    Go高級特性探究之處理1分鐘百萬請求詳解

    對于大型的互聯(lián)網(wǎng)應(yīng)用程序,如電商平臺、社交網(wǎng)絡(luò)、金融交易平臺等,每秒鐘都會收到大量的請求,那么Go是如何處理這些百萬請求的呢,下面就來和大家詳細(xì)講講
    2023-06-06
  • 簡單聊聊Go?for?range中容易踩的坑

    簡單聊聊Go?for?range中容易踩的坑

    for循環(huán)問題,在面試中經(jīng)常都會被問到,并且在實(shí)際業(yè)務(wù)項(xiàng)目中也經(jīng)常用到for循環(huán),要是沒用好,一不下心就掉坑,本文就來講講Go?for?range中容易踩的坑吧
    2023-03-03
  • GoFrame 框架緩存查詢結(jié)果的示例詳解

    GoFrame 框架緩存查詢結(jié)果的示例詳解

    GoFrame的gdb對查詢結(jié)果的緩存處理是不是非常的優(yōu)雅。尤其是*gcache.Cache對象采用了適配器設(shè)計(jì)模式,可以輕松實(shí)現(xiàn)從單進(jìn)程內(nèi)存緩存切換為分布式的Redis緩存,本文重點(diǎn)給大家介紹GoFrame 如何優(yōu)雅的緩存查詢結(jié)果,感興趣的朋友一起看看吧
    2022-06-06
  • Go語言中三種容器類型的數(shù)據(jù)結(jié)構(gòu)詳解

    Go語言中三種容器類型的數(shù)據(jù)結(jié)構(gòu)詳解

    在?Go?語言中,有三種主要的容器類型用于存儲和操作集合數(shù)據(jù)這篇文章主要為大家介紹了三者的使用與區(qū)別,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Golang 定時器(Timer 和 Ticker),這篇文章就夠了

    Golang 定時器(Timer 和 Ticker),這篇文章就夠了

    這篇文章主要介紹了Golang 定時器(Timer 和 Ticker),這篇文章就夠了,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Go指針數(shù)組和數(shù)組指針的具體使用

    Go指針數(shù)組和數(shù)組指針的具體使用

    go語言跟c語言一樣,指針數(shù)組和數(shù)組指針概念容易搞混,本文主要介紹了Go指針數(shù)組和數(shù)組指針的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03

最新評論

赫章县| 英山县| 武义县| 诸城市| 溧阳市| 屏山县| 海盐县| 务川| 浦县| 肃宁县| 郴州市| 开远市| 无极县| 玉门市| 石河子市| 上高县| 双桥区| 元阳县| 甘德县| 台中县| 杭锦旗| 麦盖提县| 景泰县| 泾川县| 木里| 兴城市| 神池县| 阜康市| 永善县| 分宜县| 河东区| 玉林市| 两当县| 红安县| 大石桥市| 上林县| 正镶白旗| 庄河市| 潞西市| 二连浩特市| 桓仁|