scala: java.io.IOException Stream Closed mimo zamknięcia Source

0

Ma ktoś pomysł o co chodzi?
Dziwi mnie, że w stacktrace nie ma nic o metodzie findRequests() gdzie otwieram strumień pliku, a eweidentnie to jest przyczyną, gdyż jak podmienię wynik tej metody na wartość hardcodowaną to błąd znika.
Jak ręcznie zamknę Source.close() to też jest ten sam błąd.
Wywala się w miejscu, gdzie narysowałem krew.

title

3

source.getLines() zwraca Iterator. Iterator.map dalej zwraca Iterator (nie mapuje od razu tylko zwraca mapujący Iterator), a potem Iterator.toSeq zwraca Stream (który jest podtypem Seq, więc typy się zgadzają). Stream jest leniwy, więc jego elementy są liczone dopiero podczas pierwszego dostępu. Ostatecznie masz sytuację taką, że zamykasz Source przed zakończeniem jego odczytywania. Rozwiązaniem jest wybranie ścisłej (a nie leniwej) kolekcji wprost, a więc source.xxx.toSeq zamień np na source.xxx.toList.

PS:
Kiepski kod napisałeś :)
W tej pętli for (request <- requests) tworzysz N razy całą nową listę, bo doklejasz na końcu listy. Doklejanie na początku listy ma złożoność O(1) a na końcu ma złożoność O(n). Powinieneś przynajmniej doklejać na początku. Najlepiej będzie jak zrobisz po Scalowemu zamiast po Javowemu i zrobisz mniej więcej:

val seq = for (request <- requests) yield {
  delay()
  request -> manager.produce(request)
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1