Question

J'essaie de mettre en œuvre un TypedActor en Java suivant les exemples sur typées Acteurs (Java) . Mais je me bats. J'ai ajouté akka-actor-1.1-M1.jar, akka-typed-actor-1.1-M1.jar, scala-library.jar mais il ne suffit pas. Je suis arrivé erreurs dans Eclipse donc j'ai aussi ajouté aspectwerkz-2.0.jar et aspectwerkz-core-2.0.jar à mon Build Path.

J'essaie d'utiliser un TypedActor avec le constructeur personnalisé.

Mais maintenant, je reçois une erreur à la compilation:

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)

Voici mon code pour le 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);
    }
}

Mon interface pour le service:

public interface BaseService {

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

Et une classe de test:

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

}

Dans l'exemple, ils écrivent:

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

Mais je ne pense pas que classOf[Service] est Java, il est ressemble plus à Scala.

Comment puis-je mettre en œuvre un TypedActor avec un constructeur personnalisé?

Était-ce utile?

La solution

Votre code est correct, pour autant que je peux voir. Pour instancier un TypedActor en Java avec un constructeur non défaut, vous devez utiliser:

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

En effet, le document officiel contient une faute de frappe.

Pouvez-vous essayer d'utiliser AspectWerkz-2.2.3? J'ai essayé votre code et il fonctionne pour moi. La seule différence est la version de AspectWerkz J'utilise.

En outre, s'il vous plaît noter que ce sont les dépendances pour akka typé acteur 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(*)"/>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top