2016-04-12 22 views
1

Yeni golang'lıyım ve tavşanmq başlatma işleminin ana işlevi olan başka bir işlevde olmasını sağlamak için kodumu yeniden düzenlemek istiyorum. Bu yüzden bir struct işaretçisi kullanıyorum (tüm rabbitmq infoslarını içeren initilized) ve bunu gönderme işlevine iletiyorum, fakat şunu söylüyor: Bir ileti yayınlanamadı: Özel durum (504) Neden: "channel/connection açık değil"Golang - RabbitMq: kanal/bağlantı açık değil

yapı:

type RbmqConfig struct { 
    q amqp.Queue 
    ch *amqp.Channel 
    conn *amqp.Connection 
    rbmqErr error 
} 

başlatma fonksiyonu:

func initRabbitMq() *RbmqConfig { 

    config := &RbmqConfig{} 

    config.conn, config.rbmqErr = amqp.Dial("amqp://guest:[email protected]:5672/") 
    failOnError(config.rbmqErr, "Failed to connect to RabbitMQ") 
    defer config.conn.Close() 

    config.ch, config.rbmqErr = config.conn.Channel() 
    failOnError(config.rbmqErr, "Failed to open a channel") 
    defer config.ch.Close() 

    config.q, config.rbmqErr = config.ch.QueueDeclare(
     "<my_queue_name>", 
     true, // durable 
     false, // delete when unused 
     false, // exclusive 
     false, // no-wait 
     nil,  // arguments 
    ) 
    failOnError(config.rbmqErr, "Failed to declare a queue") 

    return config 
} 

ana:

config := initRabbitMq() 

fmt.Println("queue name : ", config.q.Name) 

sendMessage(config, <message_to_send>) 

gönder iletisi:

func sendMessage(config *RbmqConfig, <message_to_send>) { 

    config.rbmqErr = config.ch.Publish(
     "",   // exchange 
     config.q.Name,  // routing key 
     false,  // mandatory 
     false, 
     amqp.Publishing{ 
      DeliveryMode: amqp.Persistent, 
      ContentType: "text/plain", 
      Body:   []byte(<message_to_send>), 
     }) 
    failOnError(config.rbmqErr, "Failed to publish a message") 

Birisi bir fikri varsa, bu çok yardımcı olur. Teşekkürler

cevap

2

init içinde, işlev döndüğünde çalıştırılacak olan defer config.conn.Close() yazdınız. Yani, ne zaman init bittiğinde, bağlantınız kapanacak ve açılmamış bağlantıya neden olacaktır.

Bağlantı kapatmayı ana ya da kapatılmasını istediğiniz bir yere ertelemeniz gerekir.

+0

Teşekkür ederim, ilk başta bir çeşit yakalama veya nihayet java benzeri olduğunu düşündüm. Dokuyu daha dikkatli okumalıydım .. Teşekkürler! – Xys