我正在尝试使用JRuby使用最新的Akka版本(现在为2.3.2)创建一个actor。问题是,我一直收到错误:
Java::JavaLang::IllegalArgumentException: erased Creator types are unsupported, use Props.create(actorClass, creator) instead
基本上,我正在Akka Documentation
上关注此处的代码我无法创建akka.japi.Creator
,因为这需要通用信息,并且这些信息在运行时被删除(而JRuby基本上是一个运行时 - 无处不在)。我已经尝试过了:
class GreetingActor < UntypedActor
def onReceive(message)
if (message.is_a? Greeting)
puts("Hello " + message.who)
end
end
end
system = ActorSystem.create("MySystem")
greeter = system.actorOf(Props.create(GreetingActor))
最后一行以erased Creator types are unsupported
失败。我试图将它包装在akka.japi.Creator
下,但出现同样的错误(因为Creator需要泛型信息,而JRuby不提供它)。我试过用“become_java!”在GreetingActor上,但它返回nil(如果Ruby类从Java类扩展,JRuby不能从Ruby类创建新的java类。)
有没有办法声明Creator传递泛型信息?
答案 0 :(得分:2)
我试图做同样的事情,虽然我没有回答标题的问题,但我确实有一个答案可以让这个例子有效。您必须使用不同的方法来构造Props实例。
您需要使用工厂:
java_import 'akka.actor.UntypedActorFactory'
class GreetingActorFactory
include UntypedActorFactory
def create
GreetingActor.new
end
end
然后您可以按如下方式使用它:
system = ActorSystem.create("GreetingSystem")
props = Props.create(GreetingActorFactory.new)
greeter = system.actorOf(props, "greeter")
greeter.tell(Greeting.new("John Weathers"), nil)
希望这有助于您进一步发展!
答案 1 :(得分:0)
我已经使用以下要点解决了Akka问题:https://gist.github.com/mauricioszabo/6a713fd416c512e49f70
但是,JRuby实现可能会在依赖于未擦除类型的其他库上失败,但是现在,我可以使用上面的代码在Akka中解决。