You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gojobs/pb/pubsub.server.go

67 lines
1.6 KiB

2 years ago
package pb
import (
"context"
"go.dtapp.net/gojobs/pubsub"
2 years ago
"log"
2 years ago
"strings"
"time"
)
type PubSubServerService struct {
pub *pubsub.Publisher
UnimplementedPubSubServer
}
func NewPubSubServerService() *PubSubServerService {
return &PubSubServerService{
// 新建一个Publisher对象
pub: pubsub.NewPublisher(time.Millisecond*100, 10),
}
}
// Publish 实现发布方法
2 years ago
func (p *PubSubServerService) Publish(ctx context.Context, req *PublishRequest) (*PublishRequest, error) {
log.Printf("[服务中转]%v\n", req.GetValue())
2 years ago
// 发布消息
2 years ago
p.pub.Publish(req.GetValue())
return &PublishRequest{Value: req.GetValue()}, nil
2 years ago
}
// Subscribe 实现订阅方法
2 years ago
func (p *PubSubServerService) Subscribe(req *SubscribeRequest, stream PubSub_SubscribeServer) error {
2 years ago
2 years ago
// SubscribeTopic 增加一个使用函数过滤器的订阅者
// func(v interface{}) 定义函数过滤的规则
// SubscribeTopic 返回一个chan interface{}
2 years ago
log.Printf("[服务中转]收到任务:%v\n", req.GetValue())
2 years ago
2 years ago
ch := p.pub.SubscribeTopic(func(v interface{}) bool {
// 接收数据是string并且key是以arg为前缀的
if key, ok := v.(string); ok {
2 years ago
if strings.HasPrefix(key, req.GetValue()) {
2 years ago
return true
}
}
return false
})
2 years ago
log.Println("[服务中转]工作线:", ch)
log.Println("[服务中转]工作线数量:", p.pub.Len())
2 years ago
// 服务器遍历chan并将其中信息发送给订阅客户端
for v := range ch {
2 years ago
err := stream.Send(&SubscribeResponse{
Value: v.(string),
Ip: "",
})
2 years ago
if err != nil {
2 years ago
log.Println("[服务中转]任务分配失败:", err.Error())
2 years ago
return err
}
}
return nil
}