Scala中的同步和异步客户端代码

时间:2015-02-08 11:22:52

标签: multithreading scala rest

这是我原来question的后续行动。假设我需要同步和异步地调用REST服务 。在同步的情况下,我想在调用程序线程上执行它而不从池中获取其他线程。

我想仅在一次编写我的业务逻辑,并在两种情况下重复使用它。业务逻辑包括构建请求和处理响应。

我还想撰写 REST调用,就好像在“调用服务A然后服务B然后服务C”

你会如何在Scala中完成?

1 个答案:

答案 0 :(得分:2)

这应该在当前线程中运行......

{
  val currentThreadEx = new AbstractExecutorService {
    override def execute(r: Runnable) { r.run }
    override def shutdownNow(): java.util.List[Runnable] = new java.util.ArrayList[Runnable]()
    override def shutdown() {}
    override def isTerminated = false
    override def isShutdown = false
    override def awaitTermination(timeout: Long, unit: TimeUnit) = false
  }
  implicit val exContext = ExecutionContext.fromExecutor(currentThreadEx)

  val f = Future {
    10 + 1
  } 

  println(Await.result(f, 1 seconds))
}

这将在默认执行程序...

上运行
{
  import ExecutionContext.Implicits.global

  val f = Future {
    10 + 1
  } 

  println(Await.result(f, 1 seconds))
}

如您所见,您可以使用ExecutorService作为抽象点。

或者您可以使用以Monads编写的函数,然后您可以将这些操作绑定在一起而不处理上下文(即Future)。

  def op1[M[_]: Monad](i: Int)(j: Int): M[Int] = {
    Monad[M].point { i * j }
  }

  println(Monad[Id].point(10) >>= op1[Id](10))
  println((Future { 10 } >>= op1[Future](10)).run)