19. スライド用に抜粋
class ScrapeStream {
implicit val system = ActorSystem("HogeSystem")
implicit val materializer = ActorMaterializer()
implicit val ec: ExecutionContext = ExecutionContext.Implicits.global
val targetUrls: List[String] = List (
"http://seiga.nicovideo.jp/tag/%E3%82%BB%E3%82%A4%E3%83%90%E3%83%BC",
"http://seiga.nicovideo.jp/search/%E3%82%A4%E3%83%AA%E3%83%A4?target=illust"
)
// 並列で実行 スクレーピングサービス
val source = Source(targetUrls).mapAsyncUnordered(2) {
url => new ScrapeImpl().scrape(url)
}
Stream
20. Stream
画像チェックサービス
val step = Flow[List[File]].mapAsyncUnordered(2) { files =>
Future (
for {
file <- files
if (new ImageCheck().imageSizeCheck(file))
} yield file)
}
val sink = Sink.foreachParallel[List[File]](2) { files =>
files.map(file => new FileMove().moveImage(file))
}
val graph = source via step to sink // source, flow, sink を連結して線形のGraphを作る
def run(): Unit = {
graph.run() //実行
}
}
画像移動サービス