Tcp bağlantılarının yapılması pahalı olan RabbitMQ belgelerinde belirtildiği gibi. Yani, bu kanal kavramı için tanıtıldı. Şimdi bu example ile karşılaştım. main()
'da, bir iletinin her yayınlandığında bağlantı oluşturur. conn, err := amqp.Dial("amqp://guest:[email protected]:5672/")
. Küresel olarak bir kez bildirilmemeli ve bağlantının tekil nesne gibi kapanması durumunda yük devretme mekanizması bulunmalıdır.amqp.Dial iş parçacığı her zaman olduğunda olsun ya da olmasın bağlantı oluşturuluyor
aşağıdaki şekilde bağlantı hatası işleme ediyorum: amqp.Dial herhalde, hangi evreli ise o
Düzenlenen soru olmalıdır. Kanalda dinledim ve hata üzerine yeni bir bağlantı oluşturdum. Ancak mevcut bağlantıyı öldürdüğümde mesaj yayınlamaya çalışıyorum. Aşağıdaki hatayı alıyorum.
hatası:
2016/03/30 19:20:08 Failed to open a channel: write tcp 172.16.5.48:51085->172.16.0.20:5672: use of closed network connection
exit status 1
7:25 PM
Kodu:
func main() {
Conn, err := amqp.Dial("amqp://guest:[email protected]:5672/")
failOnError(err, "Failed to connect to RabbitMQ")
context := &appContext{queueName: "QUEUENAME",exchangeName: "ExchangeName",exchangeType: "direct",routingKey: "RoutingKey",conn: Conn}
c := make(chan *amqp.Error)
go func() {
error := <-c
if(error != nil){
Conn, err = amqp.Dial("amqp://guest:[email protected]:5672/")
failOnError(err, "Failed to connect to RabbitMQ")
Conn.NotifyClose(c)
}
}()
Conn.NotifyClose(c)
r := web.New()
// We pass an instance to our context pointer, and our handler.
r.Get("/", appHandler{context, IndexHandler})
graceful.ListenAndServe(":8086", r)
}
Bildiğim kadarıyla bağlantı yalnızca bağlantılı numunelerde bir kez oluşturmak olduğunu görebilirsiniz. Sorunuza ilgili kodu eklemelisiniz. – Sebastian
Hayır, ancak sıradaki bir nesneyi itmeye ihtiyaç duyduğunuz her zaman çağrılan bir http işleyicisi olduğumu varsayalım. Yani, her istek üzerine rabbitmq için bağlantı oluşturmalı ya da sadece bir bağlantı kullanmalıyız. – Naresh