使用 Go-Stomp 缓存 ActiveMQ 连接

使用 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

}


慕森卡
浏览 212回答 2
2回答

慕的地6264312

您可以重复使用,直到发生故障的连接,见例如从细末跺脚例子。没有办法测试是否打开。在图书馆本身中,他们在读取时吃错误,但在发送时不会:if err != nil {        if err == io.EOF {            log.Println("connection closed:", c.rw.RemoteAddr())

守着星空守着你

我添加了代码来处理失败并检查特定错误。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        }    }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go