2017-03-06 15 views
0

私はrabbitmqがキューを消費していますが、一度クライアントが購読されると、消費キューは永遠にとどまります。キューが空のときに宣言して終了するタイムアウトはありますか?rabbitmq消費者をタイムアウトする方法は?

msgs, err := ch.Consume(
       q.Name, // queue 
       "",  // consumer 
       true, // auto-ack 
       false, // exclusive 
       false, // no-local 
       false, // no-wait 
       nil, // args 
     ) 
for msg := range msgs { 
       log.Printf("Received message with message: %s", msg.Body) 
} 

答えて

2

the standard Go pattern for timing outを使用できます。

ここでは動作例を示します。

const duration = 3 * time.Second 
timer := time.NewTimer(duration) 
for { 
    select { 
    case d := <-msgs: 
     timer.Reset(duration) 
     fmt.Printf("Received a message: %s\n", d.Body) 
    case <- timer.C: 
     fmt.Println("Timeout !") 
     os.Exit(1) 
    } 
} 

おそらく多少の研磨が必要です。私はあなたがメッセージを受け取ったときにタイマーを止めて、それを処理し終わったらもう一度有効にしておく方がよいと思いますが、これはあなたを起動させるはずです。

+0

このようにして、上のforループにbreakを挿入しますか? – irom

+1

はい、また、チャネルから読み取るたびにタイマーをリセットします。 – Zoyd

+0

私は、< - タイムアウト:os.Exit(1)のケースでgoタイムアウトパターンを使用しましたが、そのrabbitmqループで終了しません。 – irom

関連する問題