Simple模式
===
最簡單常用的模式
這個不就是go channel通訊嗎!

### 簡單模式Step1: 創建簡單模式下RabbitMQ
~~~
// 簡單模式Step1: 創建簡單模式下RabbitMQ
func NewRabbitMQSimple(queueName string) *RabbitMQ {
// 使用default exchange
mq := NewRabbitMQ(queueName,"","")
return mq
}
~~~
### 簡單模式Step2: 簡單模式下生產代
~~~
// 簡單模式Step2: 簡單模式下生產代碼
func (r *RabbitMQ) PublishSimple(message string) error {
// 1. 申請隊列,如果隊列不存在會自動創建,如果存在則跳過創建
// 保證隊列存在,消息能夠發送到隊列中
_, e := r.channel.QueueDeclare(
r.QueueName, // 隊列名稱
false, // 消息是否持久化 false不
false, // 是否自動刪除 沒有消息就刪除次隊列
false, // 是否具有排他性 (true只有自己可以訪問)
false, // 是否阻塞 (設置為true時就像沒有bufio的channel)
nil, // 額外的屬性
)
if e != nil {
log.Println(e.Error())
return e
}
// 2. 發送消息到隊列中
e = r.channel.Publish(
r.Exchange,// 交換機 名稱
r.QueueName, // 隊列名稱
false,// 如果為true,根據exchange類型和routkey規則,如果無法找到符合條件的隊列,那末就會吧發送的消息返回給發送者
false,// 如果為true,但exchange發送消息到隊列后發現隊列上沒有綁定消費者,則會吧消息發送給發送者
amqp.Publishing{
ContentType:"text/plain",// 明文
Body:[]byte(message),
},
)
return e
}
~~~
### 簡單模式Step3: 消費消息
~~~
// 簡單模式Step3: 消費消息
func (r *RabbitMQ) ConsumeSimple() error {
// 1. 申請隊列,如果隊列不存在會自動創建,如果存在則跳過創建
// 保證隊列存在,消息能夠發送到隊列中
_, e := r.channel.QueueDeclare(
r.QueueName, // 隊列名稱
false, // 消息是否持久化 false不
false, // 是否自動刪除 沒有消息就刪除次隊列
false, // 是否具有排他性 (true只有自己可以訪問)
false, // 是否阻塞 (設置為true時就像沒有bufio的channel)
nil, // 額外的屬性
)
if e != nil {
log.Println(e.Error())
return e
}
// 接受消息
msgch, e := r.channel.Consume(
r.QueueName, // 隊列名稱
"", // 當前消費者名稱 (用于區分多個消費者)
true, // 是否自動應答
false,// 是否具有排他性 (true只有自己可以訪問,連接端口會自動刪除)
false, // [已經不支持] 如果設置為true,表示不能了個將同一個connection中發送的消息傳遞個ie這個connection中的消費者
false, // 消費是否阻塞
nil,// 其他參數
)
if e != nil {
return e
}
foreve := make(chan bool)
// 啟動協程處理消息
go func() {
for {
select {
case data := <-msgch :
// 實現消息處理
bytes := data.Body
fmt.Printf("%s",bytes)
}
}
}()
<-foreve
return nil
}
~~~
simple交換機設置為空
本節課程代碼:
[https://github.com/dollarkillerx/High-concurrent-spike-system/tree/3a98392d64d66d45b58877da15d00fbe2dabb9c4](https://github.com/dollarkillerx/High-concurrent-spike-system/tree/3a98392d64d66d45b58877da15d00fbe2dabb9c4)