我有一个List(例如数据库查询的输出)变量,我用它来创建actor(它们可能很多而且变化很多)。我使用以下代码(在TestedActor preStart()中),actor限定名称来自List变量作为示例):
Class<?> classobject = Class.forName("com.java.anything.actor.MyActor"); //create class from name string
ActorRef actref = getContext().actorOf(Props.create(classobject), actorname); //creation
代码已经过测试:
@Test
public void testPreStart() throws Exception {
final Props props = Props.create(TestedActor.class);
final TestActorRef<TestedActor > ref = TestActorRef.create(system, props, "testA");
@SuppressWarnings("unused")
final TestedActor actor = ref.underlyingActor();
}
编辑:它工作正常(与上一篇文章相反,我发现超时错误,结果是无关警报)。
我搜索了一些与此问题相关的帖子(例如建议使用newInstance),但是我仍然感到困惑,因为这些都被提到它是一个糟糕的模式。所以,我正在寻找一个java的解决方案,从akka的角度来看也是安全的(或者确认上面的模式)。
答案 0 :(得分:1)
也许如果你想写信给我们为什么你需要以这种方式创建这些演员,这将有助于找到解决方案。
实际上大多数人都会告诉你,使用反射并不是最好的主意。有时这是唯一的选择,但你应该避免它。
也许这对你来说是一个解决方案:
由于演员真的很便宜,你可以预先创建所有演员。你有多少人?
现在查询可以返回一个指向actor的路径,而不是类。选择actorSelection
并向其发送消息。
如果你的演员做了很长时间的工作,你可以使用路由器,或者如果你想要一个能够根据需要产生其他演员的代理演员。其他选择是从单个参与者创建期货。
这实际上取决于案例,因为您可能需要创建多个执行上下文,而不是让任何演员(期货)都饿死。