1)Есть очерель с одним сообщением (для теста)
2)Опять же для теста сообщение всегда возвращается в очередь
msg.Nack(false, true)
Пример кода
func addSmsSender(ampq <-chan amqp.Delivery, status *string) {
var me MyStruct
for true {
if *status != "Connected" {
fmt.Printf("Alarm connect\r\n")
fmt.Print(*status)
time.Sleep(Constants.VirginTimeout * time.Millisecond)
continue
}
msg, ok := <-ampq
//если канал закрыт, то ложимся спать
if !ok {
fmt.Print("Я сплю\r\n")
json.Unmarshal([]byte(msg.Body), &me)
fmt.Printf("%+v\n",&me)
time.Sleep(Constants.VirginTimeout * time.Millisecond)
continue
}
fmt.Print("Read\r\n")
err := json.Unmarshal([]byte(msg.Body), &me )
if err != nil {
//здесь обработка ошибок распаковки джсона
fmt.Printf("JSON UNMARSHAL ERR")
//ок говорим что ошибка в JSON и выкидываем обратно в очередь, мб повезет в след раз заработает
msg.Nack(false, true)
continue
}
.......
msg.Nack(false, true)
На самом деле это самый глючный код в моей жизни. Замечу, что после второй итерации сообщение не забирается из очереди, оно просто там лежит.
результат работы
Read
Read
Я сплю
&{IDTurn:1021727027 IDUser:7410 IDPackageUser:29364}
Я сплю
&{IDTurn:1021727027 IDUser:7410 IDPackageUser:29364}
Если отказаться от comma,ok синтаксиса то после второй итерации будет вывод:
JSON UNMARSHAL ERR
JSON UNMARSHAL ERR
Если изменить for true { .... } на for msg := range ampq { .... }, то вывод измениться на
Alarm connect
Alarm connect
....
Почему канал сам по себе закрывается?
дополнительный вопрос, почему в последнем случае я не могу читать значение по ссылке?
При этом при создании воркера я добавляю листенера на закрытие канала.
go func() {
fmt.Printf("closing: %s", <-w.conn.NotifyClose(make(chan *amqp.Error)))
}()
Но в выводе его нет. т.е. получается канал закрыт, но судя по логу он все же открыт.