q, err := ch.QueueDeclare(
"queue_name", // name
true, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
if err != nil {
continue
}
msgs, err := ch.Consume(
q.Name, // queue
"", // consumer
false, // auto-ack
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
if err != nil {
continue
}
for d := range msgs {
// Здесь получаем блокировку. Запуск в go-рутине не решает проблему, т.к. всё равно нужно знать, есть сообщения в очереди или нет.
}
20 окт. 2015 г., в 14:54, Денис Новосибирский <telyuk...@gmail.com> написал(а):
--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
20 окт. 2015 г., в 15:02, Alexey Palazhchenko <alexey.pa...@gmail.com> написал(а):
for{
select{
case d:=<-msgs:
// есть сообщение
default:
// нет сообщения
}
}
Select с default пробовал - почему-то выполнение кода проходит в секцию default даже в том случае, когда сообщения есть в очереди. Возможно, либа написана так, что они вычитываются как-то асинхронно и default успевает отработать.
for {
select {
case d := <-msgs:
// есть сообщение
case <-time.After(200 * time.Millisecond):
// нет сообщения
}
}Про daemon понятно, вероятно, так и придётся делать. Но, на мой взгляд, это навязывание архитектуры. А если, к примеру, нужно вычитывать сообщения по требованию и точно известно, что в ближайшие сутки никто туда писать не будет?
--
if len(msg) > 0 { // вот здесь длина будет 0, а в канал уже что то упало
d := <-msg
}