2016-12-14 62 views
0

我使用rabbitmq和golang,我在commamer端做了一個等待消息的線程,比如rabbitmq例子。我想主線程會等待kill信號併發送信號給rabbitmq線程,但是如果信息不在隊列中推入,rabbitmq線程將永遠等待,因此它不處理kill信號消息。 我發現rabbitmq在comsumer中有超時,但我剛剛在java中找到代碼,而不是golang。 你能幫我嗎?謝謝。在golang comsumer端超時rabbitmq

回答

0

如果我正確理解你的問題,你希望能夠退出例程處理隊列?

超時設置在此處不起作用。這是針對服務器/客戶端心跳的,並且只有在任何時間沒有收到心跳的情況下才會開始使用,但是對於沒有在隊列中接收到幀而不做任何事情。

我的建議是一樣的東西

import "sync" 
import "os/signal" 

var (
    wg sync.WaitGroup 
    sigs = make(chan os.Signal, 1) 
    stop = make(chan bool) 
) 

func main() { 

    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) 

    //your other setup stuff 

    wg.Add(2) 
    go myQueueProcessor() 
    go mySignalProcessor() 

    //Now your main will wait for your goroutines to finish here. 
    wg.Wait() 

    //your program cleanup stuff 
} 

func myQueueProcessor() { 
    defer wg.Done() 
    //keep running over the select indefinitely 
    for { 
    select { 
     case <-stop: //if the stop channel is closed exit out of go routine 
     return 
     case msg := <-sub.C: //Whatever queue processes you want 
     //do message stuff 
    } 
    } 
} 

func mySignalProcessor() { 
    defer wg.Done() 
    select { 
    case sig := <-sigs: 
     close(stop) 
     return 
    } 
} 

現在,如果你把你的程序的終止信號,它會抓住它,關閉停止頻道和隊列處理的goroutine將退出出來的東西應該關閉乾淨。