为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Go-Stomp 缓存 ActiveMQ 连接

使用 Go-Stomp 缓存 ActiveMQ 连接

Go
慕森卡 2021-12-20 16:40:38
使用 Go-Stomp,可以使用以下代码获取连接。if conn, err = stomp.Dial("tcp",        Broker.URI,        stomp.ConnOpt.Login(Broker.User, Broker.Password)); err != nil {        panic(fmt.Sprintf("Could not connect to ActiveMQ using brokerUri %v. Can not continue.", Broker.URI))    }连接是否可以缓存以重复使用以发送不同请求的消息?还是每次要发送消息时都需要获取连接?后来听起来效率低下。连接实例上的Send方法会在出现故障时关闭连接。因此,如果我们缓存它,则必须检查连接是否仍然存在以供后续发送消息调用。但是我没有找到检查连接是否关闭的方法?Conn结构具有封闭成员,但这不会通过任何方法公开。// A Conn is a connection to a STOMP server. Create a Conn using either// the Dial or Connect function.type Conn struct {    conn         io.ReadWriteCloser    readCh       chan *frame.Frame    writeCh      chan writeRequest    version      Version    session      string    server       string    readTimeout  time.Duration    writeTimeout time.Duration    closed       bool    options      *connOptions}
查看完整描述

2 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

您可以重复使用,直到发生故障的连接,见例如从细末跺脚例子。


没有办法测试是否打开。


在图书馆本身中,他们在读取时吃错误,但在发送时不会:


if err != nil {

        if err == io.EOF {

            log.Println("connection closed:", c.rw.RemoteAddr())


查看完整回答
反对 回复 2021-12-20
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

我添加了代码来处理失败并检查特定错误。


if err := conn.Send(queue, "text/plain", []byte(message)); err != nil {

            if err == stomp.ErrAlreadyClosed {

                log.Println("ActiveMQ Connection is in closed state. Reconnecting ...")

                conn = ConnectToBroker()

                err = conn.Send(queue, "text/plain", []byte(message))

            }

            if err != nil {

                log.Printf("Failed to send message to Queue %v.  Error is %v, Payload is %v", queue, err.Error(), message)

            }

            return err

        }

    }


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 211 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信