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?

¿Fue útil?

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(*)"/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top