1

Ich erweiterte das Chat-Beispiel und fügte alle 5 Sekunden eine Nachricht "Stay-Alive" hinzu. Wenn ich debugge und den Code durch Break-Punkte ausführen, wird es einwandfrei ausgeführt. Aber wenn ich es stürzt mit dem Protokoll nur die App laufe unter:Playframe InvocationTargetException aufgetreten: null

// Loop while the socket is open 
     while (inbound.isOpen()) { 

      // Wait for an event (either something coming on the inbound 
      // socket channel, or ChatRoom messages) 
      Either<WebSocketEvent, Chat> e = await(Promise.waitEither(
        inbound.nextEvent(), serverStream.nextEvent())); 

      // Incoming text event on WebSocket 
      for (String json : TextFrame.match(e._1)) { 
       Chat message = Chat.fromJSON(json); 
       message.saveAsChatMessage(client, user); 

       if (message.isPublishable()) { 
        serverStream.publish(message); 
       } 
      } 

      // After processing information we need to beam this done on the 
      // WebSocket 
      for (Chat chat : ClassOf(Chat.class).match(e._2)) { 
       if (chat.isMeantForMe(client, user, threads)) { 
        outbound.send(chat.toJSON()); 
       } 
      } 

      // Case: The socket has been closed 
      for (WebSocketClose closed : SocketClosed.match(e._1)) { 
       user.setOnline(false); 
       user._save(); 

       // Update all the threads for this user 
       for (Thread t : threads) { 
        Chat chat = new Chat(); 
        chat.event = event_type.OFFLINE; 
        chat.userId = user.id; 
        serverStream.publish(chat); 
       } 

       disconnect(); 
      } 
     } 

Dies ist das komplette Protokoll:

Execution exception 
InvocationTargetException occured : null 

play.exceptions.JavaExecutionException 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:233) 
    at play.mvc.WebSocketInvoker.invoke(WebSocketInvoker.java:28) 
    at play.server.PlayHandler$WebSocketInvocation.execute(PlayHandler.java:1161) 
    at play.Invoker$Invocation.run(Invoker.java:276) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: java.lang.reflect.InvocationTargetException 
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:551) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502) 
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478) 
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161) 
    ... 11 more 
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Iterator 
    at controllers.ChatServerController.join(ChatServerController.java) 
    ... 16 more 

Ich kenne seinen Erhaltenes mit etwas zu tun mit Nebenläufigkeit zu tun. Was kann ich tun, um ein totes Schloss zu verhindern?

Antwort

0

Der Fehler, den ich machte, war, JPA-Modelle im Ereignisstream zu senden. Die von verschiedenen Threads aufgerufen wurden, die den Absturz verursachten. Ich änderte zu dem Code, um einen json (string type) an den Ereignisstrom oder ein einfaches Objekt zu senden.