2011-04-29 32 views
2

我試着按照Typed Actors (Java)上的例子在Java中實現TypedActor。但我很掙扎。我添加了akka-actor-1.1-M1.jar,akka-typed-actor-1.1-M1.jar,scala-library.jar,但這還不夠。我在Eclipse中遇到錯誤,因此我還將aspectwerkz-2.0.jaraspectwerkz-core-2.0.jar添加到我的構建路徑中。如何在Java應用程序中使用TypedActor?

我嘗試使用帶有自定義構造函數的TypedActor。

但現在我在編譯時出現錯誤:

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) 

這裏是我的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); 
    } 
} 

interface的服務:

public interface BaseService { 

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

而且一測試等級:

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

} 

在這個例子中,他們寫道:

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

但我不認爲classOf[Service]是Java,它看起來更像斯卡拉。

如何使用自定義構造函數實現TypedActor

回答

3

就我所見,您的代碼是正確的。 要實例在Java中使用非默認構造TypedActor,你應該使用:

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

事實上,官方文檔中包含一個錯字。

你可以嘗試使用aspectwerkz-2.2.3嗎?我已經試過你的代碼,它確實對我有用。唯一的區別是我使用的aspectwerkz版本。

而且,請注意,這些是阿卡,類型化的演員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(*)"/> 
+0

謝謝,這看起來不錯。我只能在最新的版本中找到AspectWerkz 2.0:http://aspectwerkz.codehaus.org/releases.html哪裏可以找到2.2.3?我試圖現在添加其他依賴關係,但它沒有幫助。 – Jonas 2011-04-29 09:40:09

+1

http://akka.io/repository/org/codehaus/aspectwerkz/aspectwerkz/2.2.3/ – 2011-04-29 09:47:33

+0

謝謝,現在工作! – Jonas 2011-04-29 09:49:21

相關問題