реализация сериализации с Play 2 и удаленным кластером Akka

У меня есть игровая платформа 2, которая подключена к удаленной кластерной системе Akka, обе системы находятся в java. У меня есть структура данных, которая завернута в класс, и я реализовал сериализуемый класс-оболочку. Я хочу использовать структуру данных для удаленных вычислений, но каждый раз, когда я пытаюсь отправить класс-оболочку в удаленную систему 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");
    }

}

это актер Akka получает класс

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: RemoteServerStarted@akka://[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: RemoteClientStarted@akka://[email protected]:63305
[ERROR] [10/02/2012 02:59:28.334] [MasterNode-7] [ActorSystem(MasterNode)] REMOTE: RemoteServerError@akka://[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)
]

Я также реализовал класс Coordinate в системе Remote Akka. Любое предложение или помощь будут оценены. Спасибо


person faisal abdulai    schedule 02.10.2012    source источник


Ответы (2)


Вам не нужно реализовывать класс Coordinate дважды. У вас должен быть модуль, содержащий все ваши классы моделей (координаты и т. д.), и сделайте два других проекта Akka в зависимости от этого первого.

У вас должна быть такая зависимость проекта/модуля:

module containing Coordinate class (Maven Project)
   |
   ---- Local Actor (Play project)
   |
   ---- Remote Actor (Maven Project)
person ndeverge    schedule 02.10.2012
comment
Будет ли первая модель содержать абстрактные классы, которые будут реализованы двумя проектами. Можете ли вы объяснить это мне, я немного новичок в программировании в игровой среде и akka java. - person faisal abdulai; 02.10.2012
comment
Неа. У вас должна быть только одна реализация вашего класса модели в отдельном модуле или проекте, и оба других проекта должны зависеть от этого (путем настройки файла Build.scala, playframework.org/documentation/2.0.3/SBTSubProjects) - person ndeverge; 03.10.2012
comment
это означает, что в среде Play мне нужно добавить зависимость к файлу build.scala, а в Akka мне придется добавить зависимость к файлу POM.xml, поскольку удаленная Akka является проектом Maven. - person faisal abdulai; 03.10.2012
comment
это означает, что вам нужно создать автономный проект Maven для вашего класса моделей, а затем добавить к нему зависимость в ваших проектах Play (Build.scala) и удаленных проектах Akka (pom.xml). - person ndeverge; 03.10.2012
comment
Я новичок здесь. план состоит в том, чтобы получить данные из интерфейса игры, подключенные к классу контроллера с использованием Json. Я сделал эту часть. затем данные помещаются в структуру данных, например Map‹String , Object›. оберните этот объект в класс и подключите объект класса к удаленной системе Akka, которая является проектом maven. Должен ли я создать файл jar из проекта-оболочки. И не могли бы вы помочь мне с упрощенным фрагментом кода. Я умоляю вас. потому что проект опаздывает - person faisal abdulai; 03.10.2012

Очевидно, что у вашего главного актера нет контроллеров. Координаты в пути к классам. В другом ответе предлагалось повторное использование кода, но это не основная причина; в некоторых случаях это также не имеет смысла (у вас могут быть разные операции на локальном и главном). Как устроен ваш мастер-актер? Как выглядит путь к классам? Просто добавьте класс в мастер-проект, и все будет в порядке.

person Mirko Adari    schedule 10.10.2012