2016-05-24 3 views
2

Ich habe eine einfache App, die eine DB eine Frage stellt, und dann einige Daten als einfachen Text zurückgibt dient. Die Antwort "plain/text" erfolgt zufällig im CSV-Format. Es wird von einem anderen Programm eingelesen (Matlab, über Webread), und dann machen wir eine Analyse.Wie CSV-Daten mit Play-Framework ordnungsgemäß zu bedienen

Nun scheint es, dass das Play-Framework einige Einstellungen geändert hat. Während vor diesem Code;

def singleEventsMultipleRegions(peril: String, region: List[String]) = Action.async {   
    val theResult = db.run(filter(peril, region).result) 
    val intermediate = theResult.map(result => header + result.mkString("\r\n")) 
    intermediate.map(item => Ok(item)) 

gab mir genau das zurück, was ich wollte. Jetzt wird Matlab nach etwa 10000 Zeilen abgeschnitten. Wenn ich das Ergebnis in einem Browser ansehe, wird die gesamte Antwort geladen. Ziemlich frustrierend.

Leider verstehe ich nicht, was passiert ... weiß jemand?

Zweitens könnte jemand mich in Richtung Punkt ...

Die ‚native‘ Strategie für Datenformat dynamisch in CSV dient? Der einfache Weg, dies zu tun, damit ein Kunde nicht zu früh lesen?

Cheers, Simon

Antwort

1

ich hier eine Teilantwort haben;

def allPerilStream = Action { 
val stream = db.stream(allPerilsTable.result) 
val source = Source.fromPublisher(stream.mapResult(u => u.aPeril + "\n")).map(ByteString.apply) 
Ok.sendEntity(HttpEntity.Streamed(source, None, Some(""))) 

}

die fast funktioniert ... außer, dass es nicht die Tabellenköpfe enthält.

Irgendwelche Ideen, wie wir einen Header in einen solchen Stream einfügen könnten?

So ist die endgültige Schlussfolgerung wie folgt. Es sieht so aus, als ob es möglich ist, Akka-Quellen direkt aus Futures zu erstellen (das dauerte ewig !!!), um es herauszufinden. Sobald Sie wissen, dass,

def allPerilStream = Action { 
val theResult = for(
    result <- db.run(allPerilsTable.result) 
) yield (
    header + 
    result.mkString("\n") 
) 
val source = Source.fromFuture(theResult).map(ByteString.apply) 
val entity = HttpEntity.Streamed(source, None, Some("")) 
Ok.sendEntity(entity) 

}

Ich hoffe tun wird den Trick