go 封装 ActiveMq,并实现 topic 和 queue 的生产和消费

go 封装 ActiveMq,并实现 topic 和 queue 的生产和消费

需要了解的基础知识
  • 总所周知 activemq 有两种消息传递类型分别为
    • queue Point-to-Point,点对点通信模型,即一个生产者对应一个消费者
    • topic publish-and- subscribe,发布订阅模型,一个生产者可根据订阅向多个消费者推送数据
  • go 连接 activemq 的官方推荐包为 github.com/go-stomp/stomp

go 连接 ActiveMq 遇到的坑
但由于国内使用 activemq 的公司较少,所以对于如何使用 go 操作 activemq 的资料也较少,下面我将分享一下我在使用 go 连接 activemq 上遇到的一些坑
  • 如何推送信息到 topicqueue

    使用 go-stompsend 方法推送数据给 activemq 的时候,系统是根据前缀是topic还是queue来判断推送给topic还是queue的,例如我要推送到一个名为 hello 的消息类型

    • 推送给 topic

      conn.Send("/topic/hello", "text/plain", []byte(<-c))
      
    • 推送给 queue

      conn.Send("/queue/hello", "text/plain", []byte(<-c))
      
  • 如何从 topicqueue 中消费信息

    topic 的消费一定要注意要先订阅在生产,因为 topic 属于发布订阅模式,只会推送订阅 topic 后生产的信息,就像人们订阅报纸一样,订阅下半年的报纸就只会等到下半年报纸生产了后发给你,而不会把上半年的报纸也发给你。

    queue 则无需注意什么生产的顺序,只要有消息没有被消费,那么这个消息就可以被消费,就有点像你的银行卡里的钱,不管是啥时候存进去的,只要有余额就可以取出来消费

    • 消费 topic 的消息

      	go Consumer(topic, activeMq)      //订阅消费消息
      	time.Sleep(time.Second)
      	go Producer(c, topic, activeMq)   //生产消息
      
    • 消费 queue 的消息

      go Consumer(topic, activeMq)      //订阅消费消息即可
      
具体代码实现
package main

import (
	"fmt"
	"github.com/go-stomp/stomp"
	"github.com/unknwon/goconfig"
	"net"
	"strconv"
	"time"
)

func initConfig(filePath string) *goconfig.ConfigFile {
	config, _ := goconfig.LoadConfigFile(filePath)
	return config
}

func ConnectActiveMQ(host, port string) *stomp.Conn {

	stompConn, _ := stomp.Dial("tcp", net.JoinHostPort(host, port))
	return stompConn
}

func Producer(c chan string, destination string, conn *stomp.Conn) {
	for {
		err := conn.Send(destination, "text/plain", []byte(<-c))
		if err != nil {
			fmt.Println("ActiveMq message send error: " + err.Error())
		}
	}
}

func Consumer(destination string, conn *stomp.Conn) {

	sub, _ := conn.Subscribe(destination, stomp.AckAuto)
	for {
		select {
		case v := <-sub.C:
			fmt.Println(string(v.Body))
		case <-time.After(time.Second * 30):
			return
		}
	}
}

func main() {

	configPath := "./config.ini"
	config := initConfig(configPath)

	host, _ := config.GetValue("ActiveMq", "host")
	port, _ := config.GetValue("ActiveMq", "port")
	topic, _ := config.GetValue("ActiveMq", "topic")

	activeMq := ConnectActiveMQ(host, port)
	defer activeMq.Disconnect()

	c := make(chan string)

	go Consumer(topic, activeMq)
	time.Sleep(time.Second)
	go Producer(c, topic, activeMq)
	for i := 0; i < 10000; i++ {
		c <- "this is a msg " + strconv.Itoa(i)
	}
	time.Sleep(time.Second)
}

你可能感兴趣的:(go,activemq)