Implement FileFetchScheduler and refactor Main class

This commit is contained in:
Guntis Smaukstelis
2023-05-20 21:53:03 +03:00
parent bbdfaa06d8
commit b4955e2619
3 changed files with 36 additions and 16 deletions
@@ -0,0 +1,29 @@
package fetch
import cats.effect.IO
import db.DBService
import fs2.Stream
import org.typelevel.log4cats.Logger
import org.typelevel.log4cats.slf4j.Slf4jLogger
object FileFetchScheduler {
def of(dbService: DBService): IO[FileFetchScheduler] = {
Slf4jLogger.create[IO].map {
new FileFetchScheduler(dbService, _)
}
}
}
class FileFetchScheduler(dbService: DBService, log: Logger[IO]) {
def run: Stream[IO, Unit] = {
val fetchTask = FileNameService.generateCurrentHour.flatMap(FetchService.fetchSingleFile)
Scheduler.scheduleTask(fetchTask)
.evalMap { case (name, content) =>
log.info(s"fetched: $name") *>
dbService.save(name, content).attempt.flatMap {
case Right(savedName) => log.info(s"saved: $savedName")
case Left(err) => log.error(s"error: $err")
}
}
}
}
@@ -1,9 +1,8 @@
package server
package fetch
import cats.effect._
import cats.effect.unsafe.implicits.global
import cats.implicits.catsSyntaxApply
import fetch.{FetchService, FileNameService}
import fs2.Stream
import java.time.{Duration, LocalTime}
+6 -14
View File
@@ -1,26 +1,18 @@
package server
import cats.effect._
import cats.implicits.catsSyntaxTuple2Parallel
import db.DBService
import fetch.{FetchService, FileNameService}
import fetch.FileFetchScheduler
object Main extends IOApp {
def run(args: List[String]): IO[ExitCode] = {
for {
dbService <- DBService.of
fetchTask = FileNameService.generateCurrentHour.flatMap(FetchService.fetchSingleFile)
scheduler = Scheduler.scheduleTask(fetchTask)
.evalMap { case (name, content) =>
IO(println(s"fetched: $name")) *>
dbService.save(name, content).attempt.flatMap {
case Right(savedName) => IO(println(s"File saved: $savedName"))
case Left(err) => IO(println(s"Error: $err"))
}
}.compile.drain // Convert Stream[IO, Unit] to IO[Unit]
server = Server.run // This is an IO[Server]
exitCode <- (server, scheduler).parMapN((_, _) => ExitCode.Success)
fileFetchScheduler <- FileFetchScheduler.of(dbService)
schedulerTask = fileFetchScheduler.run.compile.drain
serverTask = Server.run
exitCode <- (serverTask, schedulerTask).parMapN((_, _) => ExitCode.Success)
} yield exitCode
}
}