在Play 2.2中,我创建了GlobalActor制作类
import akka.actor.{Props, IndirectActorProducer, Actor}
import play.api.Play
class GlobalActorProducer[T <: Actor](val aClass: Class[T]) extends IndirectActorProducer {
def produce(): T = Play.current.global.getControllerInstance(aClass)
def actorClass: Class[T] = aClass
}
object GlobalActorProducer {
def apply[T <: Actor](targetClass: Class[T]): Props = Props.create(classOf[GlobalActorProducer[T]], targetClass)
}
我想将游戏框架升级到 2.5。Play.current在play 2.5中被弃用,所以我使用注入器修改了这个类,但注入器始终为Null。我需要如何使这门课在 Play 2.5 中工作?
import akka.actor.{Props, IndirectActorProducer, Actor}
import javax.inject.Inject
import com.google.inject.Injector
class GlobalActorProducer[T <: Actor](val aClass: Class[T]) extends IndirectActorProducer {
@Inject private var injector : Injector = _
def produce(): T = injector.getInstance(aClass)
def actorClass: Class[T] = aClass
}
object GlobalActorProducer {
def apply[T <: Actor](targetClass: Class[T]): Props = Props.create(classOf[GlobalActorProducer[T]], targetClass)
}
如依赖注入执行器中所述,您希望在play.api.libs.concurrent.AkkaGuicesupport命名空间中使用Play提供的Akka Guice支持。
Play 提供了一些帮助程序来帮助提供参与者绑定。这些允许将参与者本身注入依赖项,并允许将参与者的参与者引用注入到其他组件中。要使用这些帮助程序绑定Actor,请按照依赖注入文档中的说明创建一个模块,然后混合使用AkkaGuiceSupport特征并使用bindActor方法绑定Actor:
import com.google.inject.AbstractModule
import play.api.libs.concurrent.AkkaGuiceSupport
import actors.ConfiguredActor
class MyModule extends AbstractModule with AkkaGuiceSupport {
def configure = {
bindActor[ConfiguredActor]("configured-actor")
}
}
@Singleton
class Application @Inject() (@Named("configured-actor") configuredActor: ActorRef, components: ControllerComponents)
(implicit ec: ExecutionContext) extends AbstractController(components) {
implicit val timeout: Timeout = 5.seconds
def getConfig = Action.async {
(configuredActor ? GetConfig).mapTo[String].map { message =>
Ok(message)
}
}
}
注入Actor
是一种不好的做法。ActorRef是由ActorRef系统以特殊方式创建的,而不会暴露实际对象,而是暴露ActorRef(句柄)。
解决方案:
这个想法是注入< code>ActorSystem,然后使用
< code>actorSystem.actorOf
我用玩Web应用程序(没什么不寻常的)。Guice用于依赖注入。如何在类构造函数中注入属性值?代码如下。 在当前配置中,如果不运行应用程序,就无法测试。我希望能够在单元测试中实例化。完美的解决方案[从我的角度来看]应该是这样的: 不幸的是,这段代码不起作用,因为Guice没有“my”。bar绑定: 没有绑定使用 @com.google.inject.name.Named(value=my.bar)
我正在使用Scala/Akka编写一个TCP客户端服务器程序。服务器端的一些参与者需要处理来自客户端的TCP消息。我使用了(复制)代码,基本上解析接收到的TCP消息,在接收到分隔符时,消息被发送给其他人。 由于不止一个actor使用此逻辑,所以我在baseTCP actor中对其进行了抽象,并从该actor继承了其他actor。我想在这个基本actor中添加一些常见的代码,比如处理bound/co
我很想知道调整大小,或者在本例中增加单个节点系统上的actor池中actor的数量是否真的会影响性能。 我有一个带超线程的四核系统。在任何给定的点上,系统可以运行8个线程。假设执行元执行的大多数操作都是CPU绑定的,那么将池中的执行元数量从20个增加到40个会有什么收获呢?
null 函数getAndProcessData包含并行执行3个Future.Sequence。 现在,随着我对Akka的阅读越来越多,我发现使用ask会创建另一个actor Listener。问题是: 正如我们广泛使用的ask,它是否会导致系统中使用多个线程,有时可能会导致线程饥饿? 使用future.map也往往意味着不同的线程。我读到过一个线程演员的幻觉,它可以很容易地通过混合未来打破。 此
让我们假设一个使用Akka Typed实现的应用程序有一个持久执行元。这个持久执行元作为其操作的一部分创建了瞬态(或非持久)子执行元,每个子执行元都有一个唯一的ID,这些ID是持久状态的一部分。持久执行元还需要一些与其子级通信的方式,但我们不希望持久化子级的,因为它们实际上不是状态的一部分。在恢复时,持久参与者应该基于恢复的状态重新创建它的子级。这听起来并不像是一个很不寻常的用例,我正在试图弄清楚
我经常发现自己使用一个“主”角色,为子任务创建许多子角色。当子任务完成时,主角也应该停止自己。所以当时,我观察子角色并停止主角色context.children.is。 我经常使用这种模式,但因为我从未读过这方面的文章。我不确定,这是一个好主意还是失败的演员有问题。。。? 我已经读过Akka 2中的关机模式,但是这种方法在Java中似乎比我的解决方案更复杂? 以下是我针对具有两个子任务的主要参与者