我执行了的WebSocket端点的应用程序。下面是一些代码:
@ApplicationScoped
@ServerEndpoint(value="/socket", encoders = {MessageEncoder.class, CommandEncoder.class})
public class SocketEndpoint {
/** Default-Logger */
private final static Logger LOG = LoggerFactory.getLogger(SocketEndpoint.class);
@Inject
SessionHandler sessionHandler;
@OnOpen
public void open(Session session, EndpointConfig config) {
LOG.debug("Connected session => '{}' - '{}'", session, config);
sessionHandler.initSession(session);
}
@OnMessage
public void onMessage(Session session, String messageJson) {
// do something
}
@OnClose
public void onClose(Session session, CloseReason reason) {
LOG.debug("Closing session => '{}' - '{}'", session, reason);
sessionHandler.removeSession(session);
}
@OnError
public void onError(Session session, Throwable ex) {
LOG.error("WebSocket error => '{}'", ex.getMessage());
}
}
一个编码类看起来是这样的:
public class MessageEncoder implements Encoder.Text<Message> {
/** Default-Logger */
private final static Logger LOG = LoggerFactory.getLogger(MessageEncoder.class);
@Override
public void init(EndpointConfig config) {
LOG.debug("Init MessageEncoder");
}
@Override
public void destroy() {
LOG.debug("Destroy MessageEncoder");
}
@Override
public String encode(MessageE message) throws EncodeException {
return message.toString();
}
}
打开的WebSocket调用SocketEndpoint.open()
预期。关闭WebSocket的唯一要求MessageEncoder.destroy()
,但没有SocketEndpoint.close()
。
谁能给我一个提醒,我做错了什么?如果没有一个解决方案,我将不得不手动检查注册会议还活着,因为MessageEncoder.destroy()
没有参数。
提前致谢!
UPDATE
只是实现了一个虚拟端点:
@ApplicationScoped
@ServerEndpoint("/dummy")
public class DummyEndpoint {
/** Default-Logger */
private final static Logger LOG = LoggerFactory.getLogger(DummyEndpoint.class);
@OnOpen
public void open(Session session, EndpointConfig config) {
LOG.debug("Connected session with principal => '{}'", session.getId());
}
@OnMessage
public void onMessage(Session session, String messageJson) {
LOG.debug("on message => '{}' => '{}'", session.getId(), messageJson);
}
@OnClose
public void onClose(Session session, CloseReason reason) {
LOG.debug("Closing session => '{}' - '{}'", session, reason);
}
@OnError
public void onError(Session session, Throwable ex) {
LOG.error("WebSocket error => '{}' => '{}'", session, ex.getMessage());
}
}
当使用这种虚拟端点@OnClose
被正确调用。我只能看到的一个主要区别SocketEndpoint
类:DummyEndpoint
不使用任何Encoder
类。
任何提示?
正如在评论中提到的,代码工作就好了。如果我们从这个开始wildfly-的WebSocket,快速入门,添加@OnClose
上装饰的方法ServerEndpoint
,它的工作原理采用Wildfly 10.x的罚款,以及最新的浏览器(例如Chrome的v59.x)。在这里工作ServerEndpoint的例子(以使用@Inject
不要忘记添加beans.xml
在WEB-INF文件夹中):
@ApplicationScoped
@ServerEndpoint(value="/shout", encoders = {MessageEncoder.class})
public class ShoutServerEndpoint {
@Inject
SessionHandler s;
@OnOpen
public void open(Session session, EndpointConfig config) throws Exception {
s.initSession(session);
}
@OnMessage
public void shout(String text, Session client) {
System.out.println("Session: " + client + " has text: " + text);
Message m = new Message();
try {
client.getBasicRemote().sendObject(m);//use the encoder to write some dummy message
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (EncodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
client.getAsyncRemote().sendText(text.toUpperCase());
}
@OnClose
public void onClose(Session client, CloseReason reason){
System.out.println("Session " + client + " closing for " + reason);
s.destroySession(client);
}
@OnError
public void onError(Session session, Throwable ex) {
System.out.println("error: " + ex.getMessage() );
}
}
因此,罪魁祸首似乎是有一个由wildfly使用的代码使用Eclipse,这不是web应用程序的重新部署过程中清洗,例如,旧版本的,它是值得的奇怪行为的情况下使用该Clean
选项在服务器上(参见:这个Eclipse的文档)
如果直接与wildfly部署,您可以通过(从删除一切清洁你的资源这篇文章):
/[wildfly-location]/standalone/data
/[wildfly-location]/standalone/deployments
/[wildfly-location]/standalone/tmp
这确保了未来的部署过程中你的代码的遗体没有较旧的副本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句