package sub_client import ( "fmt" "github.com/seaweedfs/seaweedfs/weed/util" "io" "log" "time" ) // Subscribe subscribes to a topic's specified partitions. // If a partition is moved to another broker, the subscriber will automatically reconnect to the new broker. func (sub *TopicSubscriber) Subscribe() error { // loop forever sub.doKeepConnectedToSubCoordinator() index := -1 util.RetryUntil("subscribe", func() error { index++ index = index % len(sub.bootstrapBrokers) // ask balancer for brokers of the topic if err := sub.doLookup(sub.bootstrapBrokers[index]); err != nil { return fmt.Errorf("lookup topic %s/%s: %v", sub.ContentConfig.Namespace, sub.ContentConfig.Topic, err) } if len(sub.brokerPartitionAssignments) == 0 { if sub.waitForMoreMessage { time.Sleep(1 * time.Second) return fmt.Errorf("no broker partition assignments") } else { return nil } } // treat the first broker as the topic leader // connect to the leader broker // subscribe to the topic if err := sub.doProcess(); err != nil { return fmt.Errorf("subscribe topic %s/%s: %v", sub.ContentConfig.Namespace, sub.ContentConfig.Topic, err) } return nil }, func(err error) bool { if err == io.EOF { log.Printf("subscriber %s/%s: %v", sub.ContentConfig.Namespace, sub.ContentConfig.Topic, err) sub.waitForMoreMessage = false return false } return true }) return nil }