最近用golang重写一个java的消息中间件,使用go-stomp远程订阅activemq的topic,能够接收到数据。但是虽然配置了clientID,每次重启程序还是没有接收到离线时候的数据,在java老项目里用setClientId能实现数据持久化订阅。
源码如下:
conn, err := stomp.Dial("tcp", "1.1.1.1:8000",
stomp.ConnOpt.Login("name", "passwd"),
stomp.ConnOpt.HeartBeatError(5*time.Minute))
if err != nil {
fmt.Println("err =", err)
}
//消费者订阅这个队列
//参数一:订阅名
//参数二:确认信息,直接填默认地即可
defer conn.Disconnect()
sub, err := conn.Subscribe("/topic/topic.name", stomp.AckMode(stomp.AckAuto),
stomp.SubscribeOpt.Id("user-0728"))
for { //无限循环
fmt.Println(sub.Active())
fmt.Println(sub.Id())
select {
//sub.C是一个channel,如果订阅的队列有数据就读取
case v := <-sub.C:
//读取的数据是一个*stomp.Message类型
ch <- v
//如果30秒还没有人发数据的话,就结束
case <-time.After(time.Second * 30):
fmt.Println("timeout")
}
}