Нет описания

AkkaStreamFileProcessingImpl.scala 9.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. package fr.natan.akkastreamfileprocessingapi.service
  2. import akka.Done
  3. import akka.stream.scaladsl.{Sink, Source}
  4. import com.typesafe.scalalogging.slf4j.Logger
  5. import fr.natan.akkastreamfileprocessingapi.datasource.Datasource.{nameBasics, titleBasics}
  6. import fr.natan.akkastreamfileprocessingapi.models.Models.{Person, TvSerie}
  7. import fr.natan.akkastreamfileprocessingapi.service.AkkaStreamComponents.{
  8. actorSystem,
  9. buildAllPersonsSink,
  10. buildAllTvSeriesSink,
  11. buildAndValidateSource,
  12. buildPersonFlow,
  13. buildSource,
  14. buildTvSerieFlow,
  15. filterPersonByIdFlow,
  16. filterPersonByNameFlow,
  17. filterTvSerieByIdFlow,
  18. filterTvSerieByPrimaryTitleFlow
  19. }
  20. import fr.natan.akkastreamfileprocessingapi.service.UtilitiesClass.{
  21. getListOfPersonsForTvSerie,
  22. getListOfPersonsIDByTvSerieID,
  23. getTvSerieIDFuture,
  24. getTvSerieIdByPrimaryTitle
  25. }
  26. import org.slf4j.LoggerFactory
  27. import org.springframework.stereotype.Component
  28. import scala.concurrent.ExecutionContext.Implicits.global
  29. import scala.concurrent.Future
  30. import scala.language.postfixOps
  31. import scala.util.{Failure, Success}
  32. //noinspection SpellCheckingInspection
  33. @Component
  34. class AkkaStreamFileProcessingImpl extends AkkaStreamFileProcessingFuture {
  35. implicit val logger: Logger = Logger(LoggerFactory.getLogger(this.getClass))
  36. override def getPersonByIdFuture(personID: String): Future[Person] = {
  37. val source: Source[Map[String, String], _] = buildSource(inputFile = nameBasics)
  38. val start: Long = System.currentTimeMillis()
  39. val personFuture: Future[Person] = source
  40. .via(flow = filterPersonByIdFlow(personID = personID))
  41. .runWith(Sink.head)
  42. personFuture.andThen({
  43. case Failure(exception) => logger.info(s"$exception")
  44. case Success(value:Person) =>
  45. logger.info(s"$value")
  46. logger.info(s"SUCCESS, elapsed time:${(System.currentTimeMillis() - start) / 1000} sec")
  47. })
  48. personFuture
  49. }
  50. override def getPersonByNameFuture(primaryName: String): Future[Person] = {
  51. val source: Source[Map[String, String], _] = buildSource(inputFile = nameBasics)
  52. val start: Long = System.currentTimeMillis()
  53. val personFuture: Future[Person] = source
  54. .via(flow = filterPersonByNameFlow(primaryName = primaryName))
  55. .runWith(Sink.head)
  56. personFuture.onComplete({
  57. case Failure(exception) => logger.error(s"$exception")
  58. case Success(value: Person) => logger.info(s"$value")
  59. logger.info(s"SUCCESS, elapsed time:${(System.currentTimeMillis() - start) / 1000} sec")
  60. })
  61. personFuture
  62. }
  63. override def getTvSerieByIdFuture(tvSerieID: String): Future[TvSerie] = {
  64. val source: Source[Map[String, String], _] = buildSource(inputFile = titleBasics)
  65. val start: Long = System.currentTimeMillis()
  66. val tvSerieFuture: Future[TvSerie] = source
  67. .via(flow = filterTvSerieByIdFlow(tvSerieID = tvSerieID))
  68. .runWith(Sink.head)
  69. tvSerieFuture.onComplete({
  70. case Failure(exception) => logger.info(s"$exception")
  71. case Success(value: TvSerie) =>
  72. logger.info(s"$value")
  73. logger.info(s"SUCCESS, elapsed time:${(System.currentTimeMillis() - start) / 1000} sec")
  74. })
  75. tvSerieFuture
  76. }
  77. override def getTvSeriesByPrimaryTitleFuture(tvSeriePrimaryTitle: String): Future[IndexedSeq[TvSerie]] = {
  78. val start: Long = System.currentTimeMillis()
  79. val tvSeriesSource: Source[Map[String, String], _] = buildAndValidateSource(inputFile = titleBasics)
  80. val tvSriesFuture: Future[IndexedSeq[TvSerie]] = tvSeriesSource
  81. .via(flow = filterTvSerieByPrimaryTitleFlow(tvSeriePrimaryTitle = tvSeriePrimaryTitle))
  82. .runWith(Sink.collection)
  83. tvSriesFuture.onComplete({
  84. case Failure(exception) => logger.info(s"$exception")
  85. case Success(value: IndexedSeq[TvSerie]) =>
  86. value.foreach((tvSrie: TvSerie) => logger.info(s"$tvSrie"))
  87. logger.info(s"SUCCESS, elapsed time:${(System.currentTimeMillis() - start) / 1000} sec")
  88. })
  89. tvSriesFuture
  90. }
  91. override def getPersonsForTvSerieByTvSerieTitleFuture(tvSeriePrimaryTitle: String): Future[IndexedSeq[Person]] = {
  92. //futures chaining
  93. logger.info("STEP 1/3 START")
  94. val start1: Long = System.currentTimeMillis()
  95. val tvSerieIDFuture: Future[Option[String]] = getTvSerieIdByPrimaryTitle(primaryTitle = tvSeriePrimaryTitle)
  96. val finalFuture: Future[IndexedSeq[Person]] =
  97. tvSerieIDFuture.andThen({
  98. case Failure(exception) => logger.error(s"$exception")
  99. case Success(value: Option[String]) =>
  100. logger.info(s"TvSerie ID: $value")
  101. logger.info(s"STEP 1/3 END, elapsed time:${(System.currentTimeMillis() - start1) / 1000} sec")
  102. })
  103. .flatMap({
  104. _ =>
  105. logger.info("STEP 2/3 START")
  106. val start2: Long = System.currentTimeMillis()
  107. val listPersonIDsFuture: Future[IndexedSeq[Option[String]]] = getListOfPersonsIDByTvSerieID(
  108. tvSerieIdFuture = tvSerieIDFuture)
  109. listPersonIDsFuture.andThen({
  110. case Failure(exception) => logger.error(s"$exception")
  111. case Success(value) =>
  112. value.foreach((personID: Option[String]) => logger.info(s"Person ID:$personID"))
  113. logger.info(s"STEP 2/3 END, elapsed time:${(System.currentTimeMillis() - start2) / 1000} sec")
  114. })
  115. .flatMap({
  116. _ =>
  117. logger.info("STEP 3/3 START")
  118. val start3: Long = System.currentTimeMillis()
  119. val personsTeamFuture: Future[IndexedSeq[Person]] = getListOfPersonsForTvSerie(
  120. listPersonsIDsFuture = listPersonIDsFuture)
  121. personsTeamFuture.andThen({
  122. case Failure(exception) => logger.error(s"$exception")
  123. case Success(value: IndexedSeq[Person]) =>
  124. value.foreach((person: Person) => logger.info(s"${person.toString}"))
  125. logger.info(s"STEP 3/3 END, elapsed time:${(System.currentTimeMillis() - start3) / 1000} sec")
  126. })
  127. })
  128. })
  129. finalFuture
  130. }
  131. override def getPersonsForTvSerieByTvSerieIDFuture(tvSerieId: String): Future[IndexedSeq[Person]] = {
  132. val start1: Long = System.currentTimeMillis()
  133. logger.info("STEP 1/3")
  134. val tvSerieIdFuture: Future[Option[String]] = getTvSerieIDFuture(tvSerieId = tvSerieId)
  135. tvSerieIdFuture.andThen({
  136. case Failure(exception) => logger.error(s"${exception.printStackTrace()}")
  137. case Success(value:Option[String]) =>
  138. logger.info(s"$value")
  139. logger.info(s"STEP 1/3 END, elapsed time:${(System.currentTimeMillis() - start1) / 1000} sec")
  140. })
  141. .flatMap({
  142. _ => logger.info("STEP 2/3")
  143. val start2: Long = System.currentTimeMillis()
  144. val listOfPersonsIDsFuture : Future[IndexedSeq[Option[String]]] = getListOfPersonsIDByTvSerieID(
  145. tvSerieIdFuture = tvSerieIdFuture)
  146. listOfPersonsIDsFuture.andThen({
  147. case Failure(exception) => logger.error(s"${exception.printStackTrace()}")
  148. case Success(value: IndexedSeq[Option[String]]) =>
  149. value.foreach((personID: Option[String]) => logger.info(s"Person ID:$personID"))
  150. logger.info(s"STEP 2/3 END, elapsed time:${(System.currentTimeMillis() - start2) / 1000} sec")
  151. })
  152. .flatMap({
  153. _ => logger.info("STEP 3/3")
  154. val start3: Long = System.currentTimeMillis()
  155. val personsTeamFuture: Future[IndexedSeq[Person]] = getListOfPersonsForTvSerie(
  156. listPersonsIDsFuture = listOfPersonsIDsFuture)
  157. personsTeamFuture.andThen({
  158. case Failure(exception) => logger.error(s"$exception")
  159. case Success(value: IndexedSeq[Person]) =>
  160. value.foreach((person: Person) => logger.info(s"${person.toString}"))
  161. logger.info(s"STEP 3/3 END, elapsed time:${(System.currentTimeMillis() - start3) / 1000} sec")
  162. })
  163. })
  164. })
  165. }
  166. override def getAllPersonsFuture(): Future[Done] = {
  167. val personSource: Source[Map[String, String], _] = buildSource(inputFile = nameBasics)
  168. //graph
  169. val startTime: Long = System.currentTimeMillis()
  170. val result: Future[Done] = personSource
  171. .via(flow = buildPersonFlow())
  172. .runWith(sink = buildAllPersonsSink(logger = logger))
  173. result.onComplete {
  174. case Failure(exception) => logger.error(s"$exception")
  175. case Success(value) =>
  176. logger.info(s"$value")
  177. val time: Long = (System.currentTimeMillis() - startTime) / 100
  178. logger.info(s"elapsed time: $time")
  179. }
  180. result
  181. }
  182. override def getAllTvSeriesFuture(): Future[Done] = {
  183. val source: Source[Map[String, String], _] = buildAndValidateSource(inputFile = titleBasics)
  184. val sink: Sink[TvSerie, Future[Done]] = buildAllTvSeriesSink(logger = logger)
  185. val startingTime: Long = System.currentTimeMillis()
  186. //graph sink->flow->sink
  187. val results: Future[Done] = source
  188. .via(flow = buildTvSerieFlow())
  189. .runWith(sink = sink)
  190. .andThen {
  191. case Success(value) =>
  192. val elapsedTime: Long = (System.currentTimeMillis() - startingTime) / 1000
  193. logger.info(s"$value: successfully processing file, elapsed time $titleBasics: $elapsedTime sec")
  194. case Failure(error: Error) => logger.error(s"$error")
  195. }
  196. results
  197. }
  198. }

Powered by TurnKey Linux.