How can I use a TypedActor in a Java application?
I try to implement a TypedActor in Java following the examples on Typed Actors (Java). But I'm struggling. I have added akka-actor-1.1-M1.jar, akka-typed-actor-1.1-M1.jar, scala-library.jar but it wasn't enough. I got errors in Eclipse so I also added aspectwerkz-2.0.jar and aspectwerkz-core-2.0.jar to my Build Path.
I try to use a TypedActor with custom constructor.
But now I get an error at 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)
Here is my code for the 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);
    }
}
My interface for the service: 
public interface BaseService {
    public void testData(String str, int num);
}
And a test class:
import akka.actor.TypedActor;
import akka.actor.TypedActorFactory;
public class ActorTest {
    public static void main(String[] args) {
        BaseService service = TypedActor.newInstance(BaseService.class,
                                                     new T开发者_如何学编程ypedActorFactory() {
            public TypedActor create() {
                return new BaseActor("someString", 12);
            }
        });
        service.testData("Hello", 6);
    }
}
In the example they write:
Service service = TypedActor.newInstance(classOf[Service], 
                                         new TypedActorFactory() {
  public TypedActor create() {
    return new ServiceWithConstructorArgsImpl("someString", 500L));
});
But I don't think that classOf[Service] is Java, it's looks more like Scala.
How can I implement an TypedActor with a custom constructor?
Your code is correct, as far as I can see. To instantiate a TypedActor in Java with a non default constructor, you should use:
BaseService service = TypedActor.newInstance(BaseService.class,
                                                     new TypedActorFactory() {
            public TypedActor create() {
                return new BaseActor("someString", 12);
            }
        });
Indeed, the official doc contains a typo.
Can you try to use aspectwerkz-2.2.3? I have tried your code and it does work for me. The only difference is the version of aspectwerkz I'm using.
Also, please note that these are the dependencies for akka-typed-actor 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(*)"/>
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论