2015-05-01 14 views
7

Sto utilizzando la libreria redigo per provare ad iscrivermi a un canale Redis e quindi a gestire un messaggio pubblicato. Come gestisco il caso in cui si verifica un errore? Ecco cosa mi è venuto in mente. È un buon modo per farlo? C'è un modo migliore?Qual è un modo idiomatico per riconnettersi all'abbonamento Redis in Go?

Nota: questa domanda è specifica per redigo, ma penso che si applichi ad altri luoghi in cui le riconnessioni devono avvenire.

package main 

import (
    "fmt" 
    "time" 

    "github.com/garyburd/redigo/redis" 
) 

func main() { 
    for { 
     fmt.Println("connecting...") 
     c, err := redis.Dial("tcp", "localhost:6379") 
     if err != nil { 
      fmt.Println("error connecting to redis") 
      time.Sleep(5 * time.Second) 
      continue 
     } 
     psc := redis.PubSubConn{c} 
     psc.Subscribe("example") 
    ReceiveLoop: 
     for { 
      switch v := psc.Receive().(type) { 
      case redis.Message: 
       fmt.Printf("%s: message: %s\n", v.Channel, v.Data) 
      case redis.Subscription: 
       fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count) 
      case error: 
       fmt.Println("there was an error") 
       fmt.Println(v) 
       time.Sleep(5 * time.Second) 
       break ReceiveLoop 
      } 
     } 
    } 
} 

Ho appena messo nella funzione main() per l'esempio. Funzionerebbe davvero in qualche goroutine.

risposta

5

Sì, l'utilizzo di un'etichetta e di un loop è una pratica standard per la riconnessione.

L'unica cosa che ti manca è chiudere la connessione.

  psc.Close() 
      break ReceiveLoop 

Per un po 'di più capacità di recupero, si consiglia redis.DialTimeout in modo che una chiamata Dial non può appendere a tempo indeterminato.

Problemi correlati