2016-04-22 7 views
0

私は長い間この問題を調査しましたが、解決策は私にはありません。大気試料の大気 - チャット - マルチルームを実行すると@Message注釈が機能しない

ここにいくつかのコードがあります(私はちょうどSystem.out.printlnフレーズを追加しました)。

web.xmlの

<display-name>Atmosphere Chat</display-name> 
<servlet> 
    <description>AtmosphereServlet</description> 
    <servlet-name>AtmosphereServlet</servlet-name> 
    <servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class> 
    <load-on-startup>0</load-on-startup> 
    <async-supported>true</async-supported> 
</servlet> 
<servlet-mapping> 
    <servlet-name>AtmosphereServlet</servlet-name> 
    <url-pattern>/chat/*</url-pattern> 
</servlet-mapping> 

ChatRoom.java

@ManagedService(path = "/chat/{room}") 
public class ChatRoom { 

    private final ConcurrentHashMap<String, String> users = new ConcurrentHashMap<String, String>(); 

    private final static String CHAT = "/chat/"; 

    @PathParam("room") 
    private String room; 

    @Inject 
    private BroadcasterFactory factory; 

    @Inject 
    private AtmosphereResourceFactory resourceFactory; 

    @Inject 
    private MetaBroadcaster metaBroadcaster; 

    private static Collection<String> getRooms(Collection<Broadcaster> broadcasters) { 
     Collection<String> result = new ArrayList<String>(); 
     for (Broadcaster broadcaster : broadcasters) { 
      if (!("/*".equals(broadcaster.getID()))) { 
       // if no room is specified, use '' 
       String[] p = broadcaster.getID().split("/"); 
       result.add(p.length > 2 ? p[2] : ""); 
      } 
     }; 
     return result; 
    } 
    @Ready(encoders = {JacksonEncoder.class}) 
    @DeliverTo(DeliverTo.DELIVER_TO.ALL) 
    public ChatProtocol onReady(final AtmosphereResource resource) { 
     System.out.println("Client " + resource.uuid() + " connected."); 
     return new ChatProtocol(users.keySet(), getRooms(factory.lookupAll())); 
    } 

    @Disconnect 
    public void onDisconnect(AtmosphereResourceEvent event) { 
     if (event.isCancelled()) { 
      System.out.println("Client " + event.getResource().uuid() + " unexpectedly disconnected."); 
     } else if (event.isClosedByClient()) { 
      System.out.println("Client " + event.getResource().uuid() + " closed the connection"); 
     } 
    } 

    @Message(decoders = {UserDecoder.class}) 
    public void onPrivateMessage(UserMessage user) { 
     System.out.println("Client " + user.getUser() + " send a message."); 
     String userUUID = users.get(user.getUser()); 
     if (userUUID != null) { 
      // Retrieve the original AtmosphereResource 
      AtmosphereResource r = resourceFactory.find(userUUID); 

      if (r != null) { 
       ChatProtocol m = new ChatProtocol(user.getUser(), " sent you a private message: " + user.getMessage().split(":")[1], users.keySet(), getRooms(factory.lookupAll())); 
       if (!user.getUser().equalsIgnoreCase("all")) { 
        factory.lookup(CHAT + room).broadcast(m, r); 
       } 
      } 
     } else { 
      ChatProtocol m = new ChatProtocol(user.getUser(), " sent a message to all chatroom: " + user.getMessage().split(":")[1], users.keySet(), getRooms(factory.lookupAll())); 
      metaBroadcaster.broadcastTo("/*", m); 
     } 
    } 

    @Message(encoders = {JacksonEncoder.class}, decoders = {ProtocolDecoder.class}) 
    public ChatProtocol onMessage(ChatProtocol message) throws IOException { 
     if (message.getMessage().contains("disconnecting")) { 
      users.remove(message.getAuthor()); 
      return new ChatProtocol(message.getAuthor(), " disconnected from room " + room, users.keySet(), getRooms(factory.lookupAll())); 
     } 

     if (!users.containsKey(message.getAuthor())) { 
      users.put(message.getAuthor(), message.getUuid()); 
      return new ChatProtocol(message.getAuthor(), " entered room " + room, users.keySet(), getRooms(factory.lookupAll())); 
     } 

     message.setUsers(users.keySet()); 
     return new ChatProtocol(message.getAuthor(), message.getMessage(), users.keySet(), getRooms(factory.lookupAll())); 
    } 
} 

私はのIntelliJ IDEAでこのサンプルを実行すると、のWebSocketを確立することができます。 @Message注釈を除いて、すべての機能が正常に動作します。私はチャットルームを選択することができます。@Ready注釈の動作は以下のようなコンソールログの出力を意味します。

クライアント6c981440-0ae6-43ed-be40-95dfad23d586が接続されています。

私は、ブラウザを閉じると、コンソールログは

クライアント6c981440-0ae6-43ed-be40-95dfad23d586は@Disconnect作品を意味し、接続

を閉じています。

しかし、inputに名前を入力して[Enter]をクリックします。何も起こらなかった。 Choose Name

誰でも助けることができます。前もって感謝します。

PS:実行環境はJDK1.7、tomcat7、大気ランタイムバージョンは2.4.3です。私は名前を入力した後、昨日これをデバッグしました。IllegalArgumentExceptionは以下のコードでキャッチされました。コードは大気ランタイム-2.4.3.jar 組織\雰囲気\雰囲気ランタイム2.4.3 \ \にある

public static Object invokeMethod(Method method, Object objectToInvoke, Object... parameters) { 
    Object objectToEncode = null; 
    boolean hasMatch = false; 

    try { 
     objectToEncode = method.invoke(objectToInvoke, method.getParameterTypes().length == 0?new Object[0]:parameters); 
     hasMatch = true; 
    } catch (IllegalAccessException var6) { 
     logger.trace("", var6); 
    } catch (InvocationTargetException var7) { 
     logger.error("", var7); 
    } catch (IllegalArgumentException var8) { 
     logger.trace("", var8); 
    } catch (Throwable var9) { 
     logger.error("", var9); 
    } 

    if(!hasMatch) { 
     logger.trace("No Method\'s Arguments {} matching {}", method.getName(), objectToInvoke); 
    } 

    return objectToEncode; 
} 

!\ orgの雰囲気\ \ CONFIG \ Invoker.class

答えて

1
\管理

この問題が発生しましたが、encodersdecodersでこの問題が発生した可能性があります。メソッドパラメータをStringに変更してみてください。

関連する問題