2016-01-03 2 views
0

Привет, ребята. В моем приложении WebSocket серверу WS необходимо обрабатывать три типа сообщений: DataPkg, SigPkg и WS_SigPkg. DataPkg является двоичным для пользовательских данных, с заголовками контроллера; SigPkg - это String для управления пользовательскими данными между WS-клиентами, а WS_SigPkg также является String для регистрации на WS-сервере и переключения DataPkg и SigPkg между различными сеансами WS.Java WebSocket: Multi Text/Data MessageHandler

Так я ставлю шесть кодера/декодеры:

decoders = {SigDecoder.class, WS_SigDecoder.class, DataDecoder.class}, 
encoders = {SigEncoder.class, WS_SigEncoder.class, DataEncoder.class} 

Тогда я получил сильфон ошибки:

Caused by: javax.servlet.ServletException: Web socket server initialization failed. 
    at org.glassfish.tyrus.servlet.TyrusServletFilter.init(TyrusServletFilter.java:126) 
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275) 
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:131) 
    ... 28 more 
Caused by: javax.websocket.DeploymentException: Class org.sample.xyzserver.XyzServer. Text MessageHandler already registered. 

кажется GlashFish сервер 4.1.1 не может добавить два MessageHandlers для струнных сообщений, хотя в верхний слой они разные, и декодеры могут это найти.

Есть ли какое-либо упущенное понимание или есть простой подход, или мне нужно рефакторинг использовать только один MessageHandler для строки и один для двоичного? Благодарю.

ответ

0

Это по дизайну Session.addMessageHandler. Вы можете зарегистрировать только один MessageHandler для каждого типа сообщения (текст, бинарный или понг). В заявке Javadoc указывается:

Register to handle to incoming messages in this conversation. A maximum of one message handler per native websocket message type (text, binary, pong) may be added to each Session. I.e. a maximum of one message handler to handle incoming text messages a maximum of one message handler for handling incoming binary messages, and a maximum of one for handling incoming pong messages. For further details of which message handlers handle which of the native websocket message types please see MessageHandler.Whole and MessageHandler.Partial. Adding more than one of any one type will result in a runtime exception.