2、rocketmq 简单使用

使用 rocketmq-client-go 调用

官方How to use

 

发送普通消息

package main

import (
    "context"
    "fmt"
    "github.com/apache/rocketmq-client-go/v2"
    "github.com/apache/rocketmq-client-go/v2/primitive"
    "github.com/apache/rocketmq-client-go/v2/producer"
)
func main() {
    p,err := rocketmq.NewProducer(producer.WithNameServer([]string{"172.31.224.1:9876"}))
    if err != nil {
        panic("produce 生成失败")
    }

    if err = p.Start(); err != nil {
        panic("produce 启动失败")
    }

    res,err := p.SendSync(context.Background(),primitive.NewMessage("hellomq",[]byte("hello i m message")))
    if err != nil {
        panic("发送失败")
    }

    fmt.Println("发送成功",res.String())

    if err = p.Shutdown(); err != nil {
        panic("关闭 produce 失败")
    }
}

 

消费消息

func main() {
    c,_ := rocketmq.NewPushConsumer(
        consumer.WithNameServer([]string{"172.31.224.1:9876"}),
        consumer.WithGroupName("imgroup"), // groupname 用于负载均衡,某个消息被这个主机消费了,别的主机就不会去消费
    )

    _ = c.Subscribe("hellomq",consumer.MessageSelector{}, func(ctx context.Context, ext ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
        for i := range ext{
            fmt.Println("获取到值",ext[i])
        }
        return consumer.ConsumeSuccess,nil
    })

    _ = c.Start()

    // 不能让 主 routine 退出
    time.Sleep(time.Hour)

    _ = c.Shutdown()
}

 

延迟消息

多数用来做库存归还

func main() {
    p,_ := rocketmq.NewProducer(producer.WithNameServer([]string{"172.31.224.1:9876"}))

    _ = p.Start()

    msg := primitive.NewMessage("hellomq",[]byte("i m delay message"))

    // 级别 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
    msg.WithDelayTimeLevel(3) // 3是10s

    res,_ := p.SendSync(context.Background(),msg)

    fmt.Println("发送成功",res.String())

    _ = p.Shutdown()
}

 

事务消息

package main

import (
    "context"
    "fmt"
    "github.com/apache/rocketmq-client-go/v2"
    "github.com/apache/rocketmq-client-go/v2/primitive"
    "github.com/apache/rocketmq-client-go/v2/producer"
    "time"
)

type Orderlistener struct{}

// 事务开始
func (*Orderlistener) ExecuteLocalTransaction(msg *primitive.Message) primitive.LocalTransactionState {
    fmt.Println("开始执行一些逻辑")
    time.Sleep(time.Second * 5)
    fmt.Println("逻辑执行结束")

    // 若是成功就进行投递
    //return primitive.CommitMessageState

    // 失败直接进行回滚
    //return primitive.RollbackMessageState

    // 长时间无响应就标记 UnknowState 进行消息回查
    return primitive.UnknowState
}

// 消息回查(当服务宕掉,下次进去还会进行回查)
func (*Orderlistener) CheckLocalTransaction(msg *primitive.MessageExt) primitive.LocalTransactionState {

    // 开始进行回查
    fmt.Println("开始进行回查")
    time.Sleep(time.Second * 5)

    // 回查成功就投递,失败就回滚
    return primitive.CommitMessageState
    //return primitive.RollbackMessageState
}

func main() {
    p,_ := rocketmq.NewTransactionProducer(&Orderlistener{},producer.WithNameServer([]string{"192.168.1.163:9876"}))

    _ = p.Start()

    res,err := p.SendMessageInTransaction(context.Background(),primitive.NewMessage("hellomq",[]byte("i am transaction mq rollback")))

    if err != nil {
        panic(err)
    }

    fmt.Println("发送成功",res.String())

    time.Sleep(time.Hour)

    _ = p.Shutdown()
}

 

posted @ 2022-02-22 15:09  JaydenQiu  阅读(281)  评论(0)    收藏  举报