2016-12-14 2 views
0

私はrabbitmqとgolangを使用していますが、私はrabbitmqのようなcomsumer側で待機メッセージのスレッドを作っています。私はメインスレッドに信号を殺すのを待ち、rabbitmqスレッドにシグナルを送信したいが、メッセージがキューに入れられない場合、rabbitmqスレッドはシグナルメッセージを殺すのを永遠に待つ。 私はrabbitmqがcomsumerでタイムアウトしているのを発見しましたが、私はgolangではなくjavaでコードを見つけました。 私を助けることができますか?ありがとうございました。golang comsumer側のタイムアウトrabbitmq

答えて

0

私はあなたの質問を正しく理解していれば、キューからルーチン処理を終了することができますか?

タイムアウト設定はここでは機能しません。これはサーバー/クライアントのハートビートのためのもので、何時でもハートビートが受信されない場合にのみ実行されますが、キュー上のフレームを受信しなかった場合は何もしません。

私は何を示唆していることは、あなたのプログラムにkillシグナルを送信する場合さて、それは、それをキャッチストップチャネルを閉じ、キュー処理ゴルーチンが出て終了し、物事がシャットダウンするべきでしょう

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 
    } 
} 

のようなものですきれいに。

関連する問題