// NotifyClose registers a listener for close events either initiated by an error // accompaning a connection.close method or by a normal shutdown. // On normal shutdowns, the chan will be closed. // To reconnect after a transport or protocol error, we should register a listener here and // re-connect to server // Reconnection is -not- working by now func (r *RabbitMQ) handleErrors(conn *amqp.Connection) { go func() { for amqpErr := range conn.NotifyClose(make(chan *amqp.Error)) { // if the computer sleeps then wakes longer than a heartbeat interval, // the connection will be closed by the client. // https://github.com/streadway/amqp/issues/82 r.log.Fatal(amqpErr.Error()) if strings.Contains(amqpErr.Error(), "NOT_FOUND") { // do not continue } // CRITICAL Exception (320) Reason: "CONNECTION_FORCED - broker forced connection closure with reason 'shutdown'" // CRITICAL Exception (501) Reason: "read tcp 127.0.0.1:5672: i/o timeout" // CRITICAL Exception (503) Reason: "COMMAND_INVALID - unimplemented method" if amqpErr.Code == 501 { // reconnect } if amqpErr.Code == 320 { // fmt.Println("tryin to reconnect") // c.reconnect() } } }() go func() { for b := range conn.NotifyBlocked(make(chan amqp.Blocking)) { if b.Active { r.log.Info("TCP blocked: %q", b.Reason) } else { r.log.Info("TCP unblocked") } } }() }