2012-10-02 64 views
2

我有一個連接到遠程Akka羣集系統的play framework 2,這兩個系統都在java中。 我有一個包裝在一個類中的數據結構,我已經在包裝類上實現了可序列化的 。 我想使用數據strauture遠程計算,但任何時候我嘗試發送包裝類到遠程Akka系統我得到一個錯誤。使用Play 2和遠程Akka羣集實現序列化

下面是代碼片段。

這是包裝類

package controllers; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.Map; 

public class Coordinates implements Serializable{ 


    String className = null; 
    Map <String,ArrayList<Object>> jMap = null; 
    boolean train = false; 

    public Coordinates() { train = true;} 

    public Coordinates (String className) 
    { 
     this.className = className;  
    } 

    public Coordinates (Map <String,ArrayList<Object>> jMap , boolean b) 
    {   

     this.jsonMap = jMap;  
     train = b; 
      }   
} 

這是演員類發送

package controllers; 

import akka.actor.ActorRef; 
import akka.actor.UntypedActor; 

public class LocalActor extends UntypedActor { 

    ActorRef masterActor; 
    @Override 
    public void onReceive(Object arg) throws Exception { 
     if(arg instanceof Coordinates) 
     { Coordinates msg = (Coordinates) arg ; 
      masterActor.tell(msg , getSelf()); 
     }  
    } 


    public void preStart() 
    { 
     masterActor = getContext().actorFor("akka://[email protected]:2552/user/masterActor"); 
    } 

} 

這是阿卡演員的接收類

package Rubine_Cluster; 

import java.io.Serializable; 

import akka.actor.*; 


public class MasterActor extends UntypedActor implements Serializable{ 

    public MasterActor(){System.out.println(" the masteractor has been started ");} 

    @Override 
    public void onReceive(Object message) throws Exception { 
     System.out.print(" this is from before me to you "+message.toString()); 

     if(message instanceof Coordinates) 
     { Coordinates msg = (Coordinates) message; 

      try { System.out.print(" this is from message " + msg.jsonMap.toString()); 
        getSender().tell(1234 , getSelf()); 
       } catch (Exception e) { 
        getSender().tell(new akka.actor.Status.Failure(e), getSelf()); 
        throw e; 
       } 

    } 
     else{ unhandled(message);} 
    } 
} 

這是對象來自我的eclipse IDE的錯誤信息

[INFO] [10/02/2012 02:58:35.606] [main] [ActorSystem(MasterNode)] REMOTE: [email protected]://[email protected]:2552 
Master Node is called 
the masteractor has been started 
[INFO] [10/02/2012 02:59:28.223] [MasterNode-7] [ActorSystem(MasterNode)] REMOTE: [email protected]://[email protected]:63305 
[ERROR] [10/02/2012 02:59:28.334] [MasterNode-7] [ActorSystem(MasterNode)] REMOTE: [email protected]://[email protected]:2552] Error[java.lang.ClassNotFoundException:controllers.Coordinates 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Unknown Source) 
    at java.io.ObjectInputStream.resolveClass(Unknown Source) 
    at akka.util.ClassLoaderObjectInputStream.resolveClass(ClassLoaderObjectInputStream.scala:12) 
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) 
    at java.io.ObjectInputStream.readClassDesc(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at akka.serialization.JavaSerializer$$anonfun$1.apply(Serializer.scala:121) 
    at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57) 
    at akka.serialization.JavaSerializer.fromBinary(Serializer.scala:121) 
    at akka.serialization.Serialization.deserialize(Serialization.scala:73) 
    at akka.remote.MessageSerializer$.deserialize(MessageSerializer.scala:22) 
    at akka.remote.RemoteMessage.payload(RemoteTransport.scala:210) 
    at akka.remote.RemoteMarshallingOps$class.receiveMessage(RemoteTransport.scala:276) 
    at akka.remote.netty.NettyRemoteTransport.receiveMessage(NettyRemoteSupport.scala:30) 
    at akka.remote.netty.RemoteServerHandler.messageReceived(Server.scala:182) 
    at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75) 
    at akka.remote.netty.RemoteServerHandler.handleUpstream(Server.scala:154) 
    at org.jboss.netty.channel.StaticChannelPipeline.sendUpstream(StaticChannelPipeline.java:366) 
    at org.jboss.netty.channel.StaticChannelPipeline$StaticChannelHandlerContext.sendUpstream(StaticChannelPipeline.java:528) 
    at org.jboss.netty.handler.execution.ChannelUpstreamEventRunnable.run(ChannelUpstreamEventRunnable.java:44) 
    at org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor$ChildExecutor.run(OrderedMemoryAwareThreadPoolExecutor.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
] 

我也有alos在Remote Akka系統中實現Coordinate類。 任何建議或幫助將不勝感激。 謝謝

回答

1

您不必兩次實現座標類。您應該有一個包含所有模型類(Coordinate等)的模塊,並根據第一個模型創建另外兩個Akka項目。

你應該有這樣的項目/模塊的依賴性:

module containing Coordinate class (Maven Project) 
    | 
    ---- Local Actor (Play project) 
    | 
    ---- Remote Actor (Maven Project) 
+0

是第一個將包含兩個項目實施的抽象類的模型。你能解釋一下,這對我來說是一個有點新手,在編程框架和akka java。 –

+0

沒有。您必須在分離的模塊或項目中只有一個模型類的實現,而其他兩個項目都必須依賴此模型(通過自定義您的Build.scala文件http://www.playframework.org/documentation/2.0.3/SBTSubProjects) –

+0

所以這意味着在Play框架中,我必須添加一個依賴項到build.scala文件中,並且在Akka中,我將不得不依賴於POM.xml文件,因爲遠程Akka是一個Maven項目。 –

0

顯然你的主人演員沒有controllers.Coordinates在它的類路徑中。另一個答案表明代碼的可重用性,但這不是根本原因;在某些情況下,這也沒有意義(您可以在本地和主控中執行不同的操作)。你的主演如何建造?它的類路徑是什麼樣的?只需將該類添加到主項目中,您應該沒問題。

+0

好的會嘗試,也謝謝 –