Tag: akka

Java Play2- Akka的工作

我正在尝试使用akka在java play2中创建一个作业。 我总是得到相同的错误error: cannot find symbol 它指向system.actorOf() Intellij和Eclipse不会给我一个错误信息。 但我找不到这种方法。 我使用了以下导入 import play.libs.Akka; import akka.actor.ActorSystem; import akka.actor.ActorRef; import akka.actor.UntypedActorFactory; import akka.actor.UntypedActor; import akka.actor.Props; import akka.actor.ActorRefFactory; 也许文档过时了,他们已经删除了system.actorOf() ? public class Global extends GlobalSettings { ActorRef tickActor = system.actorOf(new Props().withCreator(new UntypedActorFactory() { public UntypedActor create() { return new UntypedActor() { public void onReceive(Object message) { if (message.equals(“Log”)) { […]

Akka在Java中键入了演员

我不明白为什么不在Akka使用TypedActors 。 使用reflection(well .. instanceof )来弥补Java中缺少模式匹配是非常难看的。 据我所知, TypedActors应该像你的软件的“Akka world”和“Non Akka world”之间的门。 但是为什么我们不会抛弃所有的OO主体而只是使用reflection! 你为什么不想使用一个演员并确切地知道它应该响应什么? 或者为了保持演员模型的Akka,为什么不创建一个使用双调度的消息层次结构来激活actor中的正确方法(我知道你不应该将Actors作为参数传递并使用ActorRef代替)。 免责声明:我是Akka和这个模型的新手,我没有使用Akka编写一行代码,但只是阅读文档让我头疼。

如何在Java应用程序中使用TypedActor?

我尝试按照Typed Actors(Java)上的示例在Java中实现TypedActor 。 但我在苦苦挣扎。 我添加了akka-actor-1.1-M1.jar , akka-typed-actor-1.1-M1.jar , scala-library.jar但这还不够。 我在Eclipse中遇到错误,所以我还在构建路径中添加了aspectwerkz-2.0.jar和aspectwerkz-core-2.0.jar 。 我尝试使用带有自定义构造函数的TypedActor。 但现在我在编译时遇到错误: Exception in thread “main” java.lang.NoSuchMethodError: org.codehaus.aspectwerkz.proxy.Proxy.newInstance([Ljava/lang/Class;[Ljava/lang/Object;ZZ)Ljava/lang/Object; at akka.actor.TypedActor$.newInstance(TypedActor.scala:596) at akka.actor.TypedActor$.newInstance(TypedActor.scala:634) at akka.actor.TypedActor.newInstance(TypedActor.scala) at com.example.actor.ActorTest.main(ActorTest.java:12) 这是我的BaseActor代码: import akka.actor.TypedActor; public class BaseActor extends TypedActor implements BaseService { private String str; private int num; public BaseActor(String str, int num) { this.str = str; this.num = […]

在Akka中记录收到的消息

我正在使用Java中的Akka actor,并且我正在尝试打开消息的日志记录。 根据文档 ,似乎设置akka.actor.debug.receive应该导致记录所有消息。 以下测试应记录发送和接收的”hello”消息。 import akka.actor.AbstractLoggingActor; import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; import akka.japi.pf.ReceiveBuilder; import akka.pattern.Patterns; import akka.testkit.JavaTestKit; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; import io.scalac.amqp.Persistent$; import org.hamcrest.CoreMatchers; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import scala.concurrent.duration.Duration$; public class LoggingTest { @Before public void createActorSystem() { Config config = ConfigFactory.parseString( “akka: {” + ” actor: […]

Play 2.5升级错误:CompletionException – 此处没有可用的HTTP上下文

在示例应用程序上从Play 2.4升级到Play 2.5后,当我运行./activator clean dist ,我没有遇到任何错误,但是在转到特定端点http://localhost:9000/java/proxy ,我收到了以下错误: [error] application – ! @72keog237 – Internal server error, for (GET) [/java/proxy] -> play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[CompletionException: java.lang.RuntimeException: There is no HTTP Context available from here.]] at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:293) at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:220) at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160) at play.api.DefaultGlobal$.onError(GlobalSettings.scala:188) at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:100) at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:100) at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:99) at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344) at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) Caused by: java.util.concurrent.CompletionException: […]

如何在Play framework 2应用程序中存储Akka actor的列表?

我有一个Play框架2应用程序,可以接收数据并通过WebSockets将其发送到多个客户端。 我使用Akka actor来处理WebSockets,就像在本文档中一样 。 我还有一个WebSocketRouter类,它扩展了UntypedActor并包含路由逻辑(决定哪些客户端传递系统接收的数据)。 我知道我可以使用Akka的Routerfunction,但对我来说这不是问题。 问题是我必须存储所有活动客户端的列表。 现在我将它存储在WebSocketRouter类的静态列表中。 这是编写概念validation原型的最快方法,但它不是线程安全的,似乎不是“Akka方式”。 下面是一个简化的代码示例: WebSocketController: //This controller handles the creation of WebSockets. public class WebSocketController extends Controller { public static WebSocket index() { return WebSocket.withActor(new F.Function() { public Props apply(ActorRef out) throws Throwable { return MessageSender.props(out); } }); } } MessageSender: //Hold a reference to the auto-created Actor that […]

Akka调度程序()每次重复都会延迟

我有一个简单的调度程序,每1秒重复一次任务: Cancellable task = Akka.system().scheduler().schedule( Duration.create(0, TimeUnit.MILLISECONDS), Duration.create(1, TimeUnit.SECONDS), actor, new TickMsg(“Tick”, 0, 120) ); 不幸的是,每个传递都是迟到的ticker-duration收报器ticker-duration所以最终演员在100毫秒后正好收到TickMsg – 好的,这在文档中描述并且我很清楚: 它不会在确切的时间执行任务,但是在每个滴答声中,它将运行过期的所有内容。 我无法理解的是为什么每个传球都迟到了,事实上这意味着每次传球而不是1000毫秒需要1100毫秒。 在10次通过后的结果,我们有1秒的延迟,1分钟后6秒,1小时后6分钟等… 一些解决方案是将重复持续时间设置得稍短一些,因此在需要的时间点不会迟到,对于一个有效的示例,然后调度程序会根据需要重复执行任务: Cancellable task = Akka.system().scheduler().schedule( Duration.create(0, TimeUnit.MILLISECONDS), Duration.create((1000 – tickerDuration/2), TimeUnit.MILLISECONDS), actor, new TickMsg(“Tick”, 0, 120) ); 不幸的是,这种方式有点不舒服,容易忘记,有没有其他方法可以每隔x秒(或其他TimeUnit )重复任务而不将其转换为毫秒和缩短?

Play / Akka与Java OutputStreams集成

我在写一个游戏! 暴露REST API的应用程序,允许用户生成PDF报告。 我受到使用旧Java API进行实际报告生成的要求的限制。 该库有一个方法generate(OutputStream out, …) ,即它需要一个java.io.OutputStream来编写生成的报告。 我的问题是将它与Play / Akka集成以提供Chunked Encoding中的内容。 为此,我需要创建一个Enumerator[Array[Byte]] ,它以某种方式包含Java库中的OutputStream 。 我提出了一个使用PipedOutputSteam / PipedInputStream二人组的工作解决方案,使用Enumerator.fromStream将库的输出传递给Enumerator.fromStream 。 我想知道是否有更好的方法来实现这一点,但我似乎无法在Akka或Play中找到一个明确的例子! 将枚举器与OutputStream集成的文档。 我知道Java库的阻塞IO是设计更好的解决方案的限制因素,但也许有一种更简洁的方法来做到这一点。 有什么想法吗? 跟进 假设我使用Enumerator.outputStream ,那么将实际报告生成移动到另一个actor(可能在另一台机器上)的安全方法是什么? 例如,我猜测发送OutputStream是不安全的(并且只能在本地工作)。

akka中每个主机的最大演员数

在akka的一个盒子上我们可以拥有多少个最大的演员? public void MyActor extends AkkaActor{ receive(Objet obj){ // so something } } 1)Is there some limit on max number of actors instances?I am planning to created around 10K actors on one box. I will have 50 such boxes so that i can scale horizontally 2)IS there some performance problems with this?

Java / Scala Future由回调驱动

精简版: 如何创建在回调触发器上完成的Promise ? 长版: 我正在开发一个处理第三方SOAP服务的应用程序。 用户的请求同时委托多个SOAP服务,聚合结果并发送回用户。 系统需要是可扩展的,并且应该允许多个并发用户。 当每个用户请求最终触发大约10个Web服务调用并且每个呼叫阻塞大约1秒时,系统需要设计为具有非阻塞I / O. 我在Play Framework(Java)中使用Apache CXF用于此系统。 我已设法生成异步WS客户端代理并启用异步传输。 我无法弄清楚当我委托多个Web服务代理时如何将Future转换为Play的线程,结果将作为回调获得。 选项1:使用返回Java Future的异步方法调用。 正如java.util.concurrent.Future线程的scala.concurrent.Future包装器中所描述的那样,我们无法将Java Future转换为Scala Future。 从Future获得结果的唯一方法是执行阻止调用者的Future.get() 。 由于CXF生成的代理返回Java Future,因此排除了此选项。 选项2:使用Scala Future。 由于CXF生成代理接口,我不确定是否有任何方式可以干预并返回Scala Future(AFAIK Akka使用Scala Futures)而不是Java Future? 选项3:使用回调方法。 由CXF生成的返回Java Future的异步方法也需要一个回调对象,我想这将在结果准备好时提供回调。 要使用这种方法,我需要返回一个等待我收到回调的Future。 我认为选项3最有希望,虽然我对如何返回一个将在收到回调时完成的Promise没有任何想法。 我可能有一个线程等待一段while(true)并等待,直到结果可用。 再一次,我不知道如何在不阻塞线程的情况下进入wait ? 简而言之,我正在尝试构建一个系统,该系统正在进行大量的SOAP Web服务调用,其中每个调用都会占用大量时间。 在大量并发Web服务调用的情况下,系统可能很容易耗尽线程。 我正在寻找一种基于非阻塞I / O的解决方案,它可以同时允许许多正在进行的Web服务调用。