2016-05-09 11 views
5

Yeni Akka akışlarını kullanmaya çalışıyorum ve kaynak kuyruğunu nasıl kullanabileceğimi ve kodumda materyalleştirmeden nasıl arama yapabileceğimi merak ediyorum.Kaynak kuyruğunu araya getirmeden arayanı nasıl kullanabilirim?

Zaman uyumsuz çağrıların sayısını yapan ve sonuçları Source aracılığıyla döndüren kitaplığımız olduğunu düşünün. Fonksiyon bu

def findArticlesByTitle(text: String): Source[String, SourceQueue[String]] = { 

    val source = Source.queue[String](100, backpressure) 

    source.mapMaterializedValue { case queue => 

    val url = s"http://.....&term=$text" 
    httpclient.get(url).map(httpResponseToSprayJson[SearchResponse]).map { v => 
     v.idlist.foreach { id => 
     queue.offer(id) 
     } 

     queue.complete() 
    } 
    } 

    source 
} 

benziyor ve ben asla çalıştırılmaz mapMaterializedValue içinde bu kodu çalıştırdığınızda arayan bu

// There is implicit ActorMaterializer somewhere 
val stream = plugin.findArticlesByTitle(title) 
val results = stream.runFold(List[String]())((result, article) => article :: result) 

gibi kullanabilir.

Kaynağın nasıl gerçekleştirileceğine karar vermek için arayan kişiye kalsa, neden SourceQueue örneğine erişemediğimi anlayamıyorum.

Bunu nasıl uygulamalıyım?

+0

Sonuç, sonuçların yinelenmesi ve bu yinelenebilir kaynaktan üretilmesi yerine, değer üretilirken kuyruğun doldurulmasının nedeni nedir? Val ids: Iterable [String] = httpclient.get (url) .map (...); val kaynağı = Source.from (ids) '? – devkat

+0

Beton koleksiyonunun kullanımı, nesnelerin varışına bir süre sonra varmayı kabul eden “Kaynak” fikrini azaltmaktadır. Kütüphane fonksiyonunun trilyonlarca belgeyi geri getireceğini düşünün. Müşteri, geldikleri gibi işleyebilmelidir. – expert

cevap

5

Kod örneğinizde, source.mapMaterializedValue döndürme değeri yerine kaynak döndürüyorsunuz (yöntem çağrısı Kaynak nesnesini değiştirmez).

+3

BTW, kod örneğinizde 'source.mapMaterializedValue' döndürme değeri yerine' source' kaynağını geri alıyorsunuz (yöntem çağrısı, 'Source' nesnesini değiştirmiyor). Bu, gerçek kodunuzda aynı olduğundan emin değil. – devkat

+0

Bu "mapMaterializedValue" idi. Teşekkür ederim! Cevabınızı yorumda bana söylediğin şeyle güncelledim, böylece kabul edebilirim. – expert

İlgili konular