Chris Lu
5 years ago
4 changed files with 83 additions and 56 deletions
-
20weed/messaging/broker/broker_grpc_server.go
-
2weed/messaging/broker/broker_grpc_server_subscribe.go
-
54weed/messaging/msgclient/pub_chan.go
-
63weed/messaging/msgclient/sub_chan.go
@ -0,0 +1,63 @@ |
|||
package msgclient |
|||
|
|||
import ( |
|||
"io" |
|||
"log" |
|||
"time" |
|||
|
|||
"github.com/chrislusf/seaweedfs/weed/messaging/broker" |
|||
"github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" |
|||
) |
|||
|
|||
type SubChannel struct { |
|||
ch chan []byte |
|||
stream messaging_pb.SeaweedMessaging_SubscribeClient |
|||
} |
|||
|
|||
func (mc *MessagingClient) NewSubChannel(chanName string) (*SubChannel, error) { |
|||
tp := broker.TopicPartition{ |
|||
Namespace: "chan", |
|||
Topic: chanName, |
|||
Partition: 0, |
|||
} |
|||
grpcConnection, err := mc.findBroker(tp) |
|||
if err != nil { |
|||
return nil, err |
|||
} |
|||
sc, err := setupSubscriberClient(grpcConnection, "", "chan", chanName, 0, time.Unix(0, 0)) |
|||
if err != nil { |
|||
return nil, err |
|||
} |
|||
|
|||
t := &SubChannel{ |
|||
ch: make(chan []byte), |
|||
stream: sc, |
|||
} |
|||
|
|||
go func() { |
|||
for { |
|||
resp, subErr := t.stream.Recv() |
|||
if subErr == io.EOF { |
|||
return |
|||
} |
|||
if subErr != nil { |
|||
log.Printf("fail to receive from netchan %s: %v", chanName, subErr) |
|||
return |
|||
} |
|||
if resp.Data.IsClose { |
|||
t.stream.Send(&messaging_pb.SubscriberMessage{ |
|||
IsClose: true, |
|||
}) |
|||
close(t.ch) |
|||
return |
|||
} |
|||
t.ch <- resp.Data.Value |
|||
} |
|||
}() |
|||
|
|||
return t, nil |
|||
} |
|||
|
|||
func (sc *SubChannel) Channel() chan []byte { |
|||
return sc.ch |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue