私は長い間この問題を調査しましたが、解決策は私にはありません。大気試料の大気 - チャット - マルチルームを実行すると@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]をクリックします。何も起こらなかった。
誰でも助けることができます。前もって感謝します。
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