@Qudres

Go почему (сам по себе закрывается) закрывается ampq channel?

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)))
	}()

Но в выводе его нет. т.е. получается канал закрыт, но судя по логу он все же открыт.
  • Вопрос задан
  • 281 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы