优雅地完成光滑的应用程序

时间:2015-06-07 05:57:43

标签: multithreading scala asynchronous slick typesafe

我正在尝试编写一个简单的程序来从std中获取行,解析它们,并将每条记录插入postgres数据库中。为了测试,我一直在针对只有cat my_file | java ...

的文件运行它

以下是代码:

import scala.concurrent.ExecutionContext.Implicits.global
import scala.io.Source
import scala.util.Failure
import scala.util.Success
import slick.driver.PostgresDriver.api._

object LoadToDB extends App {

  val db = Database.forConfig("dev-ingest")

  for (line <- Source.fromInputStream(System.in).getLines()) {
    val record = parse(line)
    val insert = TableQuery[MyTable] += record
    val fut = db.run(insert)

    fut onComplete {
      case Success(x) => {
        System.out.println("Inserted one record: " + record)
      }
      case Failure(e) => {
        e.printStackTrace()
      }
    }

  }
}

理论上,文件中的行数,打印的“插入的一条记录”语句的数量以及数据库中的记录数都应该匹配。但是,它们都是不同的。文件中的行多于数据库中的记录,数据库中的记录多于打印的“已插入”语句。

我对scala / slick的异步执行模型有点新意,所以我怀疑我在那里做错了什么。也许当主线程结束时,所有剩余的线程都没有机会完成执行?有没有办法说“等待所有提交的任务完成”?我试过Await.result(db.shutdown(), Duration.Inf),但这似乎阻止了任务运行完成,只是立即杀死它。

1 个答案:

答案 0 :(得分:3)

您的计划在期货结束前退出。你必须在某处阻止它们。