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