go简单实现rocketmq

2023-12-25 12:17:08

go实现rocketmq

相关文档
相关文档

关闭防火墙

发送普通消息
发送普通消息

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{"192.168.0.102:9876"}))
	if err != nil {
		panic("生成发送者失败")
	}

	if err = p.Start(); err != nil {
		panic("启动发送者失败")
	} //启动

	//同步发送消息
	res, err := p.SendSync(context.Background(), primitive.NewMessage("chengpeng1", []byte("this is chengpeng1")))
	if err != nil {
		fmt.Printf("发送失败: %s\n", err)
	} else {
		fmt.Printf("发送成功: %s\n", res.String())
	}

	//关闭消息
	if err = p.Shutdown(); err != nil {
		panic("关闭发送者失败")
	}
}

2. 消费消息

消费者消费消息

package main

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

func main() {
	//创建消费者 pull会不停轮询就会浪费资源 异步编程
	res, err := rocketmq.NewPushConsumer(consumer.WithNameServer([]string{"192.168.0.102:9876"}), //NameService
		consumer.WithGroupName("chengpeng"))  消费者组 只要groupname一致 可能有多个实例
	if err != nil {
		fmt.Println("消费者实例创建失败", err)
	}

	//订阅 topic  consumer.MessageSelector{} ==>消息选择器
	err = res.Subscribe("chengpeng1", consumer.MessageSelector{}, func(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
		for _, msg := range msgs {
			fmt.Printf("获取到值: %v \n", msg)
		}

		return consumer.ConsumeSuccess, nil
	})

	if err != nil {
		fmt.Println("读取消息失败", err)
	}

	err = res.Start()
	if err != nil {
		fmt.Println("启动消息失败", err)
		return
	}

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

	err = res.Shutdown()
	if err != nil {
		fmt.Println("停止消息失败", err)
		return
	}
}

consumer.MessageSelector{}==>这个只能这样使用吗?传的参数没用吗
发送延时消息
延迟消息

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{"192.168.0.102:9876"}))
	if err != nil {
		panic("生成发送者失败")
	}

	if err = p.Start(); err != nil {
		panic("启动发送者失败")
	} //启动

	msg := primitive.NewMessage("chengpeng1", []byte("this is deilay messgae"))
	msg.WithDelayTimeLevel(3) //设置延迟级别
	//同步发送消息
	res, err := p.SendSync(context.Background(), msg)
	if err != nil {
		fmt.Printf("发送失败: %s\n", err)
	} else {
		fmt.Printf("发送成功: %s\n", res.String())
	}

	//关闭消息
	if err = p.Shutdown(); err != nil {
		panic("关闭发送者失败")
	}
}

//支付的时候, 淘宝, 12306, 购票, 超时归还 - 定时执行逻辑 //我可以去写一个轮询, 轮询的问题: 1.多久执行一次轮询 30分钟 在12:00执行过一次, 下一次执行就是在 12:30的时候但是12:01的时候下了单->一一直没有支付, 12:30还没有超时,12:31就应该超时 13:00时候才能超时 那我1分钟执行一次啊,
比如我的订单量没有这么大,1分钟执行一次, 其中29次查询都是无用, 而且你还还会轮询mysql //rocketmq的延迟消息, 1.时间一到就执行, 2. 消息中包含了订单编号,你只查询这种订单编号

4. 发送事务消息

事务消息

package main

import (
	"context"
	"fmt"
	"time"

	"github.com/apache/rocketmq-client-go/v2"
	"github.com/apache/rocketmq-client-go/v2/primitive"
	"github.com/apache/rocketmq-client-go/v2/producer"
)

type OrderListener struct{}
// ExecuteLocalTransaction 执行本地事务
// primitive.CommitMessageState : 提交
// primitive.RollbackMessageState : 回滚
// primitive.UnknowState : 触发会查函数 CheckLocalTransaction
func (o *OrderListener) ExecuteLocalTransaction(msg *primitive.Message) primitive.LocalTransactionState {
	fmt.Println("开始执行本地逻辑")
	time.Sleep(time.Second * 3)
	fmt.Println("执行本地逻辑失败")
	//本地执行逻辑无缘无故失败 代码异常 宕机
	return primitive.UnknowState
}
// CheckLocalTransaction 回查函数
// primitive.CommitMessageState : 提交
// primitive.RollbackMessageState : 回滚
// primitive.UnknowState : 触发会查函数 CheckLocalTransaction
func (o *OrderListener) CheckLocalTransaction(msg *primitive.MessageExt) primitive.LocalTransactionState {
	fmt.Println("rocketmq的消息回查")
	time.Sleep(time.Second * 15)
	return primitive.CommitMessageState
}

func main() {
	p, err := rocketmq.NewTransactionProducer(
		&OrderListener{},
		producer.WithNameServer([]string{"192.168.0.104:9876"}),
	)
	if err != nil {
		panic("生成producer失败")
	}

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

	res, err := p.SendMessageInTransaction(context.Background(), primitive.NewMessage("TransTopic", []byte("this is transaction message2")))
	if err != nil {
		fmt.Printf("发送失败: %s\n", err)
	} else {
		fmt.Printf("发送成功: %s\n", res.String())
	}

	time.Sleep(time.Hour)
	if err = p.Shutdown(); err != nil {
		panic("关闭producer失败")
	}
}

文章来源:https://blog.csdn.net/qq_40432598/article/details/135190091
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。