2015-05-01 1 views
7

मैं रेडिगो चैनल की सदस्यता लेने के लिए रेडिगो लाइब्रेरी का उपयोग कर रहा हूं और फिर प्रकाशित संदेश को संभालता हूं। मैं उस मामले को कैसे संभाल सकता हूं जहां यह त्रुटियां हैं? यहां मैं क्या आया था। क्या यह करने का यह एक अच्छा तरीका है? क्या कोई बेहतर तरीका है?गो में रेडिस सदस्यता से पुनः कनेक्ट करने का एक बेवकूफ तरीका क्या है?

नोट: यह प्रश्न रेडिगो के लिए विशिष्ट है, लेकिन मुझे लगता है कि यह अन्य स्थानों पर लागू होता है जहां पुन: कनेक्शन की आवश्यकता होती है।

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

मैंने इसे उदाहरण के लिए मुख्य() फ़ंक्शन में रखा है। यह वास्तव में कुछ goroutine में भाग जाएगा।

उत्तर

5

हां, एक लेबल और लूप का उपयोग करके रीकनेक्ट करने के लिए मानक अभ्यास है।

एकमात्र चीज जो आप गायब हैं, कनेक्शन बंद कर रही है।

  psc.Close() 
      break ReceiveLoop 

थोड़ा और अधिक लचीलापन के लिए, आप redis.DialTimeout चाह सकते हैं कि एक डायल कॉल अनिश्चित काल के लिए लटका नहीं कर सकते।

संबंधित मुद्दे

 संबंधित मुद्दे