parent
7a14377892
commit
8a56a93570
@ -0,0 +1,121 @@
|
|||||||
|
package gojobs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"go.dtapp.net/dorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
// client *dorm.GormClient
|
||||||
|
type gormClientFun func() *dorm.GormClient
|
||||||
|
|
||||||
|
// client *dorm.MongoClient
|
||||||
|
// databaseName string
|
||||||
|
type mongoClientFun func() (*dorm.MongoClient, string)
|
||||||
|
|
||||||
|
// client *dorm.RedisClient
|
||||||
|
type redisClientFun func() *dorm.RedisClient
|
||||||
|
|
||||||
|
// 前缀
|
||||||
|
// lockKeyPrefix 锁Key前缀 xxx_lock
|
||||||
|
// lockKeySeparator 锁Key分隔符 :
|
||||||
|
// cornKeyPrefix 任务Key前缀 xxx_cron
|
||||||
|
// cornKeyCustom 任务Key自定义 xxx_cron_自定义 xxx_cron_自定义_*
|
||||||
|
type redisPrefixFun func() (lockKeyPrefix, lockKeySeparator, cornKeyPrefix, cornKeyCustom string)
|
||||||
|
|
||||||
|
// ClientConfig 实例配置
|
||||||
|
type ClientConfig struct {
|
||||||
|
GormClientFun gormClientFun // 数据库驱动
|
||||||
|
MongoClientFun mongoClientFun // 数据库驱动
|
||||||
|
RedisClientFun redisClientFun // 数据库驱动
|
||||||
|
RedisPrefixFun redisPrefixFun // 前缀
|
||||||
|
Debug bool // 日志开关
|
||||||
|
CurrentIp string // 当前ip
|
||||||
|
}
|
||||||
|
|
||||||
|
// Client 实例
|
||||||
|
type Client struct {
|
||||||
|
config struct {
|
||||||
|
debug bool // 日志开关
|
||||||
|
runVersion string // 运行版本
|
||||||
|
os string // 系统类型
|
||||||
|
arch string // 系统架构
|
||||||
|
maxProCs int // CPU核数
|
||||||
|
version string // GO版本
|
||||||
|
macAddrS string // Mac地址
|
||||||
|
insideIp string // 内网ip
|
||||||
|
outsideIp string // 外网ip
|
||||||
|
}
|
||||||
|
cache struct {
|
||||||
|
redisClient *dorm.RedisClient // 数据库
|
||||||
|
redisLockClient *dorm.RedisClientLock // 锁服务
|
||||||
|
lockKeyPrefix string // 锁Key前缀 xxx_lock
|
||||||
|
lockKeySeparator string // 锁Key分隔符 :
|
||||||
|
cornKeyPrefix string // 任务Key前缀 xxx_cron
|
||||||
|
cornKeyCustom string // 任务Key自定义
|
||||||
|
}
|
||||||
|
db struct {
|
||||||
|
gormClient *dorm.GormClient // 数据库
|
||||||
|
mongoClient *dorm.MongoClient // 数据库
|
||||||
|
mongoDatabaseName string // 数据库名
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewClient 创建实例
|
||||||
|
func NewClient(config *ClientConfig) (*Client, error) {
|
||||||
|
|
||||||
|
var ctx = context.Background()
|
||||||
|
|
||||||
|
c := &Client{}
|
||||||
|
|
||||||
|
c.config.debug = config.Debug
|
||||||
|
|
||||||
|
if config.CurrentIp == "" {
|
||||||
|
return nil, currentIpNoConfig
|
||||||
|
}
|
||||||
|
c.config.outsideIp = config.CurrentIp
|
||||||
|
|
||||||
|
// 配置信息
|
||||||
|
c.setConfig(ctx)
|
||||||
|
|
||||||
|
gormClient := config.GormClientFun()
|
||||||
|
if gormClient != nil && gormClient.Db != nil {
|
||||||
|
c.db.gormClient = gormClient
|
||||||
|
|
||||||
|
c.autoMigrateTask()
|
||||||
|
c.autoMigrateTaskIp()
|
||||||
|
c.autoMigrateTaskLog()
|
||||||
|
c.autoMigrateTaskLogRun()
|
||||||
|
} else {
|
||||||
|
return nil, gormClientFunNoConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
mongoClient, databaseName := config.MongoClientFun()
|
||||||
|
if mongoClient != nil && mongoClient.Db != nil {
|
||||||
|
c.db.mongoClient = mongoClient
|
||||||
|
if databaseName == "" {
|
||||||
|
return nil, mongoClientFunNoConfig
|
||||||
|
}
|
||||||
|
c.db.mongoDatabaseName = databaseName
|
||||||
|
|
||||||
|
c.mongoCreateCollectionTask(ctx)
|
||||||
|
c.mongoCreateIndexesTask(ctx)
|
||||||
|
c.mongoCreateIndexesTaskIp(ctx)
|
||||||
|
c.mongoCreateCollectionTaskLog(ctx)
|
||||||
|
c.mongoCreateIndexesTaskLog(ctx)
|
||||||
|
c.mongoCreateCollectionTaskLogRun(ctx)
|
||||||
|
c.mongoCreateIndexesTaskLogRun(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
redisClient := config.RedisClientFun()
|
||||||
|
if redisClient != nil && redisClient.Db != nil {
|
||||||
|
c.cache.redisClient = redisClient
|
||||||
|
c.cache.redisLockClient = c.cache.redisClient.NewLock()
|
||||||
|
}
|
||||||
|
|
||||||
|
c.cache.lockKeyPrefix, c.cache.lockKeySeparator, c.cache.cornKeyPrefix, c.cache.cornKeyCustom = config.RedisPrefixFun()
|
||||||
|
if c.cache.lockKeyPrefix == "" || c.cache.lockKeySeparator == "" || c.cache.cornKeyPrefix == "" || c.cache.cornKeyCustom == "" {
|
||||||
|
return nil, redisPrefixFunNoConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
return c, nil
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package gojobs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"go.dtapp.net/goarray"
|
||||||
|
"go.dtapp.net/goip"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (c *Client) setConfig(ctx context.Context) {
|
||||||
|
c.config.runVersion = Version
|
||||||
|
c.config.os = runtime.GOOS
|
||||||
|
c.config.arch = runtime.GOARCH
|
||||||
|
c.config.maxProCs = runtime.GOMAXPROCS(0)
|
||||||
|
c.config.version = runtime.Version()
|
||||||
|
c.config.macAddrS = goarray.TurnString(goip.GetMacAddr(ctx))
|
||||||
|
c.config.insideIp = goip.GetInsideIp(ctx)
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
package gojobs
|
package gojobs
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Version = "1.0.72"
|
Version = "1.0.73"
|
||||||
SpecifyIpNull = "0.0.0.0"
|
SpecifyIpNull = "0.0.0.0"
|
||||||
)
|
)
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
package gojobs
|
||||||
|
|
||||||
|
import "errors"
|
||||||
|
|
||||||
|
var (
|
||||||
|
currentIpNoConfig = errors.New("请配置 CurrentIp")
|
||||||
|
mongoClientFunNoConfig = errors.New("请配置 MongoClientFun")
|
||||||
|
redisPrefixFunNoConfig = errors.New("请配置 RedisPrefixFun")
|
||||||
|
gormClientFunNoConfig = errors.New("请配置 GormClientFun")
|
||||||
|
)
|
@ -0,0 +1,32 @@
|
|||||||
|
package gojobs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/go-redis/redis/v9"
|
||||||
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetDb 获取数据库驱动
|
||||||
|
func (c *Client) GetDb() *gorm.DB {
|
||||||
|
return c.db.gormClient.Db
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMongoDb 获取数据库驱动
|
||||||
|
func (c *Client) GetMongoDb() *mongo.Client {
|
||||||
|
return c.db.mongoClient.Db
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetRedis 获取缓存数据库驱动
|
||||||
|
func (c *Client) GetRedis() *redis.Client {
|
||||||
|
return c.cache.redisClient.Db
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCurrentIp 获取当前ip
|
||||||
|
func (c *Client) GetCurrentIp() string {
|
||||||
|
return c.config.outsideIp
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSubscribeAddress 获取订阅地址
|
||||||
|
func (c *Client) GetSubscribeAddress() string {
|
||||||
|
return c.cache.cornKeyPrefix + "_" + c.cache.cornKeyCustom
|
||||||
|
}
|
@ -0,0 +1,219 @@
|
|||||||
|
package gojobs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.dtapp.net/gojobs/jobs_gorm_model"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
"log"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TaskTakeId 查询单任务
|
||||||
|
func (c *Client) TaskTakeId(tx *gorm.DB, id uint) (result jobs_gorm_model.Task) {
|
||||||
|
tx.Where("id = ?", id).Take(&result)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTake 查询单任务
|
||||||
|
func (c *Client) TaskTake(tx *gorm.DB, customId string) (result jobs_gorm_model.Task) {
|
||||||
|
tx.Where("custom_id = ?", customId).Take(&result)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询单任务
|
||||||
|
func (c *Client) taskTake(tx *gorm.DB, customId, status string) (result jobs_gorm_model.Task) {
|
||||||
|
tx.Where("custom_id = ?", customId).Where("status = ?", status).Take(&result)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTakeIn 查询单任务 - 任务运行
|
||||||
|
func (c *Client) TaskTakeIn(tx *gorm.DB, customId string) jobs_gorm_model.Task {
|
||||||
|
return c.taskTake(tx, customId, TASK_IN)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTakeSuccess 查询单任务 - 任务完成
|
||||||
|
func (c *Client) TaskTakeSuccess(tx *gorm.DB, customId string) jobs_gorm_model.Task {
|
||||||
|
return c.taskTake(tx, customId, TASK_SUCCESS)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTakeError 查询单任务 - 任务异常
|
||||||
|
func (c *Client) TaskTakeError(tx *gorm.DB, customId string) jobs_gorm_model.Task {
|
||||||
|
return c.taskTake(tx, customId, TASK_ERROR)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTakeTimeout 查询单任务 - 任务超时
|
||||||
|
func (c *Client) TaskTakeTimeout(tx *gorm.DB, customId string) jobs_gorm_model.Task {
|
||||||
|
return c.taskTake(tx, customId, TASK_TIMEOUT)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTakeWait 查询单任务 - 任务等待
|
||||||
|
func (c *Client) TaskTakeWait(tx *gorm.DB, customId string) jobs_gorm_model.Task {
|
||||||
|
return c.taskTake(tx, customId, TASK_WAIT)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTypeTake 查询单任务
|
||||||
|
func (c *Client) TaskTypeTake(tx *gorm.DB, customId, Type string) (result jobs_gorm_model.Task) {
|
||||||
|
tx.Where("custom_id = ?", customId).Where("type = ?", Type).Take(&result)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询单任务
|
||||||
|
func (c *Client) taskTypeTake(tx *gorm.DB, customId, Type, status string) (result jobs_gorm_model.Task) {
|
||||||
|
tx.Where("custom_id = ?", customId).Where("type = ?", Type).Where("status = ?", status).Take(&result)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTypeTakeIn 查询单任务 - 任务运行
|
||||||
|
func (c *Client) TaskTypeTakeIn(tx *gorm.DB, customId, Type string) jobs_gorm_model.Task {
|
||||||
|
return c.taskTypeTake(tx, customId, Type, TASK_IN)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTypeTakeSuccess 查询单任务 - 任务完成
|
||||||
|
func (c *Client) TaskTypeTakeSuccess(tx *gorm.DB, customId, Type string) jobs_gorm_model.Task {
|
||||||
|
return c.taskTypeTake(tx, customId, Type, TASK_SUCCESS)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTypeTakeError 查询单任务 - 任务异常
|
||||||
|
func (c *Client) TaskTypeTakeError(tx *gorm.DB, customId, Type string) jobs_gorm_model.Task {
|
||||||
|
return c.taskTypeTake(tx, customId, Type, TASK_ERROR)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTypeTakeTimeout 查询单任务 - 任务超时
|
||||||
|
func (c *Client) TaskTypeTakeTimeout(tx *gorm.DB, customId, Type string) jobs_gorm_model.Task {
|
||||||
|
return c.taskTypeTake(tx, customId, Type, TASK_TIMEOUT)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskTypeTakeWait 查询单任务 - 任务等待
|
||||||
|
func (c *Client) TaskTypeTakeWait(tx *gorm.DB, customId, Type string) jobs_gorm_model.Task {
|
||||||
|
return c.taskTypeTake(tx, customId, Type, TASK_WAIT)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskFindAll 查询多任务
|
||||||
|
func (c *Client) TaskFindAll(tx *gorm.DB, frequency int64) (results []jobs_gorm_model.Task) {
|
||||||
|
tx.Where("frequency = ?", frequency).Order("id asc").Find(&results)
|
||||||
|
return results
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询多任务
|
||||||
|
func (c *Client) taskFindAll(tx *gorm.DB, frequency int64, status string) (results []jobs_gorm_model.Task) {
|
||||||
|
tx.Where("frequency = ?", frequency).Where("status = ?", status).Order("id asc").Find(&results)
|
||||||
|
return results
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskFindAllIn 查询多任务 - 任务运行
|
||||||
|
func (c *Client) TaskFindAllIn(tx *gorm.DB, frequency int64) []jobs_gorm_model.Task {
|
||||||
|
return c.taskFindAll(tx, frequency, TASK_IN)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskFindAllSuccess 查询多任务 - 任务完成
|
||||||
|
func (c *Client) TaskFindAllSuccess(tx *gorm.DB, frequency int64) []jobs_gorm_model.Task {
|
||||||
|
return c.taskFindAll(tx, frequency, TASK_SUCCESS)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskFindAllError 查询多任务 - 任务异常
|
||||||
|
func (c *Client) TaskFindAllError(tx *gorm.DB, frequency int64) []jobs_gorm_model.Task {
|
||||||
|
return c.taskFindAll(tx, frequency, TASK_ERROR)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskFindAllTimeout 查询多任务 - 任务超时
|
||||||
|
func (c *Client) TaskFindAllTimeout(tx *gorm.DB, frequency int64) []jobs_gorm_model.Task {
|
||||||
|
return c.taskFindAll(tx, frequency, TASK_TIMEOUT)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskFindAllWait 查询多任务 - 任务等待
|
||||||
|
func (c *Client) TaskFindAllWait(tx *gorm.DB, frequency int64) []jobs_gorm_model.Task {
|
||||||
|
return c.taskFindAll(tx, frequency, TASK_WAIT)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StartTask 任务启动
|
||||||
|
func (c *Client) StartTask(tx *gorm.DB, id uint) error {
|
||||||
|
return c.EditTask(tx, id).
|
||||||
|
Select("status", "status_desc").
|
||||||
|
Updates(jobs_gorm_model.Task{
|
||||||
|
Status: TASK_IN,
|
||||||
|
StatusDesc: "启动任务",
|
||||||
|
}).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// StartTaskCustom 任务启动自定义
|
||||||
|
func (c *Client) StartTaskCustom(tx *gorm.DB, customId string, customSequence int64) error {
|
||||||
|
return tx.Model(&jobs_gorm_model.Task{}).
|
||||||
|
Where("custom_id = ?", customId).
|
||||||
|
Where("custom_sequence = ?", customSequence).
|
||||||
|
Where("status = ?", TASK_WAIT).
|
||||||
|
Select("status", "status_desc").
|
||||||
|
Updates(jobs_gorm_model.Task{
|
||||||
|
Status: TASK_IN,
|
||||||
|
StatusDesc: "启动任务",
|
||||||
|
}).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// EditTask 任务修改
|
||||||
|
func (c *Client) EditTask(tx *gorm.DB, id uint) *gorm.DB {
|
||||||
|
return tx.Model(&jobs_gorm_model.Task{}).Where("id = ?", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateFrequency 更新任务频率
|
||||||
|
func (c *Client) UpdateFrequency(tx *gorm.DB, id uint, frequency int64) *gorm.DB {
|
||||||
|
return c.EditTask(tx, id).
|
||||||
|
Select("frequency").
|
||||||
|
Updates(jobs_gorm_model.Task{
|
||||||
|
Frequency: frequency,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) taskIpTake(tx *gorm.DB, taskType, ips string) (result jobs_gorm_model.TaskIp) {
|
||||||
|
tx.Where("task_type = ?", taskType).Where("ips = ?", ips).Take(&result)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskIpUpdate 更新ip
|
||||||
|
func (c *Client) TaskIpUpdate(tx *gorm.DB, taskType, ips string) *gorm.DB {
|
||||||
|
query := c.taskIpTake(tx, taskType, ips)
|
||||||
|
if query.Id != 0 {
|
||||||
|
return tx
|
||||||
|
}
|
||||||
|
updateStatus := tx.Create(&jobs_gorm_model.TaskIp{
|
||||||
|
TaskType: taskType,
|
||||||
|
Ips: ips,
|
||||||
|
})
|
||||||
|
if updateStatus.RowsAffected == 0 {
|
||||||
|
log.Println("任务更新失败:", updateStatus.Error)
|
||||||
|
}
|
||||||
|
return updateStatus
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskIpInit 实例任务ip
|
||||||
|
func (c *Client) TaskIpInit(tx *gorm.DB, ips map[string]string) bool {
|
||||||
|
if c.config.outsideIp == "" || c.config.outsideIp == "0.0.0.0" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
tx.Where("ips = ?", c.config.outsideIp).Delete(&jobs_gorm_model.TaskIp{}) // 删除
|
||||||
|
for k, v := range ips {
|
||||||
|
if v == "" {
|
||||||
|
c.TaskIpUpdate(tx, k, c.config.outsideIp)
|
||||||
|
} else {
|
||||||
|
find := strings.Contains(v, ",")
|
||||||
|
if find == true {
|
||||||
|
// 包含
|
||||||
|
parts := strings.Split(v, ",")
|
||||||
|
for _, vv := range parts {
|
||||||
|
if vv == c.config.outsideIp {
|
||||||
|
c.TaskIpUpdate(tx, k, c.config.outsideIp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 不包含
|
||||||
|
if v == c.config.outsideIp {
|
||||||
|
c.TaskIpUpdate(tx, k, c.config.outsideIp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskLogRunTake 查询任务执行日志
|
||||||
|
func (c *Client) TaskLogRunTake(tx *gorm.DB, taskId uint, runId string) (result jobs_gorm_model.TaskLogRun) {
|
||||||
|
tx.Select("id", "os", "arch", "outside_ip", "created_at").Where("task_id = ?", taskId).Where("run_id = ?", runId).Take(&result)
|
||||||
|
return result
|
||||||
|
}
|
@ -1,21 +0,0 @@
|
|||||||
package gojobs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"go.dtapp.net/goip"
|
|
||||||
)
|
|
||||||
|
|
||||||
var ip string
|
|
||||||
|
|
||||||
func configIp() {
|
|
||||||
ip = goip.GetOutsideIp(context.Background())
|
|
||||||
}
|
|
||||||
|
|
||||||
const prefix = "cron:"
|
|
||||||
|
|
||||||
const prefixIp = "cron_%s:"
|
|
||||||
|
|
||||||
func prefixSprintf(str string) string {
|
|
||||||
return fmt.Sprintf(prefixIp, str)
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
package gojobs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ClientConfig 客户端配置
|
|
||||||
type ClientConfig struct {
|
|
||||||
Address string // 服务端口 127.0.0.1:8888
|
|
||||||
}
|
|
||||||
|
|
||||||
// Client 定时任务
|
|
||||||
type Client struct {
|
|
||||||
ClientConfig // 配置
|
|
||||||
Conn *grpc.ClientConn // 链接信息
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewClient 创建客户端
|
|
||||||
func NewClient(config *ClientConfig) *Client {
|
|
||||||
|
|
||||||
if config.Address == "" {
|
|
||||||
panic("[客户端]请填写服务端口")
|
|
||||||
}
|
|
||||||
|
|
||||||
c := &Client{}
|
|
||||||
|
|
||||||
c.Address = config.Address
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
// 建立连接 获取client
|
|
||||||
c.Conn, err = grpc.Dial(c.Address, grpc.WithInsecure())
|
|
||||||
if err != nil {
|
|
||||||
panic("[客户端]{连接失败}" + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
return c
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
package gojobs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"go.dtapp.net/gojobs/pb"
|
|
||||||
"go.dtapp.net/gostring"
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
// WorkerConfig 工作配置
|
|
||||||
type WorkerConfig struct {
|
|
||||||
Address string // 服务端口 127.0.0.1:8888
|
|
||||||
ClientIp string // 自己的ip地址
|
|
||||||
}
|
|
||||||
|
|
||||||
// Worker 工作
|
|
||||||
type Worker struct {
|
|
||||||
WorkerConfig // 配置
|
|
||||||
Pub pb.PubSubClient // 订阅
|
|
||||||
Conn *grpc.ClientConn // 链接信息
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewWorker 创建工作
|
|
||||||
func NewWorker(config *WorkerConfig) *Worker {
|
|
||||||
|
|
||||||
if config.Address == "" {
|
|
||||||
panic("[工作线]请填写服务端口")
|
|
||||||
}
|
|
||||||
if config.ClientIp == "" {
|
|
||||||
panic("[定时任务]请填写ip地址")
|
|
||||||
}
|
|
||||||
|
|
||||||
w := &Worker{}
|
|
||||||
|
|
||||||
w.Address = config.Address
|
|
||||||
w.ClientIp = config.ClientIp
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
// 建立连接 获取client
|
|
||||||
w.Conn, err = grpc.Dial(w.Address, grpc.WithInsecure())
|
|
||||||
if err != nil {
|
|
||||||
panic("[工作线]{连接失败}" + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
// 新建一个客户端
|
|
||||||
w.Pub = pb.NewPubSubClient(w.Conn)
|
|
||||||
|
|
||||||
return w
|
|
||||||
}
|
|
||||||
|
|
||||||
// SubscribeCron 订阅服务
|
|
||||||
func (w *Worker) SubscribeCron() pb.PubSub_SubscribeClient {
|
|
||||||
stream, err := w.Pub.Subscribe(context.Background(), &pb.SubscribeRequest{
|
|
||||||
Id: gostring.GetUuId(),
|
|
||||||
Value: prefix,
|
|
||||||
Ip: w.ClientIp,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
panic("[工作线]{订阅服务失败}" + err.Error())
|
|
||||||
}
|
|
||||||
return stream
|
|
||||||
}
|
|
||||||
|
|
||||||
// StartCron 启动任务
|
|
||||||
func (w *Worker) StartCron() pb.PubSub_SubscribeClient {
|
|
||||||
stream, err := w.Pub.Subscribe(context.Background(), &pb.SubscribeRequest{
|
|
||||||
Id: gostring.GetUuId(),
|
|
||||||
Value: prefixSprintf(w.ClientIp),
|
|
||||||
Ip: w.ClientIp,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
panic("[工作线]{启动任务失败}" + err.Error())
|
|
||||||
}
|
|
||||||
return stream
|
|
||||||
}
|
|
@ -0,0 +1,21 @@
|
|||||||
|
package gojobs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"go.dtapp.net/goip"
|
||||||
|
"go.dtapp.net/gojobs/jobs_gorm_model"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RefreshIp 刷新Ip
|
||||||
|
func (c *Client) RefreshIp(ctx context.Context, tx *gorm.DB) {
|
||||||
|
xip := goip.GetOutsideIp(ctx)
|
||||||
|
if c.config.outsideIp == "" || c.config.outsideIp == "0.0.0.0" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if c.config.outsideIp == xip {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
tx.Where("ips = ?", c.config.outsideIp).Delete(&jobs_gorm_model.TaskIp{}) // 删除
|
||||||
|
c.config.outsideIp = xip
|
||||||
|
}
|
@ -1,116 +0,0 @@
|
|||||||
package gojobs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"go.dtapp.net/dorm"
|
|
||||||
"go.dtapp.net/goarray"
|
|
||||||
"go.dtapp.net/goip"
|
|
||||||
"go.dtapp.net/gojobs/jobs_gorm_model"
|
|
||||||
"go.dtapp.net/golog"
|
|
||||||
"log"
|
|
||||||
"runtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
type JobsGormConfig struct {
|
|
||||||
GormClient *dorm.GormClient // 数据库驱动
|
|
||||||
RedisClient *dorm.RedisClient // 缓存数据库驱动
|
|
||||||
LogClient *golog.ZapLog // 日志驱动
|
|
||||||
LogDebug bool // 日志开关
|
|
||||||
CurrentIp string // 当前ip
|
|
||||||
LockKeyPrefix string // 锁Key前缀 xxx_lock
|
|
||||||
LockKeySeparator string // 锁Key分隔符 :
|
|
||||||
CornKeyPrefix string // 任务Key前缀 xxx_cron
|
|
||||||
CornKeyCustom string // 任务Key自定义 xxx_cron_自定义 xxx_cron_自定义_*
|
|
||||||
}
|
|
||||||
|
|
||||||
// JobsGorm Gorm数据库驱动
|
|
||||||
type JobsGorm struct {
|
|
||||||
gormClient *dorm.GormClient // 数据库服务
|
|
||||||
redisClient *dorm.RedisClient // 缓存服务
|
|
||||||
lockClient *dorm.RedisClientLock // 锁服务
|
|
||||||
logClient *golog.ZapLog // 日志服务
|
|
||||||
config struct {
|
|
||||||
logDebug bool // 日志开关
|
|
||||||
runVersion string // 运行版本
|
|
||||||
os string // 系统类型
|
|
||||||
arch string // 系统架构
|
|
||||||
maxProCs int // CPU核数
|
|
||||||
version string // GO版本
|
|
||||||
macAddrS string // Mac地址
|
|
||||||
insideIp string // 内网ip
|
|
||||||
outsideIp string // 外网ip
|
|
||||||
lockKeyPrefix string // 锁Key前缀 xxx_lock
|
|
||||||
lockKeySeparator string // 锁Key分隔符 :
|
|
||||||
cornKeyPrefix string // 任务Key前缀 xxx_cron
|
|
||||||
cornKeyCustom string // 任务Key自定义
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewJobsGorm 初始化
|
|
||||||
func NewJobsGorm(config *JobsGormConfig) (*JobsGorm, error) {
|
|
||||||
|
|
||||||
// 判断
|
|
||||||
if config.LockKeyPrefix == "" {
|
|
||||||
return nil, errors.New("需要配置锁Key前缀")
|
|
||||||
}
|
|
||||||
if config.LockKeySeparator == "" {
|
|
||||||
return nil, errors.New("需要配置锁Key分隔符")
|
|
||||||
}
|
|
||||||
if config.CornKeyPrefix == "" {
|
|
||||||
return nil, errors.New("需要配置任务Key前缀")
|
|
||||||
}
|
|
||||||
if config.CornKeyCustom == "" {
|
|
||||||
return nil, errors.New("需要配置任务Key自定义")
|
|
||||||
}
|
|
||||||
if config.CurrentIp == "" {
|
|
||||||
return nil, errors.New("需要配置当前的IP")
|
|
||||||
}
|
|
||||||
|
|
||||||
if config.GormClient.Db == nil {
|
|
||||||
return nil, errors.New("需要配置数据库驱动")
|
|
||||||
}
|
|
||||||
if config.RedisClient.Db == nil {
|
|
||||||
return nil, errors.New("需要配置缓存数据库驱动")
|
|
||||||
}
|
|
||||||
|
|
||||||
c := &JobsGorm{}
|
|
||||||
c.gormClient = config.GormClient
|
|
||||||
c.redisClient = config.RedisClient
|
|
||||||
c.lockClient = c.redisClient.NewLock()
|
|
||||||
c.logClient = config.LogClient
|
|
||||||
|
|
||||||
c.config.outsideIp = config.CurrentIp
|
|
||||||
c.config.lockKeyPrefix = config.LockKeyPrefix
|
|
||||||
c.config.lockKeySeparator = config.LockKeySeparator
|
|
||||||
c.config.cornKeyPrefix = config.CornKeyPrefix
|
|
||||||
c.config.cornKeyCustom = config.CornKeyCustom
|
|
||||||
c.config.logDebug = config.LogDebug
|
|
||||||
|
|
||||||
// 配置信息
|
|
||||||
c.config.runVersion = Version
|
|
||||||
c.config.os = runtime.GOOS
|
|
||||||
c.config.arch = runtime.GOARCH
|
|
||||||
c.config.maxProCs = runtime.GOMAXPROCS(0)
|
|
||||||
c.config.version = runtime.Version()
|
|
||||||
c.config.macAddrS = goarray.TurnString(goip.GetMacAddr(context.Background()))
|
|
||||||
c.config.insideIp = goip.GetInsideIp(context.Background())
|
|
||||||
|
|
||||||
// 创建模型
|
|
||||||
err := c.gormClient.Db.AutoMigrate(
|
|
||||||
&jobs_gorm_model.Task{},
|
|
||||||
&jobs_gorm_model.TaskLog{},
|
|
||||||
&jobs_gorm_model.TaskLogRun{},
|
|
||||||
&jobs_gorm_model.TaskIp{},
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.New(fmt.Sprintf("创建任务模型失败:%v\n", err))
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.config.logDebug == true {
|
|
||||||
log.Printf("[jobs.NewJobsGorm]%+v\n", c.config)
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, nil
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
package gojobs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/go-redis/redis/v9"
|
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetDb 获取数据库驱动
|
|
||||||
func (j *JobsGorm) GetDb() *gorm.DB {
|
|
||||||
return j.gormClient.Db
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRedis 获取缓存数据库驱动
|
|
||||||
func (j *JobsGorm) GetRedis() *redis.Client {
|
|
||||||
return j.redisClient.Db
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetCurrentIp 获取当前ip
|
|
||||||
func (j *JobsGorm) GetCurrentIp() string {
|
|
||||||
return j.config.outsideIp
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSubscribeAddress 获取订阅地址
|
|
||||||
func (j *JobsGorm) GetSubscribeAddress() string {
|
|
||||||
return j.config.cornKeyPrefix + "_" + j.config.cornKeyCustom
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
package gojobs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"go.dtapp.net/goip"
|
|
||||||
"go.dtapp.net/gojobs/jobs_gorm_model"
|
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RefreshIp 刷新Ip
|
|
||||||
func (j *JobsGorm) RefreshIp(ctx context.Context, tx *gorm.DB) {
|
|
||||||
xip := goip.GetOutsideIp(ctx)
|
|
||||||
if j.config.outsideIp == "" || j.config.outsideIp == "0.0.0.0" {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if j.config.outsideIp == xip {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
tx.Where("ips = ?", j.config.outsideIp).Delete(&jobs_gorm_model.TaskIp{}) // 删除
|
|
||||||
j.config.outsideIp = xip
|
|
||||||
}
|
|
@ -1,219 +0,0 @@
|
|||||||
package gojobs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"go.dtapp.net/gojobs/jobs_gorm_model"
|
|
||||||
"gorm.io/gorm"
|
|
||||||
"log"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TaskTakeId 查询单任务
|
|
||||||
func (j *JobsGorm) TaskTakeId(tx *gorm.DB, id uint) (result jobs_gorm_model.Task) {
|
|
||||||
tx.Where("id = ?", id).Take(&result)
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskTake 查询单任务
|
|
||||||
func (j *JobsGorm) TaskTake(tx *gorm.DB, customId string) (result jobs_gorm_model.Task) {
|
|
||||||
tx.Where("custom_id = ?", customId).Take(&result)
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// 查询单任务
|
|
||||||
func (j *JobsGorm) taskTake(tx *gorm.DB, customId, status string) (result jobs_gorm_model.Task) {
|
|
||||||
tx.Where("custom_id = ?", customId).Where("status = ?", status).Take(&result)
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskTakeIn 查询单任务 - 任务运行
|
|
||||||
func (j *JobsGorm) TaskTakeIn(tx *gorm.DB, customId string) jobs_gorm_model.Task {
|
|
||||||
return j.taskTake(tx, customId, TASK_IN)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskTakeSuccess 查询单任务 - 任务完成
|
|
||||||
func (j *JobsGorm) TaskTakeSuccess(tx *gorm.DB, customId string) jobs_gorm_model.Task {
|
|
||||||
return j.taskTake(tx, customId, TASK_SUCCESS)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskTakeError 查询单任务 - 任务异常
|
|
||||||
func (j *JobsGorm) TaskTakeError(tx *gorm.DB, customId string) jobs_gorm_model.Task {
|
|
||||||
return j.taskTake(tx, customId, TASK_ERROR)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskTakeTimeout 查询单任务 - 任务超时
|
|
||||||
func (j *JobsGorm) TaskTakeTimeout(tx *gorm.DB, customId string) jobs_gorm_model.Task {
|
|
||||||
return j.taskTake(tx, customId, TASK_TIMEOUT)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskTakeWait 查询单任务 - 任务等待
|
|
||||||
func (j *JobsGorm) TaskTakeWait(tx *gorm.DB, customId string) jobs_gorm_model.Task {
|
|
||||||
return j.taskTake(tx, customId, TASK_WAIT)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskTypeTake 查询单任务
|
|
||||||
func (j *JobsGorm) TaskTypeTake(tx *gorm.DB, customId, Type string) (result jobs_gorm_model.Task) {
|
|
||||||
tx.Where("custom_id = ?", customId).Where("type = ?", Type).Take(&result)
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// 查询单任务
|
|
||||||
func (j *JobsGorm) taskTypeTake(tx *gorm.DB, customId, Type, status string) (result jobs_gorm_model.Task) {
|
|
||||||
tx.Where("custom_id = ?", customId).Where("type = ?", Type).Where("status = ?", status).Take(&result)
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskTypeTakeIn 查询单任务 - 任务运行
|
|
||||||
func (j *JobsGorm) TaskTypeTakeIn(tx *gorm.DB, customId, Type string) jobs_gorm_model.Task {
|
|
||||||
return j.taskTypeTake(tx, customId, Type, TASK_IN)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskTypeTakeSuccess 查询单任务 - 任务完成
|
|
||||||
func (j *JobsGorm) TaskTypeTakeSuccess(tx *gorm.DB, customId, Type string) jobs_gorm_model.Task {
|
|
||||||
return j.taskTypeTake(tx, customId, Type, TASK_SUCCESS)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskTypeTakeError 查询单任务 - 任务异常
|
|
||||||
func (j *JobsGorm) TaskTypeTakeError(tx *gorm.DB, customId, Type string) jobs_gorm_model.Task {
|
|
||||||
return j.taskTypeTake(tx, customId, Type, TASK_ERROR)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskTypeTakeTimeout 查询单任务 - 任务超时
|
|
||||||
func (j *JobsGorm) TaskTypeTakeTimeout(tx *gorm.DB, customId, Type string) jobs_gorm_model.Task {
|
|
||||||
return j.taskTypeTake(tx, customId, Type, TASK_TIMEOUT)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskTypeTakeWait 查询单任务 - 任务等待
|
|
||||||
func (j *JobsGorm) TaskTypeTakeWait(tx *gorm.DB, customId, Type string) jobs_gorm_model.Task {
|
|
||||||
return j.taskTypeTake(tx, customId, Type, TASK_WAIT)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskFindAll 查询多任务
|
|
||||||
func (j *JobsGorm) TaskFindAll(tx *gorm.DB, frequency int64) (results []jobs_gorm_model.Task) {
|
|
||||||
tx.Where("frequency = ?", frequency).Order("id asc").Find(&results)
|
|
||||||
return results
|
|
||||||
}
|
|
||||||
|
|
||||||
// 查询多任务
|
|
||||||
func (j *JobsGorm) taskFindAll(tx *gorm.DB, frequency int64, status string) (results []jobs_gorm_model.Task) {
|
|
||||||
tx.Where("frequency = ?", frequency).Where("status = ?", status).Order("id asc").Find(&results)
|
|
||||||
return results
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskFindAllIn 查询多任务 - 任务运行
|
|
||||||
func (j *JobsGorm) TaskFindAllIn(tx *gorm.DB, frequency int64) []jobs_gorm_model.Task {
|
|
||||||
return j.taskFindAll(tx, frequency, TASK_IN)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskFindAllSuccess 查询多任务 - 任务完成
|
|
||||||
func (j *JobsGorm) TaskFindAllSuccess(tx *gorm.DB, frequency int64) []jobs_gorm_model.Task {
|
|
||||||
return j.taskFindAll(tx, frequency, TASK_SUCCESS)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskFindAllError 查询多任务 - 任务异常
|
|
||||||
func (j *JobsGorm) TaskFindAllError(tx *gorm.DB, frequency int64) []jobs_gorm_model.Task {
|
|
||||||
return j.taskFindAll(tx, frequency, TASK_ERROR)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskFindAllTimeout 查询多任务 - 任务超时
|
|
||||||
func (j *JobsGorm) TaskFindAllTimeout(tx *gorm.DB, frequency int64) []jobs_gorm_model.Task {
|
|
||||||
return j.taskFindAll(tx, frequency, TASK_TIMEOUT)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskFindAllWait 查询多任务 - 任务等待
|
|
||||||
func (j *JobsGorm) TaskFindAllWait(tx *gorm.DB, frequency int64) []jobs_gorm_model.Task {
|
|
||||||
return j.taskFindAll(tx, frequency, TASK_WAIT)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StartTask 任务启动
|
|
||||||
func (j *JobsGorm) StartTask(tx *gorm.DB, id uint) error {
|
|
||||||
return j.EditTask(tx, id).
|
|
||||||
Select("status", "status_desc").
|
|
||||||
Updates(jobs_gorm_model.Task{
|
|
||||||
Status: TASK_IN,
|
|
||||||
StatusDesc: "启动任务",
|
|
||||||
}).Error
|
|
||||||
}
|
|
||||||
|
|
||||||
// StartTaskCustom 任务启动自定义
|
|
||||||
func (j *JobsGorm) StartTaskCustom(tx *gorm.DB, customId string, customSequence int64) error {
|
|
||||||
return tx.Model(&jobs_gorm_model.Task{}).
|
|
||||||
Where("custom_id = ?", customId).
|
|
||||||
Where("custom_sequence = ?", customSequence).
|
|
||||||
Where("status = ?", TASK_WAIT).
|
|
||||||
Select("status", "status_desc").
|
|
||||||
Updates(jobs_gorm_model.Task{
|
|
||||||
Status: TASK_IN,
|
|
||||||
StatusDesc: "启动任务",
|
|
||||||
}).Error
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditTask 任务修改
|
|
||||||
func (j *JobsGorm) EditTask(tx *gorm.DB, id uint) *gorm.DB {
|
|
||||||
return tx.Model(&jobs_gorm_model.Task{}).Where("id = ?", id)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateFrequency 更新任务频率
|
|
||||||
func (j *JobsGorm) UpdateFrequency(tx *gorm.DB, id uint, frequency int64) *gorm.DB {
|
|
||||||
return j.EditTask(tx, id).
|
|
||||||
Select("frequency").
|
|
||||||
Updates(jobs_gorm_model.Task{
|
|
||||||
Frequency: frequency,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (j *JobsGorm) taskIpTake(tx *gorm.DB, taskType, ips string) (result jobs_gorm_model.TaskIp) {
|
|
||||||
tx.Where("task_type = ?", taskType).Where("ips = ?", ips).Take(&result)
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskIpUpdate 更新ip
|
|
||||||
func (j *JobsGorm) TaskIpUpdate(tx *gorm.DB, taskType, ips string) *gorm.DB {
|
|
||||||
query := j.taskIpTake(tx, taskType, ips)
|
|
||||||
if query.Id != 0 {
|
|
||||||
return tx
|
|
||||||
}
|
|
||||||
updateStatus := tx.Create(&jobs_gorm_model.TaskIp{
|
|
||||||
TaskType: taskType,
|
|
||||||
Ips: ips,
|
|
||||||
})
|
|
||||||
if updateStatus.RowsAffected == 0 {
|
|
||||||
log.Println("任务更新失败:", updateStatus.Error)
|
|
||||||
}
|
|
||||||
return updateStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskIpInit 实例任务ip
|
|
||||||
func (j *JobsGorm) TaskIpInit(tx *gorm.DB, ips map[string]string) bool {
|
|
||||||
if j.config.outsideIp == "" || j.config.outsideIp == "0.0.0.0" {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
tx.Where("ips = ?", j.config.outsideIp).Delete(&jobs_gorm_model.TaskIp{}) // 删除
|
|
||||||
for k, v := range ips {
|
|
||||||
if v == "" {
|
|
||||||
j.TaskIpUpdate(tx, k, j.config.outsideIp)
|
|
||||||
} else {
|
|
||||||
find := strings.Contains(v, ",")
|
|
||||||
if find == true {
|
|
||||||
// 包含
|
|
||||||
parts := strings.Split(v, ",")
|
|
||||||
for _, vv := range parts {
|
|
||||||
if vv == j.config.outsideIp {
|
|
||||||
j.TaskIpUpdate(tx, k, j.config.outsideIp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// 不包含
|
|
||||||
if v == j.config.outsideIp {
|
|
||||||
j.TaskIpUpdate(tx, k, j.config.outsideIp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskLogRunTake 查询任务执行日志
|
|
||||||
func (j *JobsGorm) TaskLogRunTake(tx *gorm.DB, taskId uint, runId string) (result jobs_gorm_model.TaskLogRun) {
|
|
||||||
tx.Select("id", "os", "arch", "outside_ip", "created_at").Where("task_id = ?", taskId).Where("run_id = ?", runId).Take(&result)
|
|
||||||
return result
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
package gojobs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/go-redis/redis/v9"
|
|
||||||
"log"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Publish 发布
|
|
||||||
// ctx 上下文
|
|
||||||
// channel 频道
|
|
||||||
// message 消息
|
|
||||||
func (j *JobsGorm) Publish(ctx context.Context, channel string, message interface{}) error {
|
|
||||||
publish, err := j.redisClient.Publish(ctx, channel, message).Result()
|
|
||||||
if j.config.logDebug == true {
|
|
||||||
log.Printf("[jobs.Publish] %s %s %v %s\n", channel, message, publish, err)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
type SubscribeResult struct {
|
|
||||||
err error
|
|
||||||
Message *redis.PubSub
|
|
||||||
}
|
|
||||||
|
|
||||||
// Subscribe 订阅
|
|
||||||
func (j *JobsGorm) Subscribe(ctx context.Context) SubscribeResult {
|
|
||||||
return SubscribeResult{
|
|
||||||
Message: j.redisClient.Subscribe(ctx, j.config.cornKeyPrefix+"_"+j.config.cornKeyCustom),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PSubscribe 订阅,支持通配符匹配(ch_user_*)
|
|
||||||
func (j *JobsGorm) PSubscribe(ctx context.Context) SubscribeResult {
|
|
||||||
return SubscribeResult{
|
|
||||||
Message: j.redisClient.PSubscribe(ctx, j.config.cornKeyPrefix+"_"+j.config.cornKeyCustom+"_*"),
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,34 @@
|
|||||||
|
package jobs_mongo_model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Task 任务
|
||||||
|
type Task struct {
|
||||||
|
Id primitive.ObjectID `json:"id,omitempty" bson:"_id,omitempty"` // 记录编号
|
||||||
|
Status string `json:"status,omitempty" bson:"status,omitempty"` // 状态码
|
||||||
|
Params string `json:"params,omitempty" bson:"params,omitempty"` // 参数
|
||||||
|
ParamsType string `json:"params_type,omitempty" bson:"params_type,omitempty"` // 参数类型
|
||||||
|
StatusDesc string `json:"status_desc,omitempty" bson:"status_desc,omitempty"` // 状态描述
|
||||||
|
Frequency int64 `json:"frequency,omitempty" bson:"frequency,omitempty"` // 频率(秒单位)
|
||||||
|
Number int64 `json:"number,omitempty" bson:"number,omitempty"` // 当前次数
|
||||||
|
MaxNumber int64 `json:"max_number,omitempty" bson:"max_number,omitempty"` // 最大次数
|
||||||
|
RunId string `json:"run_id,omitempty" bson:"run_id,omitempty"` // 执行编号
|
||||||
|
CustomId string `json:"custom_id,omitempty" bson:"custom_id,omitempty"` // 自定义编号
|
||||||
|
CustomSequence int64 `json:"custom_sequence,omitempty" bson:"custom_sequence,omitempty"` // 自定义顺序
|
||||||
|
Type string `json:"type,omitempty" bson:"type,omitempty"` // 类型
|
||||||
|
TypeName string `json:"type_name,omitempty" bson:"type_name,omitempty"` // 类型名称
|
||||||
|
CreatedIp string `json:"created_ip,omitempty" bson:"created_ip,omitempty"` // 创建外网IP
|
||||||
|
SpecifyIp string `json:"specify_ip,omitempty" bson:"specify_ip,omitempty"` // 指定外网IP
|
||||||
|
UpdatedIp string `json:"updated_ip,omitempty" bson:"updated_ip,omitempty"` // 更新外网IP
|
||||||
|
Result string `json:"result,omitempty" bson:"result,omitempty"` // 结果
|
||||||
|
NextRunTime primitive.DateTime `json:"next_run_time,omitempty" bson:"next_run_time,omitempty"` // 下次运行时间
|
||||||
|
CreatedAt primitive.DateTime `json:"created_at,omitempty" bson:"created_at,omitempty"` // 创建时间
|
||||||
|
UpdatedAt primitive.DateTime `json:"updated_at,omitempty" bson:"updated_at,omitempty"` // 更新时间
|
||||||
|
DeletedAt primitive.DateTime `json:"deleted_at,omitempty" bson:"deleted_at,omitempty"` // 删除时间
|
||||||
|
}
|
||||||
|
|
||||||
|
func (Task) TableName() string {
|
||||||
|
return "task"
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package jobs_mongo_model
|
||||||
|
|
||||||
|
import "go.mongodb.org/mongo-driver/bson/primitive"
|
||||||
|
|
||||||
|
// TaskIp 任务Ip
|
||||||
|
type TaskIp struct {
|
||||||
|
Id primitive.ObjectID `json:"id,omitempty" bson:"_id,omitempty"` // 记录编号
|
||||||
|
TaskType string `json:"task_type,omitempty" bson:"task_type,omitempty"` // 任务编号
|
||||||
|
Ips string `json:"ips,omitempty" bson:"ips,omitempty"` // 任务IP
|
||||||
|
}
|
||||||
|
|
||||||
|
func (TaskIp) TableName() string {
|
||||||
|
return "task_ip"
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package jobs_mongo_model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TaskLog 任务日志模型
|
||||||
|
type TaskLog struct {
|
||||||
|
Id primitive.ObjectID `json:"id,omitempty" bson:"_id,omitempty"` // 记录编号
|
||||||
|
TaskId uint `json:"task_id,omitempty" bson:"task_id,omitempty"` // 任务编号
|
||||||
|
StatusCode int `json:"status_code,omitempty" bson:"status_code,omitempty"` // 状态码
|
||||||
|
Desc string `json:"desc,omitempty" bson:"desc,omitempty"` // 结果
|
||||||
|
Version string `json:"version,omitempty" bson:"version,omitempty"` // 版本
|
||||||
|
CreatedAt primitive.DateTime `json:"created_at,omitempty" bson:"created_at,omitempty"` // 创建时间
|
||||||
|
}
|
||||||
|
|
||||||
|
func (TaskLog) TableName() string {
|
||||||
|
return "task_log"
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package jobs_mongo_model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TaskLogRun 任务执行日志模型
|
||||||
|
type TaskLogRun struct {
|
||||||
|
Id primitive.ObjectID `json:"id,omitempty" bson:"_id,omitempty"` // 记录编号
|
||||||
|
TaskId uint `json:"task_id,omitempty" bson:"task_id,omitempty"` // 任务编号
|
||||||
|
RunId string `json:"run_id,omitempty" bson:"run_id,omitempty"` // 执行编号
|
||||||
|
OutsideIp string `json:"outside_ip,omitempty" bson:"outside_ip,omitempty"` // 外网ip
|
||||||
|
InsideIp string `json:"inside_ip,omitempty" bson:"inside_ip,omitempty"` // 内网ip
|
||||||
|
Os string `json:"os,omitempty" bson:"os,omitempty"` // 系统类型
|
||||||
|
Arch string `json:"arch,omitempty" bson:"arch,omitempty"` // 系统架构
|
||||||
|
Gomaxprocs int `json:"gomaxprocs,omitempty" bson:"gomaxprocs,omitempty"` // CPU核数
|
||||||
|
GoVersion string `json:"go_version,omitempty" bson:"go_version,omitempty"` // GO版本
|
||||||
|
MacAddrs string `json:"mac_addrs,omitempty" bson:"mac_addrs,omitempty"` // Mac地址
|
||||||
|
CreatedAt primitive.DateTime `json:"created_at,omitempty" bson:"created_at,omitempty"` // 创建时间
|
||||||
|
}
|
||||||
|
|
||||||
|
func (TaskLogRun) TableName() string {
|
||||||
|
return "task_log_run"
|
||||||
|
}
|
@ -0,0 +1,140 @@
|
|||||||
|
package gojobs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"go.dtapp.net/gojobs/jobs_gorm_model"
|
||||||
|
"go.dtapp.net/gojobs/jobs_mongo_model"
|
||||||
|
"go.mongodb.org/mongo-driver/bson"
|
||||||
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 创建模型
|
||||||
|
func (c *Client) autoMigrateTask() {
|
||||||
|
log.Println(c.db.gormClient.Db.AutoMigrate(&jobs_gorm_model.Task{}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建模型
|
||||||
|
func (c *Client) autoMigrateTaskIp() {
|
||||||
|
log.Println(c.db.gormClient.Db.AutoMigrate(&jobs_gorm_model.TaskIp{}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建模型
|
||||||
|
func (c *Client) autoMigrateTaskLog() {
|
||||||
|
log.Println(c.db.gormClient.Db.AutoMigrate(&jobs_gorm_model.TaskLog{}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建模型
|
||||||
|
func (c *Client) autoMigrateTaskLogRun() {
|
||||||
|
log.Println(c.db.gormClient.Db.AutoMigrate(&jobs_gorm_model.TaskLogRun{}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建时间序列集合
|
||||||
|
func (c *Client) mongoCreateCollectionTask(ctx context.Context) {
|
||||||
|
var commandResult bson.M
|
||||||
|
commandErr := c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).RunCommand(ctx, bson.D{{
|
||||||
|
"listCollections", 1,
|
||||||
|
}}).Decode(&commandResult)
|
||||||
|
if commandErr != nil {
|
||||||
|
log.Println("检查时间序列集合:", commandErr)
|
||||||
|
} else {
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).CreateCollection(ctx, jobs_mongo_model.Task{}.TableName(), options.CreateCollection().SetTimeSeriesOptions(options.TimeSeries().SetTimeField("created_at"))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建索引
|
||||||
|
func (c *Client) mongoCreateIndexesTask(ctx context.Context) {
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.Task{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"status", 1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.Task{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"frequency", 1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.Task{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"custom_id", 1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.Task{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"type", 1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.Task{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"created_ip", 1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.Task{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"specify_ip", 1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.Task{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"updated_ip", 1},
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建索引
|
||||||
|
func (c *Client) mongoCreateIndexesTaskIp(ctx context.Context) {
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.TaskIp{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"task_type", 1},
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建时间序列集合
|
||||||
|
func (c *Client) mongoCreateCollectionTaskLog(ctx context.Context) {
|
||||||
|
var commandResult bson.M
|
||||||
|
commandErr := c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).RunCommand(ctx, bson.D{{
|
||||||
|
"listCollections", 1,
|
||||||
|
}}).Decode(&commandResult)
|
||||||
|
if commandErr != nil {
|
||||||
|
log.Println("检查时间序列集合:", commandErr)
|
||||||
|
} else {
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).CreateCollection(ctx, jobs_mongo_model.TaskLog{}.TableName(), options.CreateCollection().SetTimeSeriesOptions(options.TimeSeries().SetTimeField("created_at"))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建索引
|
||||||
|
func (c *Client) mongoCreateIndexesTaskLog(ctx context.Context) {
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.TaskLog{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"task_id", -1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.TaskLog{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"status_code", -1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.TaskLog{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"version", -1},
|
||||||
|
}}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建时间序列集合
|
||||||
|
func (c *Client) mongoCreateCollectionTaskLogRun(ctx context.Context) {
|
||||||
|
var commandResult bson.M
|
||||||
|
commandErr := c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).RunCommand(ctx, bson.D{{
|
||||||
|
"listCollections", 1,
|
||||||
|
}}).Decode(&commandResult)
|
||||||
|
if commandErr != nil {
|
||||||
|
log.Println("检查时间序列集合:", commandErr)
|
||||||
|
} else {
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).CreateCollection(ctx, jobs_mongo_model.TaskLogRun{}.TableName(), options.CreateCollection().SetTimeSeriesOptions(options.TimeSeries().SetTimeField("created_at"))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建索引
|
||||||
|
func (c *Client) mongoCreateIndexesTaskLogRun(ctx context.Context) {
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.TaskLog{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"task_id", -1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.TaskLog{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"run_id", -1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.TaskLog{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"outside_ip", -1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.TaskLog{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"inside_ip", -1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.TaskLog{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"os", -1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.TaskLog{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"arch", -1},
|
||||||
|
}}))
|
||||||
|
log.Println(c.db.mongoClient.Db.Database(c.db.mongoDatabaseName).Collection(jobs_mongo_model.TaskLog{}.TableName()).Indexes().CreateOne(ctx, mongo.IndexModel{Keys: bson.D{
|
||||||
|
{"go_version", -1},
|
||||||
|
}}))
|
||||||
|
}
|
@ -1,221 +0,0 @@
|
|||||||
// 版本
|
|
||||||
|
|
||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// versions:
|
|
||||||
// protoc-gen-go v1.28.0
|
|
||||||
// protoc v3.19.4
|
|
||||||
// source: pb/basics.proto
|
|
||||||
|
|
||||||
// 包名
|
|
||||||
|
|
||||||
package pb
|
|
||||||
|
|
||||||
import (
|
|
||||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
reflect "reflect"
|
|
||||||
sync "sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Verify that this generated code is sufficiently up-to-date.
|
|
||||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
|
||||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
|
||||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
|
||||||
)
|
|
||||||
|
|
||||||
// 请求消息
|
|
||||||
type BasicsRequest struct {
|
|
||||||
state protoimpl.MessageState
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
|
|
||||||
Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *BasicsRequest) Reset() {
|
|
||||||
*x = BasicsRequest{}
|
|
||||||
if protoimpl.UnsafeEnabled {
|
|
||||||
mi := &file_pb_basics_proto_msgTypes[0]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *BasicsRequest) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*BasicsRequest) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *BasicsRequest) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_pb_basics_proto_msgTypes[0]
|
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
if ms.LoadMessageInfo() == nil {
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
return mi.MessageOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: Use BasicsRequest.ProtoReflect.Descriptor instead.
|
|
||||||
func (*BasicsRequest) Descriptor() ([]byte, []int) {
|
|
||||||
return file_pb_basics_proto_rawDescGZIP(), []int{0}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *BasicsRequest) GetMessage() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Message
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// 响应消息
|
|
||||||
type BasicsResponse struct {
|
|
||||||
state protoimpl.MessageState
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
|
|
||||||
Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *BasicsResponse) Reset() {
|
|
||||||
*x = BasicsResponse{}
|
|
||||||
if protoimpl.UnsafeEnabled {
|
|
||||||
mi := &file_pb_basics_proto_msgTypes[1]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *BasicsResponse) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*BasicsResponse) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *BasicsResponse) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_pb_basics_proto_msgTypes[1]
|
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
if ms.LoadMessageInfo() == nil {
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
return mi.MessageOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: Use BasicsResponse.ProtoReflect.Descriptor instead.
|
|
||||||
func (*BasicsResponse) Descriptor() ([]byte, []int) {
|
|
||||||
return file_pb_basics_proto_rawDescGZIP(), []int{1}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *BasicsResponse) GetMessage() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Message
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
var File_pb_basics_proto protoreflect.FileDescriptor
|
|
||||||
|
|
||||||
var file_pb_basics_proto_rawDesc = []byte{
|
|
||||||
0x0a, 0x0f, 0x70, 0x62, 0x2f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,
|
|
||||||
0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0x29, 0x0a, 0x0d, 0x42, 0x61, 0x73, 0x69, 0x63, 0x73, 0x52,
|
|
||||||
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
|
|
||||||
0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
|
|
||||||
0x22, 0x2a, 0x0a, 0x0e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
|
|
||||||
0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20,
|
|
||||||
0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x6a, 0x0a, 0x06,
|
|
||||||
0x42, 0x61, 0x73, 0x69, 0x63, 0x73, 0x12, 0x2f, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x11,
|
|
||||||
0x2e, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
|
|
||||||
0x74, 0x1a, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73,
|
|
||||||
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x04, 0x50, 0x6f, 0x6e, 0x67, 0x12,
|
|
||||||
0x11, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
|
|
||||||
0x73, 0x74, 0x1a, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x73, 0x52, 0x65,
|
|
||||||
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x2e, 0x2f, 0x70,
|
|
||||||
0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
file_pb_basics_proto_rawDescOnce sync.Once
|
|
||||||
file_pb_basics_proto_rawDescData = file_pb_basics_proto_rawDesc
|
|
||||||
)
|
|
||||||
|
|
||||||
func file_pb_basics_proto_rawDescGZIP() []byte {
|
|
||||||
file_pb_basics_proto_rawDescOnce.Do(func() {
|
|
||||||
file_pb_basics_proto_rawDescData = protoimpl.X.CompressGZIP(file_pb_basics_proto_rawDescData)
|
|
||||||
})
|
|
||||||
return file_pb_basics_proto_rawDescData
|
|
||||||
}
|
|
||||||
|
|
||||||
var file_pb_basics_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
|
|
||||||
var file_pb_basics_proto_goTypes = []interface{}{
|
|
||||||
(*BasicsRequest)(nil), // 0: pb.BasicsRequest
|
|
||||||
(*BasicsResponse)(nil), // 1: pb.BasicsResponse
|
|
||||||
}
|
|
||||||
var file_pb_basics_proto_depIdxs = []int32{
|
|
||||||
0, // 0: pb.Basics.Ping:input_type -> pb.BasicsRequest
|
|
||||||
0, // 1: pb.Basics.Pong:input_type -> pb.BasicsRequest
|
|
||||||
1, // 2: pb.Basics.Ping:output_type -> pb.BasicsResponse
|
|
||||||
1, // 3: pb.Basics.Pong:output_type -> pb.BasicsResponse
|
|
||||||
2, // [2:4] is the sub-list for method output_type
|
|
||||||
0, // [0:2] is the sub-list for method input_type
|
|
||||||
0, // [0:0] is the sub-list for extension type_name
|
|
||||||
0, // [0:0] is the sub-list for extension extendee
|
|
||||||
0, // [0:0] is the sub-list for field type_name
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { file_pb_basics_proto_init() }
|
|
||||||
func file_pb_basics_proto_init() {
|
|
||||||
if File_pb_basics_proto != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !protoimpl.UnsafeEnabled {
|
|
||||||
file_pb_basics_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
|
||||||
switch v := v.(*BasicsRequest); i {
|
|
||||||
case 0:
|
|
||||||
return &v.state
|
|
||||||
case 1:
|
|
||||||
return &v.sizeCache
|
|
||||||
case 2:
|
|
||||||
return &v.unknownFields
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file_pb_basics_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
|
||||||
switch v := v.(*BasicsResponse); i {
|
|
||||||
case 0:
|
|
||||||
return &v.state
|
|
||||||
case 1:
|
|
||||||
return &v.sizeCache
|
|
||||||
case 2:
|
|
||||||
return &v.unknownFields
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
type x struct{}
|
|
||||||
out := protoimpl.TypeBuilder{
|
|
||||||
File: protoimpl.DescBuilder{
|
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
|
||||||
RawDescriptor: file_pb_basics_proto_rawDesc,
|
|
||||||
NumEnums: 0,
|
|
||||||
NumMessages: 2,
|
|
||||||
NumExtensions: 0,
|
|
||||||
NumServices: 1,
|
|
||||||
},
|
|
||||||
GoTypes: file_pb_basics_proto_goTypes,
|
|
||||||
DependencyIndexes: file_pb_basics_proto_depIdxs,
|
|
||||||
MessageInfos: file_pb_basics_proto_msgTypes,
|
|
||||||
}.Build()
|
|
||||||
File_pb_basics_proto = out.File
|
|
||||||
file_pb_basics_proto_rawDesc = nil
|
|
||||||
file_pb_basics_proto_goTypes = nil
|
|
||||||
file_pb_basics_proto_depIdxs = nil
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
// 版本
|
|
||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
// 包名
|
|
||||||
package pb;
|
|
||||||
|
|
||||||
// 别名
|
|
||||||
option go_package = "../pb";
|
|
||||||
|
|
||||||
// 定义服务
|
|
||||||
service Basics{
|
|
||||||
// 心跳
|
|
||||||
rpc Ping(BasicsRequest) returns (BasicsResponse){};
|
|
||||||
// 心跳
|
|
||||||
rpc Pong(BasicsRequest) returns (BasicsResponse){};
|
|
||||||
}
|
|
||||||
// 请求消息
|
|
||||||
message BasicsRequest {
|
|
||||||
string message = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 响应消息
|
|
||||||
message BasicsResponse {
|
|
||||||
string message = 1;
|
|
||||||
}
|
|
@ -1,145 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
|
|
||||||
// versions:
|
|
||||||
// - protoc-gen-go-grpc v1.2.0
|
|
||||||
// - protoc v3.19.4
|
|
||||||
// source: pb/basics.proto
|
|
||||||
|
|
||||||
package pb
|
|
||||||
|
|
||||||
import (
|
|
||||||
context "context"
|
|
||||||
grpc "google.golang.org/grpc"
|
|
||||||
codes "google.golang.org/grpc/codes"
|
|
||||||
status "google.golang.org/grpc/status"
|
|
||||||
)
|
|
||||||
|
|
||||||
// This is a compile-time assertion to ensure that this generated file
|
|
||||||
// is compatible with the grpc package it is being compiled against.
|
|
||||||
// Requires gRPC-Go v1.32.0 or later.
|
|
||||||
const _ = grpc.SupportPackageIsVersion7
|
|
||||||
|
|
||||||
// BasicsClient is the client API for Basics service.
|
|
||||||
//
|
|
||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
|
|
||||||
type BasicsClient interface {
|
|
||||||
// 心跳
|
|
||||||
Ping(ctx context.Context, in *BasicsRequest, opts ...grpc.CallOption) (*BasicsResponse, error)
|
|
||||||
// 心跳
|
|
||||||
Pong(ctx context.Context, in *BasicsRequest, opts ...grpc.CallOption) (*BasicsResponse, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type basicsClient struct {
|
|
||||||
cc grpc.ClientConnInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewBasicsClient(cc grpc.ClientConnInterface) BasicsClient {
|
|
||||||
return &basicsClient{cc}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *basicsClient) Ping(ctx context.Context, in *BasicsRequest, opts ...grpc.CallOption) (*BasicsResponse, error) {
|
|
||||||
out := new(BasicsResponse)
|
|
||||||
err := c.cc.Invoke(ctx, "/pb.Basics/Ping", in, out, opts...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *basicsClient) Pong(ctx context.Context, in *BasicsRequest, opts ...grpc.CallOption) (*BasicsResponse, error) {
|
|
||||||
out := new(BasicsResponse)
|
|
||||||
err := c.cc.Invoke(ctx, "/pb.Basics/Pong", in, out, opts...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// BasicsServer is the server API for Basics service.
|
|
||||||
// All implementations must embed UnimplementedBasicsServer
|
|
||||||
// for forward compatibility
|
|
||||||
type BasicsServer interface {
|
|
||||||
// 心跳
|
|
||||||
Ping(context.Context, *BasicsRequest) (*BasicsResponse, error)
|
|
||||||
// 心跳
|
|
||||||
Pong(context.Context, *BasicsRequest) (*BasicsResponse, error)
|
|
||||||
mustEmbedUnimplementedBasicsServer()
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnimplementedBasicsServer must be embedded to have forward compatible implementations.
|
|
||||||
type UnimplementedBasicsServer struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (UnimplementedBasicsServer) Ping(context.Context, *BasicsRequest) (*BasicsResponse, error) {
|
|
||||||
return nil, status.Errorf(codes.Unimplemented, "method Ping not implemented")
|
|
||||||
}
|
|
||||||
func (UnimplementedBasicsServer) Pong(context.Context, *BasicsRequest) (*BasicsResponse, error) {
|
|
||||||
return nil, status.Errorf(codes.Unimplemented, "method Pong not implemented")
|
|
||||||
}
|
|
||||||
func (UnimplementedBasicsServer) mustEmbedUnimplementedBasicsServer() {}
|
|
||||||
|
|
||||||
// UnsafeBasicsServer may be embedded to opt out of forward compatibility for this service.
|
|
||||||
// Use of this interface is not recommended, as added methods to BasicsServer will
|
|
||||||
// result in compilation errors.
|
|
||||||
type UnsafeBasicsServer interface {
|
|
||||||
mustEmbedUnimplementedBasicsServer()
|
|
||||||
}
|
|
||||||
|
|
||||||
func RegisterBasicsServer(s grpc.ServiceRegistrar, srv BasicsServer) {
|
|
||||||
s.RegisterService(&Basics_ServiceDesc, srv)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _Basics_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
|
||||||
in := new(BasicsRequest)
|
|
||||||
if err := dec(in); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if interceptor == nil {
|
|
||||||
return srv.(BasicsServer).Ping(ctx, in)
|
|
||||||
}
|
|
||||||
info := &grpc.UnaryServerInfo{
|
|
||||||
Server: srv,
|
|
||||||
FullMethod: "/pb.Basics/Ping",
|
|
||||||
}
|
|
||||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
|
||||||
return srv.(BasicsServer).Ping(ctx, req.(*BasicsRequest))
|
|
||||||
}
|
|
||||||
return interceptor(ctx, in, info, handler)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _Basics_Pong_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
|
||||||
in := new(BasicsRequest)
|
|
||||||
if err := dec(in); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if interceptor == nil {
|
|
||||||
return srv.(BasicsServer).Pong(ctx, in)
|
|
||||||
}
|
|
||||||
info := &grpc.UnaryServerInfo{
|
|
||||||
Server: srv,
|
|
||||||
FullMethod: "/pb.Basics/Pong",
|
|
||||||
}
|
|
||||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
|
||||||
return srv.(BasicsServer).Pong(ctx, req.(*BasicsRequest))
|
|
||||||
}
|
|
||||||
return interceptor(ctx, in, info, handler)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Basics_ServiceDesc is the grpc.ServiceDesc for Basics service.
|
|
||||||
// It's only intended for direct use with grpc.RegisterService,
|
|
||||||
// and not to be introspected or modified (even as a copy)
|
|
||||||
var Basics_ServiceDesc = grpc.ServiceDesc{
|
|
||||||
ServiceName: "pb.Basics",
|
|
||||||
HandlerType: (*BasicsServer)(nil),
|
|
||||||
Methods: []grpc.MethodDesc{
|
|
||||||
{
|
|
||||||
MethodName: "Ping",
|
|
||||||
Handler: _Basics_Ping_Handler,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
MethodName: "Pong",
|
|
||||||
Handler: _Basics_Pong_Handler,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Streams: []grpc.StreamDesc{},
|
|
||||||
Metadata: "pb/basics.proto",
|
|
||||||
}
|
|
@ -1,440 +0,0 @@
|
|||||||
// 版本
|
|
||||||
|
|
||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// versions:
|
|
||||||
// protoc-gen-go v1.28.0
|
|
||||||
// protoc v3.19.4
|
|
||||||
// source: pb/pubsub.proto
|
|
||||||
|
|
||||||
// 包名
|
|
||||||
|
|
||||||
package pb
|
|
||||||
|
|
||||||
import (
|
|
||||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
reflect "reflect"
|
|
||||||
sync "sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Verify that this generated code is sufficiently up-to-date.
|
|
||||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
|
||||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
|
||||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
|
||||||
)
|
|
||||||
|
|
||||||
// 请求消息
|
|
||||||
type PublishRequest struct {
|
|
||||||
state protoimpl.MessageState
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
|
|
||||||
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
|
|
||||||
Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
|
|
||||||
Method string `protobuf:"bytes,3,opt,name=method,proto3" json:"method,omitempty"`
|
|
||||||
Ip string `protobuf:"bytes,4,opt,name=ip,proto3" json:"ip,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PublishRequest) Reset() {
|
|
||||||
*x = PublishRequest{}
|
|
||||||
if protoimpl.UnsafeEnabled {
|
|
||||||
mi := &file_pb_pubsub_proto_msgTypes[0]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PublishRequest) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*PublishRequest) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *PublishRequest) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_pb_pubsub_proto_msgTypes[0]
|
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
if ms.LoadMessageInfo() == nil {
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
return mi.MessageOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: Use PublishRequest.ProtoReflect.Descriptor instead.
|
|
||||||
func (*PublishRequest) Descriptor() ([]byte, []int) {
|
|
||||||
return file_pb_pubsub_proto_rawDescGZIP(), []int{0}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PublishRequest) GetId() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Id
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PublishRequest) GetValue() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Value
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PublishRequest) GetMethod() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Method
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PublishRequest) GetIp() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Ip
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// 响应消息
|
|
||||||
type PublishResponse struct {
|
|
||||||
state protoimpl.MessageState
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
|
|
||||||
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
|
|
||||||
Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
|
|
||||||
Ip string `protobuf:"bytes,3,opt,name=ip,proto3" json:"ip,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PublishResponse) Reset() {
|
|
||||||
*x = PublishResponse{}
|
|
||||||
if protoimpl.UnsafeEnabled {
|
|
||||||
mi := &file_pb_pubsub_proto_msgTypes[1]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PublishResponse) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*PublishResponse) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *PublishResponse) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_pb_pubsub_proto_msgTypes[1]
|
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
if ms.LoadMessageInfo() == nil {
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
return mi.MessageOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: Use PublishResponse.ProtoReflect.Descriptor instead.
|
|
||||||
func (*PublishResponse) Descriptor() ([]byte, []int) {
|
|
||||||
return file_pb_pubsub_proto_rawDescGZIP(), []int{1}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PublishResponse) GetId() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Id
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PublishResponse) GetValue() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Value
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *PublishResponse) GetIp() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Ip
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// 请求消息
|
|
||||||
type SubscribeRequest struct {
|
|
||||||
state protoimpl.MessageState
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
|
|
||||||
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
|
|
||||||
Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
|
|
||||||
Method string `protobuf:"bytes,3,opt,name=method,proto3" json:"method,omitempty"`
|
|
||||||
Ip string `protobuf:"bytes,4,opt,name=ip,proto3" json:"ip,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *SubscribeRequest) Reset() {
|
|
||||||
*x = SubscribeRequest{}
|
|
||||||
if protoimpl.UnsafeEnabled {
|
|
||||||
mi := &file_pb_pubsub_proto_msgTypes[2]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *SubscribeRequest) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*SubscribeRequest) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *SubscribeRequest) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_pb_pubsub_proto_msgTypes[2]
|
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
if ms.LoadMessageInfo() == nil {
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
return mi.MessageOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead.
|
|
||||||
func (*SubscribeRequest) Descriptor() ([]byte, []int) {
|
|
||||||
return file_pb_pubsub_proto_rawDescGZIP(), []int{2}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *SubscribeRequest) GetId() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Id
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *SubscribeRequest) GetValue() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Value
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *SubscribeRequest) GetMethod() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Method
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *SubscribeRequest) GetIp() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Ip
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// 响应消息
|
|
||||||
type SubscribeResponse struct {
|
|
||||||
state protoimpl.MessageState
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
|
|
||||||
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
|
|
||||||
Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
|
|
||||||
Method string `protobuf:"bytes,3,opt,name=method,proto3" json:"method,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *SubscribeResponse) Reset() {
|
|
||||||
*x = SubscribeResponse{}
|
|
||||||
if protoimpl.UnsafeEnabled {
|
|
||||||
mi := &file_pb_pubsub_proto_msgTypes[3]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *SubscribeResponse) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*SubscribeResponse) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *SubscribeResponse) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_pb_pubsub_proto_msgTypes[3]
|
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
if ms.LoadMessageInfo() == nil {
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
return mi.MessageOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: Use SubscribeResponse.ProtoReflect.Descriptor instead.
|
|
||||||
func (*SubscribeResponse) Descriptor() ([]byte, []int) {
|
|
||||||
return file_pb_pubsub_proto_rawDescGZIP(), []int{3}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *SubscribeResponse) GetId() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Id
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *SubscribeResponse) GetValue() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Value
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *SubscribeResponse) GetMethod() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Method
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
var File_pb_pubsub_proto protoreflect.FileDescriptor
|
|
||||||
|
|
||||||
var file_pb_pubsub_proto_rawDesc = []byte{
|
|
||||||
0x0a, 0x0f, 0x70, 0x62, 0x2f, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74,
|
|
||||||
0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0x5e, 0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
|
|
||||||
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
|
|
||||||
0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
|
|
||||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a,
|
|
||||||
0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d,
|
|
||||||
0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28,
|
|
||||||
0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0x47, 0x0a, 0x0f, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
|
|
||||||
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
|
|
||||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
|
|
||||||
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x0e,
|
|
||||||
0x0a, 0x02, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0x60,
|
|
||||||
0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
|
|
||||||
0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
|
|
||||||
0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
|
|
||||||
0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68,
|
|
||||||
0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64,
|
|
||||||
0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70,
|
|
||||||
0x22, 0x51, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x73,
|
|
||||||
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
|
|
||||||
0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
|
|
||||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d,
|
|
||||||
0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74,
|
|
||||||
0x68, 0x6f, 0x64, 0x32, 0x78, 0x0a, 0x06, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x12, 0x32, 0x0a,
|
|
||||||
0x07, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75,
|
|
||||||
0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x70,
|
|
||||||
0x62, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
|
|
||||||
0x65, 0x12, 0x3a, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x14,
|
|
||||||
0x2e, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71,
|
|
||||||
0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72,
|
|
||||||
0x69, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, 0x07, 0x5a,
|
|
||||||
0x05, 0x2e, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
file_pb_pubsub_proto_rawDescOnce sync.Once
|
|
||||||
file_pb_pubsub_proto_rawDescData = file_pb_pubsub_proto_rawDesc
|
|
||||||
)
|
|
||||||
|
|
||||||
func file_pb_pubsub_proto_rawDescGZIP() []byte {
|
|
||||||
file_pb_pubsub_proto_rawDescOnce.Do(func() {
|
|
||||||
file_pb_pubsub_proto_rawDescData = protoimpl.X.CompressGZIP(file_pb_pubsub_proto_rawDescData)
|
|
||||||
})
|
|
||||||
return file_pb_pubsub_proto_rawDescData
|
|
||||||
}
|
|
||||||
|
|
||||||
var file_pb_pubsub_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
|
|
||||||
var file_pb_pubsub_proto_goTypes = []interface{}{
|
|
||||||
(*PublishRequest)(nil), // 0: pb.PublishRequest
|
|
||||||
(*PublishResponse)(nil), // 1: pb.PublishResponse
|
|
||||||
(*SubscribeRequest)(nil), // 2: pb.SubscribeRequest
|
|
||||||
(*SubscribeResponse)(nil), // 3: pb.SubscribeResponse
|
|
||||||
}
|
|
||||||
var file_pb_pubsub_proto_depIdxs = []int32{
|
|
||||||
0, // 0: pb.PubSub.Publish:input_type -> pb.PublishRequest
|
|
||||||
2, // 1: pb.PubSub.Subscribe:input_type -> pb.SubscribeRequest
|
|
||||||
1, // 2: pb.PubSub.Publish:output_type -> pb.PublishResponse
|
|
||||||
3, // 3: pb.PubSub.Subscribe:output_type -> pb.SubscribeResponse
|
|
||||||
2, // [2:4] is the sub-list for method output_type
|
|
||||||
0, // [0:2] is the sub-list for method input_type
|
|
||||||
0, // [0:0] is the sub-list for extension type_name
|
|
||||||
0, // [0:0] is the sub-list for extension extendee
|
|
||||||
0, // [0:0] is the sub-list for field type_name
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { file_pb_pubsub_proto_init() }
|
|
||||||
func file_pb_pubsub_proto_init() {
|
|
||||||
if File_pb_pubsub_proto != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !protoimpl.UnsafeEnabled {
|
|
||||||
file_pb_pubsub_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
|
||||||
switch v := v.(*PublishRequest); i {
|
|
||||||
case 0:
|
|
||||||
return &v.state
|
|
||||||
case 1:
|
|
||||||
return &v.sizeCache
|
|
||||||
case 2:
|
|
||||||
return &v.unknownFields
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file_pb_pubsub_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
|
||||||
switch v := v.(*PublishResponse); i {
|
|
||||||
case 0:
|
|
||||||
return &v.state
|
|
||||||
case 1:
|
|
||||||
return &v.sizeCache
|
|
||||||
case 2:
|
|
||||||
return &v.unknownFields
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file_pb_pubsub_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
|
||||||
switch v := v.(*SubscribeRequest); i {
|
|
||||||
case 0:
|
|
||||||
return &v.state
|
|
||||||
case 1:
|
|
||||||
return &v.sizeCache
|
|
||||||
case 2:
|
|
||||||
return &v.unknownFields
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file_pb_pubsub_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
|
|
||||||
switch v := v.(*SubscribeResponse); i {
|
|
||||||
case 0:
|
|
||||||
return &v.state
|
|
||||||
case 1:
|
|
||||||
return &v.sizeCache
|
|
||||||
case 2:
|
|
||||||
return &v.unknownFields
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
type x struct{}
|
|
||||||
out := protoimpl.TypeBuilder{
|
|
||||||
File: protoimpl.DescBuilder{
|
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
|
||||||
RawDescriptor: file_pb_pubsub_proto_rawDesc,
|
|
||||||
NumEnums: 0,
|
|
||||||
NumMessages: 4,
|
|
||||||
NumExtensions: 0,
|
|
||||||
NumServices: 1,
|
|
||||||
},
|
|
||||||
GoTypes: file_pb_pubsub_proto_goTypes,
|
|
||||||
DependencyIndexes: file_pb_pubsub_proto_depIdxs,
|
|
||||||
MessageInfos: file_pb_pubsub_proto_msgTypes,
|
|
||||||
}.Build()
|
|
||||||
File_pb_pubsub_proto = out.File
|
|
||||||
file_pb_pubsub_proto_rawDesc = nil
|
|
||||||
file_pb_pubsub_proto_goTypes = nil
|
|
||||||
file_pb_pubsub_proto_depIdxs = nil
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
// 版本
|
|
||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
// 包名
|
|
||||||
package pb;
|
|
||||||
|
|
||||||
// 别名
|
|
||||||
option go_package = "../pb";
|
|
||||||
|
|
||||||
// 定义服务
|
|
||||||
service PubSub {
|
|
||||||
// [发布] 消息
|
|
||||||
rpc Publish (PublishRequest) returns (PublishResponse);
|
|
||||||
// [订阅] 消息
|
|
||||||
rpc Subscribe (SubscribeRequest) returns (stream SubscribeResponse);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 请求消息
|
|
||||||
message PublishRequest {
|
|
||||||
string id = 1;
|
|
||||||
string value = 2;
|
|
||||||
string method = 3;
|
|
||||||
string ip = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 响应消息
|
|
||||||
message PublishResponse {
|
|
||||||
string id = 1;
|
|
||||||
string value = 2;
|
|
||||||
string ip = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 请求消息
|
|
||||||
message SubscribeRequest {
|
|
||||||
string id = 1;
|
|
||||||
string value = 2;
|
|
||||||
string method = 3;
|
|
||||||
string ip = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 响应消息
|
|
||||||
message SubscribeResponse {
|
|
||||||
string id = 1;
|
|
||||||
string value = 2;
|
|
||||||
string method = 3;
|
|
||||||
}
|
|
@ -1,173 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
|
|
||||||
// versions:
|
|
||||||
// - protoc-gen-go-grpc v1.2.0
|
|
||||||
// - protoc v3.19.4
|
|
||||||
// source: pb/pubsub.proto
|
|
||||||
|
|
||||||
package pb
|
|
||||||
|
|
||||||
import (
|
|
||||||
context "context"
|
|
||||||
grpc "google.golang.org/grpc"
|
|
||||||
codes "google.golang.org/grpc/codes"
|
|
||||||
status "google.golang.org/grpc/status"
|
|
||||||
)
|
|
||||||
|
|
||||||
// This is a compile-time assertion to ensure that this generated file
|
|
||||||
// is compatible with the grpc package it is being compiled against.
|
|
||||||
// Requires gRPC-Go v1.32.0 or later.
|
|
||||||
const _ = grpc.SupportPackageIsVersion7
|
|
||||||
|
|
||||||
// PubSubClient is the client API for PubSub service.
|
|
||||||
//
|
|
||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
|
|
||||||
type PubSubClient interface {
|
|
||||||
// [发布] 消息
|
|
||||||
Publish(ctx context.Context, in *PublishRequest, opts ...grpc.CallOption) (*PublishResponse, error)
|
|
||||||
// [订阅] 消息
|
|
||||||
Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (PubSub_SubscribeClient, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type pubSubClient struct {
|
|
||||||
cc grpc.ClientConnInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewPubSubClient(cc grpc.ClientConnInterface) PubSubClient {
|
|
||||||
return &pubSubClient{cc}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *pubSubClient) Publish(ctx context.Context, in *PublishRequest, opts ...grpc.CallOption) (*PublishResponse, error) {
|
|
||||||
out := new(PublishResponse)
|
|
||||||
err := c.cc.Invoke(ctx, "/pb.PubSub/Publish", in, out, opts...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *pubSubClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (PubSub_SubscribeClient, error) {
|
|
||||||
stream, err := c.cc.NewStream(ctx, &PubSub_ServiceDesc.Streams[0], "/pb.PubSub/Subscribe", opts...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
x := &pubSubSubscribeClient{stream}
|
|
||||||
if err := x.ClientStream.SendMsg(in); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if err := x.ClientStream.CloseSend(); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return x, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type PubSub_SubscribeClient interface {
|
|
||||||
Recv() (*SubscribeResponse, error)
|
|
||||||
grpc.ClientStream
|
|
||||||
}
|
|
||||||
|
|
||||||
type pubSubSubscribeClient struct {
|
|
||||||
grpc.ClientStream
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *pubSubSubscribeClient) Recv() (*SubscribeResponse, error) {
|
|
||||||
m := new(SubscribeResponse)
|
|
||||||
if err := x.ClientStream.RecvMsg(m); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return m, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// PubSubServer is the server API for PubSub service.
|
|
||||||
// All implementations must embed UnimplementedPubSubServer
|
|
||||||
// for forward compatibility
|
|
||||||
type PubSubServer interface {
|
|
||||||
// [发布] 消息
|
|
||||||
Publish(context.Context, *PublishRequest) (*PublishResponse, error)
|
|
||||||
// [订阅] 消息
|
|
||||||
Subscribe(*SubscribeRequest, PubSub_SubscribeServer) error
|
|
||||||
mustEmbedUnimplementedPubSubServer()
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnimplementedPubSubServer must be embedded to have forward compatible implementations.
|
|
||||||
type UnimplementedPubSubServer struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (UnimplementedPubSubServer) Publish(context.Context, *PublishRequest) (*PublishResponse, error) {
|
|
||||||
return nil, status.Errorf(codes.Unimplemented, "method Publish not implemented")
|
|
||||||
}
|
|
||||||
func (UnimplementedPubSubServer) Subscribe(*SubscribeRequest, PubSub_SubscribeServer) error {
|
|
||||||
return status.Errorf(codes.Unimplemented, "method Subscribe not implemented")
|
|
||||||
}
|
|
||||||
func (UnimplementedPubSubServer) mustEmbedUnimplementedPubSubServer() {}
|
|
||||||
|
|
||||||
// UnsafePubSubServer may be embedded to opt out of forward compatibility for this service.
|
|
||||||
// Use of this interface is not recommended, as added methods to PubSubServer will
|
|
||||||
// result in compilation errors.
|
|
||||||
type UnsafePubSubServer interface {
|
|
||||||
mustEmbedUnimplementedPubSubServer()
|
|
||||||
}
|
|
||||||
|
|
||||||
func RegisterPubSubServer(s grpc.ServiceRegistrar, srv PubSubServer) {
|
|
||||||
s.RegisterService(&PubSub_ServiceDesc, srv)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _PubSub_Publish_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
|
||||||
in := new(PublishRequest)
|
|
||||||
if err := dec(in); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if interceptor == nil {
|
|
||||||
return srv.(PubSubServer).Publish(ctx, in)
|
|
||||||
}
|
|
||||||
info := &grpc.UnaryServerInfo{
|
|
||||||
Server: srv,
|
|
||||||
FullMethod: "/pb.PubSub/Publish",
|
|
||||||
}
|
|
||||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
|
||||||
return srv.(PubSubServer).Publish(ctx, req.(*PublishRequest))
|
|
||||||
}
|
|
||||||
return interceptor(ctx, in, info, handler)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _PubSub_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error {
|
|
||||||
m := new(SubscribeRequest)
|
|
||||||
if err := stream.RecvMsg(m); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return srv.(PubSubServer).Subscribe(m, &pubSubSubscribeServer{stream})
|
|
||||||
}
|
|
||||||
|
|
||||||
type PubSub_SubscribeServer interface {
|
|
||||||
Send(*SubscribeResponse) error
|
|
||||||
grpc.ServerStream
|
|
||||||
}
|
|
||||||
|
|
||||||
type pubSubSubscribeServer struct {
|
|
||||||
grpc.ServerStream
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *pubSubSubscribeServer) Send(m *SubscribeResponse) error {
|
|
||||||
return x.ServerStream.SendMsg(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PubSub_ServiceDesc is the grpc.ServiceDesc for PubSub service.
|
|
||||||
// It's only intended for direct use with grpc.RegisterService,
|
|
||||||
// and not to be introspected or modified (even as a copy)
|
|
||||||
var PubSub_ServiceDesc = grpc.ServiceDesc{
|
|
||||||
ServiceName: "pb.PubSub",
|
|
||||||
HandlerType: (*PubSubServer)(nil),
|
|
||||||
Methods: []grpc.MethodDesc{
|
|
||||||
{
|
|
||||||
MethodName: "Publish",
|
|
||||||
Handler: _PubSub_Publish_Handler,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Streams: []grpc.StreamDesc{
|
|
||||||
{
|
|
||||||
StreamName: "Subscribe",
|
|
||||||
Handler: _PubSub_Subscribe_Handler,
|
|
||||||
ServerStreams: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Metadata: "pb/pubsub.proto",
|
|
||||||
}
|
|
@ -1,234 +0,0 @@
|
|||||||
// 版本
|
|
||||||
|
|
||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// versions:
|
|
||||||
// protoc-gen-go v1.28.0
|
|
||||||
// protoc v3.19.4
|
|
||||||
// source: pb/task.proto
|
|
||||||
|
|
||||||
// 包名
|
|
||||||
|
|
||||||
package pb
|
|
||||||
|
|
||||||
import (
|
|
||||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
reflect "reflect"
|
|
||||||
sync "sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Verify that this generated code is sufficiently up-to-date.
|
|
||||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
|
||||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
|
||||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
|
||||||
)
|
|
||||||
|
|
||||||
// 请求消息
|
|
||||||
type TaskRequest struct {
|
|
||||||
state protoimpl.MessageState
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
|
|
||||||
Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *TaskRequest) Reset() {
|
|
||||||
*x = TaskRequest{}
|
|
||||||
if protoimpl.UnsafeEnabled {
|
|
||||||
mi := &file_pb_task_proto_msgTypes[0]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *TaskRequest) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*TaskRequest) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *TaskRequest) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_pb_task_proto_msgTypes[0]
|
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
if ms.LoadMessageInfo() == nil {
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
return mi.MessageOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: Use TaskRequest.ProtoReflect.Descriptor instead.
|
|
||||||
func (*TaskRequest) Descriptor() ([]byte, []int) {
|
|
||||||
return file_pb_task_proto_rawDescGZIP(), []int{0}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *TaskRequest) GetMessage() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Message
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// 响应消息
|
|
||||||
type TaskResponse struct {
|
|
||||||
state protoimpl.MessageState
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
|
|
||||||
Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *TaskResponse) Reset() {
|
|
||||||
*x = TaskResponse{}
|
|
||||||
if protoimpl.UnsafeEnabled {
|
|
||||||
mi := &file_pb_task_proto_msgTypes[1]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *TaskResponse) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*TaskResponse) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *TaskResponse) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_pb_task_proto_msgTypes[1]
|
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
if ms.LoadMessageInfo() == nil {
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
return mi.MessageOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: Use TaskResponse.ProtoReflect.Descriptor instead.
|
|
||||||
func (*TaskResponse) Descriptor() ([]byte, []int) {
|
|
||||||
return file_pb_task_proto_rawDescGZIP(), []int{1}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *TaskResponse) GetMessage() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Message
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
var File_pb_task_proto protoreflect.FileDescriptor
|
|
||||||
|
|
||||||
var file_pb_task_proto_rawDesc = []byte{
|
|
||||||
0x0a, 0x0d, 0x70, 0x62, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
|
|
||||||
0x02, 0x70, 0x62, 0x22, 0x27, 0x0a, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65,
|
|
||||||
0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20,
|
|
||||||
0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x28, 0x0a, 0x0c,
|
|
||||||
0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07,
|
|
||||||
0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d,
|
|
||||||
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0xfb, 0x01, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12,
|
|
||||||
0x30, 0x0a, 0x09, 0x55, 0x6e, 0x61, 0x72, 0x79, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0f, 0x2e, 0x70,
|
|
||||||
0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e,
|
|
||||||
0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
|
|
||||||
0x00, 0x12, 0x3c, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61,
|
|
||||||
0x6d, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61,
|
|
||||||
0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x54,
|
|
||||||
0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12,
|
|
||||||
0x3c, 0x0a, 0x13, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69,
|
|
||||||
0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b,
|
|
||||||
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73,
|
|
||||||
0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x45, 0x0a,
|
|
||||||
0x1a, 0x42, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74,
|
|
||||||
0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0f, 0x2e, 0x70, 0x62,
|
|
||||||
0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x70,
|
|
||||||
0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
|
|
||||||
0x28, 0x01, 0x30, 0x01, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70,
|
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x33,
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
file_pb_task_proto_rawDescOnce sync.Once
|
|
||||||
file_pb_task_proto_rawDescData = file_pb_task_proto_rawDesc
|
|
||||||
)
|
|
||||||
|
|
||||||
func file_pb_task_proto_rawDescGZIP() []byte {
|
|
||||||
file_pb_task_proto_rawDescOnce.Do(func() {
|
|
||||||
file_pb_task_proto_rawDescData = protoimpl.X.CompressGZIP(file_pb_task_proto_rawDescData)
|
|
||||||
})
|
|
||||||
return file_pb_task_proto_rawDescData
|
|
||||||
}
|
|
||||||
|
|
||||||
var file_pb_task_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
|
|
||||||
var file_pb_task_proto_goTypes = []interface{}{
|
|
||||||
(*TaskRequest)(nil), // 0: pb.TaskRequest
|
|
||||||
(*TaskResponse)(nil), // 1: pb.TaskResponse
|
|
||||||
}
|
|
||||||
var file_pb_task_proto_depIdxs = []int32{
|
|
||||||
0, // 0: pb.Task.UnaryTask:input_type -> pb.TaskRequest
|
|
||||||
0, // 1: pb.Task.ServerStreamingTask:input_type -> pb.TaskRequest
|
|
||||||
0, // 2: pb.Task.ClientStreamingTask:input_type -> pb.TaskRequest
|
|
||||||
0, // 3: pb.Task.BidirectionalStreamingTask:input_type -> pb.TaskRequest
|
|
||||||
1, // 4: pb.Task.UnaryTask:output_type -> pb.TaskResponse
|
|
||||||
1, // 5: pb.Task.ServerStreamingTask:output_type -> pb.TaskResponse
|
|
||||||
1, // 6: pb.Task.ClientStreamingTask:output_type -> pb.TaskResponse
|
|
||||||
1, // 7: pb.Task.BidirectionalStreamingTask:output_type -> pb.TaskResponse
|
|
||||||
4, // [4:8] is the sub-list for method output_type
|
|
||||||
0, // [0:4] is the sub-list for method input_type
|
|
||||||
0, // [0:0] is the sub-list for extension type_name
|
|
||||||
0, // [0:0] is the sub-list for extension extendee
|
|
||||||
0, // [0:0] is the sub-list for field type_name
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { file_pb_task_proto_init() }
|
|
||||||
func file_pb_task_proto_init() {
|
|
||||||
if File_pb_task_proto != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !protoimpl.UnsafeEnabled {
|
|
||||||
file_pb_task_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
|
||||||
switch v := v.(*TaskRequest); i {
|
|
||||||
case 0:
|
|
||||||
return &v.state
|
|
||||||
case 1:
|
|
||||||
return &v.sizeCache
|
|
||||||
case 2:
|
|
||||||
return &v.unknownFields
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file_pb_task_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
|
||||||
switch v := v.(*TaskResponse); i {
|
|
||||||
case 0:
|
|
||||||
return &v.state
|
|
||||||
case 1:
|
|
||||||
return &v.sizeCache
|
|
||||||
case 2:
|
|
||||||
return &v.unknownFields
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
type x struct{}
|
|
||||||
out := protoimpl.TypeBuilder{
|
|
||||||
File: protoimpl.DescBuilder{
|
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
|
||||||
RawDescriptor: file_pb_task_proto_rawDesc,
|
|
||||||
NumEnums: 0,
|
|
||||||
NumMessages: 2,
|
|
||||||
NumExtensions: 0,
|
|
||||||
NumServices: 1,
|
|
||||||
},
|
|
||||||
GoTypes: file_pb_task_proto_goTypes,
|
|
||||||
DependencyIndexes: file_pb_task_proto_depIdxs,
|
|
||||||
MessageInfos: file_pb_task_proto_msgTypes,
|
|
||||||
}.Build()
|
|
||||||
File_pb_task_proto = out.File
|
|
||||||
file_pb_task_proto_rawDesc = nil
|
|
||||||
file_pb_task_proto_goTypes = nil
|
|
||||||
file_pb_task_proto_depIdxs = nil
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
// 版本
|
|
||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
// 包名
|
|
||||||
package pb;
|
|
||||||
|
|
||||||
// 别名
|
|
||||||
option go_package = "../pb";
|
|
||||||
|
|
||||||
// 定义服务
|
|
||||||
service Task{
|
|
||||||
// 普通一元方法
|
|
||||||
rpc UnaryTask(TaskRequest) returns (TaskResponse){};
|
|
||||||
// 服务端推送流
|
|
||||||
rpc ServerStreamingTask(TaskRequest) returns (stream TaskResponse){};
|
|
||||||
// 客户端推送流
|
|
||||||
rpc ClientStreamingTask(stream TaskRequest) returns (TaskResponse){};
|
|
||||||
// 双向推送流
|
|
||||||
rpc BidirectionalStreamingTask(stream TaskRequest) returns (stream TaskResponse){};
|
|
||||||
}
|
|
||||||
|
|
||||||
// 请求消息
|
|
||||||
message TaskRequest {
|
|
||||||
string message = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 响应消息
|
|
||||||
message TaskResponse {
|
|
||||||
string message = 1;
|
|
||||||
}
|
|
@ -1,315 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
|
|
||||||
// versions:
|
|
||||||
// - protoc-gen-go-grpc v1.2.0
|
|
||||||
// - protoc v3.19.4
|
|
||||||
// source: pb/task.proto
|
|
||||||
|
|
||||||
package pb
|
|
||||||
|
|
||||||
import (
|
|
||||||
context "context"
|
|
||||||
grpc "google.golang.org/grpc"
|
|
||||||
codes "google.golang.org/grpc/codes"
|
|
||||||
status "google.golang.org/grpc/status"
|
|
||||||
)
|
|
||||||
|
|
||||||
// This is a compile-time assertion to ensure that this generated file
|
|
||||||
// is compatible with the grpc package it is being compiled against.
|
|
||||||
// Requires gRPC-Go v1.32.0 or later.
|
|
||||||
const _ = grpc.SupportPackageIsVersion7
|
|
||||||
|
|
||||||
// TaskClient is the client API for Task service.
|
|
||||||
//
|
|
||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
|
|
||||||
type TaskClient interface {
|
|
||||||
// 普通一元方法
|
|
||||||
UnaryTask(ctx context.Context, in *TaskRequest, opts ...grpc.CallOption) (*TaskResponse, error)
|
|
||||||
// 服务端推送流
|
|
||||||
ServerStreamingTask(ctx context.Context, in *TaskRequest, opts ...grpc.CallOption) (Task_ServerStreamingTaskClient, error)
|
|
||||||
// 客户端推送流
|
|
||||||
ClientStreamingTask(ctx context.Context, opts ...grpc.CallOption) (Task_ClientStreamingTaskClient, error)
|
|
||||||
// 双向推送流
|
|
||||||
BidirectionalStreamingTask(ctx context.Context, opts ...grpc.CallOption) (Task_BidirectionalStreamingTaskClient, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type taskClient struct {
|
|
||||||
cc grpc.ClientConnInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewTaskClient(cc grpc.ClientConnInterface) TaskClient {
|
|
||||||
return &taskClient{cc}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *taskClient) UnaryTask(ctx context.Context, in *TaskRequest, opts ...grpc.CallOption) (*TaskResponse, error) {
|
|
||||||
out := new(TaskResponse)
|
|
||||||
err := c.cc.Invoke(ctx, "/pb.Task/UnaryTask", in, out, opts...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *taskClient) ServerStreamingTask(ctx context.Context, in *TaskRequest, opts ...grpc.CallOption) (Task_ServerStreamingTaskClient, error) {
|
|
||||||
stream, err := c.cc.NewStream(ctx, &Task_ServiceDesc.Streams[0], "/pb.Task/ServerStreamingTask", opts...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
x := &taskServerStreamingTaskClient{stream}
|
|
||||||
if err := x.ClientStream.SendMsg(in); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if err := x.ClientStream.CloseSend(); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return x, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type Task_ServerStreamingTaskClient interface {
|
|
||||||
Recv() (*TaskResponse, error)
|
|
||||||
grpc.ClientStream
|
|
||||||
}
|
|
||||||
|
|
||||||
type taskServerStreamingTaskClient struct {
|
|
||||||
grpc.ClientStream
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *taskServerStreamingTaskClient) Recv() (*TaskResponse, error) {
|
|
||||||
m := new(TaskResponse)
|
|
||||||
if err := x.ClientStream.RecvMsg(m); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return m, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *taskClient) ClientStreamingTask(ctx context.Context, opts ...grpc.CallOption) (Task_ClientStreamingTaskClient, error) {
|
|
||||||
stream, err := c.cc.NewStream(ctx, &Task_ServiceDesc.Streams[1], "/pb.Task/ClientStreamingTask", opts...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
x := &taskClientStreamingTaskClient{stream}
|
|
||||||
return x, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type Task_ClientStreamingTaskClient interface {
|
|
||||||
Send(*TaskRequest) error
|
|
||||||
CloseAndRecv() (*TaskResponse, error)
|
|
||||||
grpc.ClientStream
|
|
||||||
}
|
|
||||||
|
|
||||||
type taskClientStreamingTaskClient struct {
|
|
||||||
grpc.ClientStream
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *taskClientStreamingTaskClient) Send(m *TaskRequest) error {
|
|
||||||
return x.ClientStream.SendMsg(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *taskClientStreamingTaskClient) CloseAndRecv() (*TaskResponse, error) {
|
|
||||||
if err := x.ClientStream.CloseSend(); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
m := new(TaskResponse)
|
|
||||||
if err := x.ClientStream.RecvMsg(m); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return m, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *taskClient) BidirectionalStreamingTask(ctx context.Context, opts ...grpc.CallOption) (Task_BidirectionalStreamingTaskClient, error) {
|
|
||||||
stream, err := c.cc.NewStream(ctx, &Task_ServiceDesc.Streams[2], "/pb.Task/BidirectionalStreamingTask", opts...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
x := &taskBidirectionalStreamingTaskClient{stream}
|
|
||||||
return x, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type Task_BidirectionalStreamingTaskClient interface {
|
|
||||||
Send(*TaskRequest) error
|
|
||||||
Recv() (*TaskResponse, error)
|
|
||||||
grpc.ClientStream
|
|
||||||
}
|
|
||||||
|
|
||||||
type taskBidirectionalStreamingTaskClient struct {
|
|
||||||
grpc.ClientStream
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *taskBidirectionalStreamingTaskClient) Send(m *TaskRequest) error {
|
|
||||||
return x.ClientStream.SendMsg(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *taskBidirectionalStreamingTaskClient) Recv() (*TaskResponse, error) {
|
|
||||||
m := new(TaskResponse)
|
|
||||||
if err := x.ClientStream.RecvMsg(m); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return m, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// TaskServer is the server API for Task service.
|
|
||||||
// All implementations must embed UnimplementedTaskServer
|
|
||||||
// for forward compatibility
|
|
||||||
type TaskServer interface {
|
|
||||||
// 普通一元方法
|
|
||||||
UnaryTask(context.Context, *TaskRequest) (*TaskResponse, error)
|
|
||||||
// 服务端推送流
|
|
||||||
ServerStreamingTask(*TaskRequest, Task_ServerStreamingTaskServer) error
|
|
||||||
// 客户端推送流
|
|
||||||
ClientStreamingTask(Task_ClientStreamingTaskServer) error
|
|
||||||
// 双向推送流
|
|
||||||
BidirectionalStreamingTask(Task_BidirectionalStreamingTaskServer) error
|
|
||||||
mustEmbedUnimplementedTaskServer()
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnimplementedTaskServer must be embedded to have forward compatible implementations.
|
|
||||||
type UnimplementedTaskServer struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (UnimplementedTaskServer) UnaryTask(context.Context, *TaskRequest) (*TaskResponse, error) {
|
|
||||||
return nil, status.Errorf(codes.Unimplemented, "method UnaryTask not implemented")
|
|
||||||
}
|
|
||||||
func (UnimplementedTaskServer) ServerStreamingTask(*TaskRequest, Task_ServerStreamingTaskServer) error {
|
|
||||||
return status.Errorf(codes.Unimplemented, "method ServerStreamingTask not implemented")
|
|
||||||
}
|
|
||||||
func (UnimplementedTaskServer) ClientStreamingTask(Task_ClientStreamingTaskServer) error {
|
|
||||||
return status.Errorf(codes.Unimplemented, "method ClientStreamingTask not implemented")
|
|
||||||
}
|
|
||||||
func (UnimplementedTaskServer) BidirectionalStreamingTask(Task_BidirectionalStreamingTaskServer) error {
|
|
||||||
return status.Errorf(codes.Unimplemented, "method BidirectionalStreamingTask not implemented")
|
|
||||||
}
|
|
||||||
func (UnimplementedTaskServer) mustEmbedUnimplementedTaskServer() {}
|
|
||||||
|
|
||||||
// UnsafeTaskServer may be embedded to opt out of forward compatibility for this service.
|
|
||||||
// Use of this interface is not recommended, as added methods to TaskServer will
|
|
||||||
// result in compilation errors.
|
|
||||||
type UnsafeTaskServer interface {
|
|
||||||
mustEmbedUnimplementedTaskServer()
|
|
||||||
}
|
|
||||||
|
|
||||||
func RegisterTaskServer(s grpc.ServiceRegistrar, srv TaskServer) {
|
|
||||||
s.RegisterService(&Task_ServiceDesc, srv)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _Task_UnaryTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
|
||||||
in := new(TaskRequest)
|
|
||||||
if err := dec(in); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if interceptor == nil {
|
|
||||||
return srv.(TaskServer).UnaryTask(ctx, in)
|
|
||||||
}
|
|
||||||
info := &grpc.UnaryServerInfo{
|
|
||||||
Server: srv,
|
|
||||||
FullMethod: "/pb.Task/UnaryTask",
|
|
||||||
}
|
|
||||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
|
||||||
return srv.(TaskServer).UnaryTask(ctx, req.(*TaskRequest))
|
|
||||||
}
|
|
||||||
return interceptor(ctx, in, info, handler)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _Task_ServerStreamingTask_Handler(srv interface{}, stream grpc.ServerStream) error {
|
|
||||||
m := new(TaskRequest)
|
|
||||||
if err := stream.RecvMsg(m); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return srv.(TaskServer).ServerStreamingTask(m, &taskServerStreamingTaskServer{stream})
|
|
||||||
}
|
|
||||||
|
|
||||||
type Task_ServerStreamingTaskServer interface {
|
|
||||||
Send(*TaskResponse) error
|
|
||||||
grpc.ServerStream
|
|
||||||
}
|
|
||||||
|
|
||||||
type taskServerStreamingTaskServer struct {
|
|
||||||
grpc.ServerStream
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *taskServerStreamingTaskServer) Send(m *TaskResponse) error {
|
|
||||||
return x.ServerStream.SendMsg(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _Task_ClientStreamingTask_Handler(srv interface{}, stream grpc.ServerStream) error {
|
|
||||||
return srv.(TaskServer).ClientStreamingTask(&taskClientStreamingTaskServer{stream})
|
|
||||||
}
|
|
||||||
|
|
||||||
type Task_ClientStreamingTaskServer interface {
|
|
||||||
SendAndClose(*TaskResponse) error
|
|
||||||
Recv() (*TaskRequest, error)
|
|
||||||
grpc.ServerStream
|
|
||||||
}
|
|
||||||
|
|
||||||
type taskClientStreamingTaskServer struct {
|
|
||||||
grpc.ServerStream
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *taskClientStreamingTaskServer) SendAndClose(m *TaskResponse) error {
|
|
||||||
return x.ServerStream.SendMsg(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *taskClientStreamingTaskServer) Recv() (*TaskRequest, error) {
|
|
||||||
m := new(TaskRequest)
|
|
||||||
if err := x.ServerStream.RecvMsg(m); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return m, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func _Task_BidirectionalStreamingTask_Handler(srv interface{}, stream grpc.ServerStream) error {
|
|
||||||
return srv.(TaskServer).BidirectionalStreamingTask(&taskBidirectionalStreamingTaskServer{stream})
|
|
||||||
}
|
|
||||||
|
|
||||||
type Task_BidirectionalStreamingTaskServer interface {
|
|
||||||
Send(*TaskResponse) error
|
|
||||||
Recv() (*TaskRequest, error)
|
|
||||||
grpc.ServerStream
|
|
||||||
}
|
|
||||||
|
|
||||||
type taskBidirectionalStreamingTaskServer struct {
|
|
||||||
grpc.ServerStream
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *taskBidirectionalStreamingTaskServer) Send(m *TaskResponse) error {
|
|
||||||
return x.ServerStream.SendMsg(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *taskBidirectionalStreamingTaskServer) Recv() (*TaskRequest, error) {
|
|
||||||
m := new(TaskRequest)
|
|
||||||
if err := x.ServerStream.RecvMsg(m); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return m, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Task_ServiceDesc is the grpc.ServiceDesc for Task service.
|
|
||||||
// It's only intended for direct use with grpc.RegisterService,
|
|
||||||
// and not to be introspected or modified (even as a copy)
|
|
||||||
var Task_ServiceDesc = grpc.ServiceDesc{
|
|
||||||
ServiceName: "pb.Task",
|
|
||||||
HandlerType: (*TaskServer)(nil),
|
|
||||||
Methods: []grpc.MethodDesc{
|
|
||||||
{
|
|
||||||
MethodName: "UnaryTask",
|
|
||||||
Handler: _Task_UnaryTask_Handler,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Streams: []grpc.StreamDesc{
|
|
||||||
{
|
|
||||||
StreamName: "ServerStreamingTask",
|
|
||||||
Handler: _Task_ServerStreamingTask_Handler,
|
|
||||||
ServerStreams: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
StreamName: "ClientStreamingTask",
|
|
||||||
Handler: _Task_ClientStreamingTask_Handler,
|
|
||||||
ClientStreams: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
StreamName: "BidirectionalStreamingTask",
|
|
||||||
Handler: _Task_BidirectionalStreamingTask_Handler,
|
|
||||||
ServerStreams: true,
|
|
||||||
ClientStreams: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Metadata: "pb/task.proto",
|
|
||||||
}
|
|
@ -0,0 +1,38 @@
|
|||||||
|
package gojobs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/go-redis/redis/v9"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Publish 发布
|
||||||
|
// ctx 上下文
|
||||||
|
// channel 频道
|
||||||
|
// message 消息
|
||||||
|
func (c *Client) Publish(ctx context.Context, channel string, message interface{}) error {
|
||||||
|
publish, err := c.cache.redisClient.Publish(ctx, channel, message).Result()
|
||||||
|
if c.config.debug == true {
|
||||||
|
log.Printf("[jobs.Publish] %s %s %v %s\n", channel, message, publish, err)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
type SubscribeResult struct {
|
||||||
|
err error
|
||||||
|
Message *redis.PubSub
|
||||||
|
}
|
||||||
|
|
||||||
|
// Subscribe 订阅
|
||||||
|
func (c *Client) Subscribe(ctx context.Context) SubscribeResult {
|
||||||
|
return SubscribeResult{
|
||||||
|
Message: c.cache.redisClient.Subscribe(ctx, c.cache.cornKeyPrefix+"_"+c.cache.cornKeyCustom),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSubscribe 订阅,支持通配符匹配(ch_user_*)
|
||||||
|
func (c *Client) PSubscribe(ctx context.Context) SubscribeResult {
|
||||||
|
return SubscribeResult{
|
||||||
|
Message: c.cache.redisClient.PSubscribe(ctx, c.cache.cornKeyPrefix+"_"+c.cache.cornKeyCustom+"_*"),
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue