0

play Framework を使用して rubine アルゴリズムを実装する akka Java プロジェクトに問題があり、解決策を得たいと考えているコミュニティと共有したいと考えています。

プロジェクトには、子アクターを作成する akka マスター アクターが含まれています。次に子アクターは、何らかのタスクを実行する Java クラスを初期化します。タスクのデータは、websocket と json オブジェクトを使用して Web インターフェイスによって提供されます。json オブジェクトには double データ型が含まれています。Play フレームワークのアプリケーション クラスは、ウェブ インターフェースからデータを取得し、マスター アクターに渡します。次に、マスター アクターが子アクターを作成し、子アクターにデータを渡します。以下はコード スニペットです。関連するセクションは強調表示されています

これはアプリケーション クラスからのものです。

public class Application extends Controller {   
static ActorRef masterActor;
RubineActor rubineactor;

public static Result index() {        
return ok(index.render(null)); }

public static WebSocket<JsonNode> sockHandler() {     
return new WebSocket<JsonNode>() {
// called when the websocket is established
public void onReady(final WebSocket.In<JsonNode> in, final WebSocket.Out<JsonNode> out) { 

try{ RubineActor.connectMaster(in, out); }  

catch(Exception e){e.printStackTrace();}                        
      }  }; } }

これはマスター俳優からのものです:

public class RubineActor extends UntypedActor {         
static ObjectMapper mapper;       
Map<String,ArrayList<Double>> jsonMap;          
LoggingAdapter log = Logging.getLogger(getContext().system(), this);        
ActorRef childActor = getContext().actorOf(new Props(ChildActor.class), "childactor");
static ActorRef masterActor = Akka.system().actorOf(new Props(RubineActor.class));    

public static void connectMaster (final WebSocket.In<JsonNode> in, 
final WebSocket.Out<JsonNode> out)
{   in.onMessage(new Callback<JsonNode>() {
public void invoke(JsonNode event) throws JsonParseException, JsonMappingException,  
IOException {    

ObjectMapper mapper = new ObjectMapper();                 
@SuppressWarnings("unchecked")
Map<String,ArrayList<Double>> jsonMap = mapper.readValue(event, Map.class);

masterActor.tell(new Coordinates(jsonMap));                                         
("timeArray").toString();  }    });   }

@Override
public void onReceive(Object message) throws Exception {        
if(message instanceof Coordinates)

{Coordinates msg = (Coordinates) message;
childActor.tell(msg); } 
else { unhandled(message);}  }

public static class Coordinates {                                                   
Map <String,ArrayList<Double>> jsonMap = null;              
public Coordinates (Map <String,ArrayList<Double>> jsonMap ) {              
super();
this.jsonMap = jsonMap;  }  }}
this is from the child actor
public class ChildActor extends UntypedActor {                  
public ChildActor (){}

@Override
public void onReceive(Object msg) throws Exception  

if(msg instanceof Coordinates) {
Coordinates cood = (Coordinates) msg;
new Gesture(cood.jsonMap);
    }
else { unhandled(msg);} }}

これは通常の Java クラスからのものです。

Map<String, ArrayList<Double>> jsonMap ;
Map <String,ArrayList<Long>> jsonMap2 ;                             

public Gesture(){}        
public Gesture (Map<String, ArrayList<Double>> jsonMap)
{  this.jsonMap  = jsonMap;
npoints = jsonMap.size();
intial_Theta();  }

public void intial_Theta() {    

// this line produces a class cast exception error.the error is given below.
double  dx = jsonMap.get("x").get(2) - jsonMap.get("x").get(0);} 

これはエラーメッセージです:

[info] Compiling 4 Scala sources and 10 Java sources to C:\Users\FAISAL\workspac
e\Sketch_Server\target\scala-2.9.1\classes...
[info] play - Application started (Dev)
[info] play - Starting application default Akka system.
[ERROR] [08/07/2012 05:15:11.187] [application-akka.actor.default-dispatcher-3]
[akka://application/user/$a/childactor] java.lang.Integer cannot be cast to java
.lang.Double
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Doub
le
        at model.Gesture.intial_Theta(Gesture.java:90)
        at model.Gesture.<init>(Gesture.java:74)
        at model.ChildActor.onReceive(ChildActor.java:19)
        at akka.actor.UntypedActor$$anonfun$receive$1.apply(UntypedActor.scala:1
54)
        at akka.actor.UntypedActor$$anonfun$receive$1.apply(UntypedActor.scala:1
53)
        at akka.actor.Actor$class.apply(Actor.scala:318)
        at akka.actor.UntypedActor.apply(UntypedActor.scala:93)
        at akka.actor.ActorCell.invoke(ActorCell.scala:626)
        at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197)
        at akka.dispatch.Mailbox.run(Mailbox.scala:179)
        at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(
AbstractDispatcher.scala:516)
        at akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259)
        at akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)
        at akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1479)
        at akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)

どんな提案でも大歓迎です。

4

1 に答える 1

0

これはすぐに Akka や Play に関するものではないように思えIntegerます。JSON データに値が含まれているだけです。

変数を であると宣言したため、型安全な言語では発生しないと予想されますがArrayList<Double>、それは Java です。問題を再現する簡略版を次に示します。

import java.util.HashMap;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;

public class x { 

    static void breakMap(Map x) { 
        ArrayList<Integer> l = new ArrayList<Integer>();
        l.add(new Integer(1));
        x.put("foo", l);
    };

    public static void main(String[] args) { 
        Map<String, ArrayList<Double>> x = new HashMap<String, ArrayList<Double> >();
        breakMap(x);

        ArrayList<Double> y = x.get("foo");
        Double z = y.get(0);

    }   
}

与える

スレッド「メイン」の例外 java.lang.ClassCastException: java.lang.Integer は java.lang.Double にキャストできません
        x.main(x.java:20) で
于 2012-08-07T08:47:02.673 に答える