【问题标题】:Default AkkaSupport Servlet example doesn't work默认 AkkaSupport Servlet 示例不起作用
【发布时间】:2012-11-29 19:34:29
【问题描述】:

如果我有一个 servlet 直接取自 Scalatra 文档页面上的示例:

package me.myself.andi

import _root_.akka.dispatch._
import org.scalatra.akka.AkkaSupport
import org.scalatra.ScalatraServlet

class MyAppServlet extends ScalatraServlet with AkkaSupport {
  get("/"){
    Future {
      // Add other logic here

      <html><body>Hello Akka</body></html>
    }
  }
}

我收到一个错误class MyAppServlet needs to be abstract, since method system in trait AkkaSupport of type => akka.actor.ActorSystem is not defined。

然后,我尝试了:

package me.myself.andi

import _root_.akka.dispatch._
import org.scalatra.akka.AkkaSupport
import org.scalatra.ScalatraServlet

class MyAppServlet extends ScalatraServlet with AkkaSupport {
  val system = ActorSystem("MySystem")
  get("/"){
    Future(system) { // and also Future {
      // Add other logic here

      <html><body>Hello Akka</body></html>
    }
  }
}

但是收到另一个错误type mismatch; found : org.scalatra.ActionResult required: akka.dispatch.ExecutionContext。对 Akka 不熟悉,这是怎么回事?

libraryDependencies ++= Seq(
  "org.scalatra" % "scalatra" % "2.2.0-SNAPSHOT",
  "org.scalatra" % "scalatra-scalate" % "2.2.0-SNAPSHOT",
  "org.scalatra" % "scalatra-specs2" % "2.2.0-SNAPSHOT" % "test",
  "org.scalatra" % "scalatra-akka" % "2.2.0-SNAPSHOT",
  "com.typesafe.akka" % "akka" % "2.0.4",
  "ch.qos.logback" % "logback-classic" % "1.0.6" % "runtime",
  "eu.infomas" % "annotation-detector" % "3.0.0",
  "org.atmosphere" % "atmosphere-runtime" % "1.1.0-SNAPSHOT",
  "org.eclipse.jetty" % "jetty-websocket" % "8.1.4.v20120524",
  "org.eclipse.jetty" % "jetty-webapp" % "8.1.7.v20120910" % "container",
  "org.eclipse.jetty" % "test-jetty-servlet" % "8.1.5.v20120716" % "test",
  "org.eclipse.jetty" % "jetty-websocket" % "8.1.7.v20120910" % "container",
  "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container;provided;test" artifacts (Artifact("javax.servlet", "jar", "jar"))
)

【问题讨论】:

    标签: scala akka scalatra


    【解决方案1】:

    编译器错误很明显。导入 akka.actor.ActorSystem 并将 val system = ActorSystem("MySystem") 添加到类中,它应该可以工作。

    编辑:

    system 应该是一个隐式值,所以它必须是implicit val system = ActorSystem("MySystem") 然后不要手动传入系统。所以总的来说是

    class MyAppServlet extends ScalatraServlet with AkkaSupport {
      implicit val system = ActorSystem("MySystem")
      get("/"){
        Future { // and also Future {
          // Add other logic here
    
          <html><body>Hello Akka</body></html>
        }
      }
    }
    

    【讨论】:

    • 只是一点点补充:你必须小心,因为 scalatra 使用线程局部变量,例如params 并且您必须首先将它们绑定到处理程序中的局部变量,因为Future 将在不同的线程上执行,因此变量不会出现在那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多