2016-03-10 3 views
0

Используя 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)) 
    } 

Можно ли кэшировать соединение для повторного использования для отправки сообщений для разных запросов? Или нам нужно получить соединение каждый раз, когда вы хотите отправить сообщение?
Позже звучит неэффективно.
Отправить метод на экземпляре подключения закрывает соединение в случае сбоев. Поэтому, если мы его кэшируем, нужно проверить, продолжает ли соединение жить для последующих вызовов отправки сообщений. Но я не нашел способ проверить, закрыто ли соединение? Conn struct имеет закрыт участник, но это не раскрывается никаким способом.

// 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 
} 

ответ

0

Я добавил код для обработки сбоев и проверить конкретную ошибку.

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 
     } 
    } 
0

Вы можете повторно использовать соединение до отказа, см example из примеров выхода педалей.

Невозможно проверить, открыт ли он или нет.

в самой библиотеке, они едят ошибку чтения, но не на посыле:

if err != nil { 
     if err == io.EOF { 
      log.Println("connection closed:", c.rw.RemoteAddr()) 

 Смежные вопросы

  • Нет связанных вопросов^_^