Frage

Ich versuche eine implementieren TypedActor in Java folgen den Beispielen auf Typisierte Schauspieler (Java). Aber ich kämpfe. Ich habe hinzugefügt akka-actor-1.1-M1.jar, akka-typed-actor-1.1-M1.jar, scala-library.jar Aber es war nicht genug. Ich habe Fehler in der Sonnenfinsternis bekommen, also habe ich auch hinzugefügt aspectwerkz-2.0.jar und aspectwerkz-core-2.0.jar auf meinen Bauweg.

Ich versuche, einen Typedaktor mit benutzerdefiniertem Konstruktor zu verwenden.

Aber jetzt bekomme ich einen Fehler bei der Zusammenstellung:

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)

Hier ist mein Code für die 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);
    }
}

Mein interface Für den Service:

public interface BaseService {

    public void testData(String str, int num);
}

Und eine Testklasse:

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);
    }

}

In dem Beispiel schreiben sie:

Service service = TypedActor.newInstance(classOf[Service], 
                                         new TypedActorFactory() {
  public TypedActor create() {
    return new ServiceWithConstructorArgsImpl("someString", 500L));
});

Aber ich denke das nicht classOf[Service] Ist Java, es sieht eher nach Scala aus.

Wie kann ich eine implementieren TypedActor mit einem benutzerdefinierten Konstruktor?

War es hilfreich?

Lösung

Ihr Code ist korrekt, soweit ich sehen kann. Um einen Typedaktor in Java mit einem nicht Standardkonstruktor zu instanziieren, sollten Sie verwenden:

BaseService service = TypedActor.newInstance(BaseService.class,
                                                     new TypedActorFactory() {
            public TypedActor create() {
                return new BaseActor("someString", 12);
            }
        });

In der Tat enthält der offizielle Dokument einen Tippfehler.

Können Sie versuchen, AspekteWerkz-2.2.3 zu verwenden? Ich habe Ihren Code ausprobiert und es funktioniert für mich. Der einzige Unterschied ist die Version von AspekteWerkz, die ich verwende.

Bitte beachten Sie außerdem, dass dies die Abhängigkeiten für AKKA-Typed-Actor 1.1-M1 sind:

<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(*)"/>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top