所以我开始学习Scala和Akka演员Akka-Http。我试图使用Akka Http实现一个简单的点击计数器,该计数器计算本地主机页面上的每个点击。我使用wrk工具运行10个具有100个连接的线程,此后计数与总请求数不匹配(见wrk)。
这是我的代码:
object WebServer3 {
var number: Int = 0
final case class Inc()
class ActorClass extends Actor with ActorLogging {
def receive = {
case Inc => number = number + 1
}
}
def main(args: Array[String]) {
implicit val system = ActorSystem("my-system")
implicit val materializer = ActorMaterializer()
implicit val executionContext = system.dispatcher
val actor1 = system.actorOf(Props[ActorClass], "SimpleActor")
val route =
path("Counter") {
get {
actor1 ! Inc
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, s"<h1>You visited $number times</h1>"))
}
}
val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)
println(s"Server online at http://localhost:8080/\nPress RETURN to stop...")
StdIn.readLine() // let it run until user presses return
bindingFuture
.flatMap(_.unbind()) // trigger unbinding from the port
.onComplete(_ => system.terminate()) // and shutdown when done
}
}
请原谅我不成熟/不熟悉的编码技能。我仍在学习,我知道这与并发有关。但是我还没有找到解决方案。请帮忙。
edit#1:我也尝试过AtomicInteger。那没有帮助。 edit#2:我也尝试了完整的akka-http方式,并请求并等待。那也没有帮助。
答案 0 :(得分:0)
您的代码几乎没有问题。
您要定义案例类// ... some code
StringWriterWithEncoding sw = new StringWriterWithEncoding();
CsvWriter cw = new CsvWriter(sw);
using (CsvWriter csv = new CsvWriter(sw))
{
csv.Configuration.RegisterClassMap<HistorySearchModelCsvHelperMap>();
csv.Configuration.CultureInfo = CultureInfo.InvariantCulture;
csv.WriteRecords(csvModelHelperList);
}
return Request.CreateResponse(HttpStatusCode.OK, sw.ToString());
// response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/vnd.ms-excel");
return response;
,但要发送伴随对象final case class Inc()
。不过,您仍然匹配了伴随对象actor1 ! Inc
,并且代码可以正常工作。但这不应该这样。
其他问题,我们正在参与者边界之外存储,修改和检索case Inc =>
。我认为这就是为什么您计数错误。角色只能更改内部状态。
我通过引入ask pattern修改了您的代码,以便可以从actor中检索值。
var number: Int = 0