¿Cómo puedo usar un typedactor en una aplicación Java?
-
27-10-2019 - |
Pregunta
Intento implementar un TypedActor
en Java siguiendo los ejemplos en Actores mecanografiados (Java). Pero estoy luchando. Yo he añadido akka-actor-1.1-M1.jar
, akka-typed-actor-1.1-M1.jar
, scala-library.jar
Pero no fue suficiente. Tengo errores en eclipse, así que también agregué aspectwerkz-2.0.jar
y aspectwerkz-core-2.0.jar
a mi camino de construcción.
Intento usar un typedactor con constructor personalizado.
Pero ahora recibo un error en la compilación:
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)
Aquí está mi código para el 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 = num;
System.out.println("booted");
}
public void testData(String str, int num) {
System.out.println(this.str + " " + this.num);
System.out.println(str + " " + num);
}
}
Mi interface
Para el servicio:
public interface BaseService {
public void testData(String str, int num);
}
Y una clase de prueba:
import akka.actor.TypedActor;
import akka.actor.TypedActorFactory;
public class ActorTest {
public static void main(String[] args) {
BaseService service = TypedActor.newInstance(BaseService.class,
new TypedActorFactory() {
public TypedActor create() {
return new BaseActor("someString", 12);
}
});
service.testData("Hello", 6);
}
}
En el ejemplo que escriben:
Service service = TypedActor.newInstance(classOf[Service],
new TypedActorFactory() {
public TypedActor create() {
return new ServiceWithConstructorArgsImpl("someString", 500L));
});
Pero no creo que classOf[Service]
Es Java, se parece más a Scala.
¿Cómo puedo implementar un TypedActor
con un constructor personalizado?
Solución
Su código es correcto, por lo que puedo ver. Para instanciar un typedactor en Java con un constructor no predeterminado, debe usar:
BaseService service = TypedActor.newInstance(BaseService.class,
new TypedActorFactory() {
public TypedActor create() {
return new BaseActor("someString", 12);
}
});
De hecho, el documento oficial contiene un error tipográfico.
¿Puedes intentar usar SuppectWerkz-2.2.3? He probado tu código y funciona para mí. La única diferencia es la versión de AspectWerkz que estoy usando.
Además, tenga en cuenta que estas son las dependencias para el actor tipo AKKA 1.1-M1:
<dependency org="org.codehaus.aspectwerkz" name="aspectwerkz" rev="2.2.3" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>
<dependency org="aopalliance" name="aopalliance" rev="1.0" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>
<dependency org="org.guiceyfruit" name="guice-all" rev="2.0" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>
<dependency org="se.scalablesolutions.akka" name="akka-stm" rev="1.1-M1" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>
<dependency org="org.scala-lang" name="scala-library" rev="2.9.0.RC1" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>