1

Я продлил пример чата и добавил сообщение «оставаться в живых» каждые 5 секунд. Если я отлаживаю и запускаю код через точки останова, он работает отлично. Однако, если я просто запустить приложение он падает с ниже журнала:Playframework InvocationTargetException: 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(); 
      } 
     } 

Вот полный лог:

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 

Я знаю, что его надо делать что-то делать с параллелизмом. Что я делаю, чтобы предотвратить мертвый замок?

ответ

0

Ошибка, которую я делал, заключалась в том, чтобы отправлять модели JPA в поток событий. Которые вызывались из разных потоков, вызывающих крушение. Я изменил код, чтобы отправить json (строковый тип) в поток событий или простой объект.