有没有办法创建一个全局侦听器来接收来自 Java websocket 的消息?
Is there a way to create a global listener to receive messages from a Java websocket?
我正在使用 AngularJS、Ionic 和 Java 作为后端。我正在使用 websocket 创建实时聊天。
我想设置一个监听器来接收我应用程序中任何地方的所有消息来处理它并在没有 nodejs 的情况下保留它。
有办法吗?
我认为 Java WebSocket API 中没有准备充分的方法来满足此类要求。 (虽然,使用 JMX 不费吹灰之力就可以实现。)然而,您可以通过编写父端点 class,让每个端点 class 像下面这样扩展它来简单地做到这一点:
// Assumes you use some dependency injection framework
@Component
// Your own POJO to be notified of every socket events
public class WebSocketListener {
public void onOpen(String id) {
// Your logic here
}
public void onMessage(String id, Object message) {
// Your logic here
}
public void onClose(String id) {
// Your logic here
}
}
// A parent class to notify your own global listener
// Extend it if you want to listen socket's event through some specific path
public abstract class NotifiableEndpoint {
@Inject
private WebSocketListener listener;
@OnOpen
public void onOpen(Session session) {
listener.onOpen(session.getId());
}
@OnMessage
public void onMessage(Session session, StringOrByteBuffer data) {
listener.onOpen(session.getId(), data);
}
@OnClose
public void OnClose(Session session) {
listener.onOpen(session.getId());
}
}
// A concrete class to write your business logic
@ServerEndpoint("/hello")
public class YourEndpoint extends NotifiableEndpoint {
// Your logic
}
不使用继承,通过 ServerEndpointConfig.Configurator.getEndpointInstance 反射可能会起作用。
我正在使用 AngularJS、Ionic 和 Java 作为后端。我正在使用 websocket 创建实时聊天。
我想设置一个监听器来接收我应用程序中任何地方的所有消息来处理它并在没有 nodejs 的情况下保留它。
有办法吗?
我认为 Java WebSocket API 中没有准备充分的方法来满足此类要求。 (虽然,使用 JMX 不费吹灰之力就可以实现。)然而,您可以通过编写父端点 class,让每个端点 class 像下面这样扩展它来简单地做到这一点:
// Assumes you use some dependency injection framework
@Component
// Your own POJO to be notified of every socket events
public class WebSocketListener {
public void onOpen(String id) {
// Your logic here
}
public void onMessage(String id, Object message) {
// Your logic here
}
public void onClose(String id) {
// Your logic here
}
}
// A parent class to notify your own global listener
// Extend it if you want to listen socket's event through some specific path
public abstract class NotifiableEndpoint {
@Inject
private WebSocketListener listener;
@OnOpen
public void onOpen(Session session) {
listener.onOpen(session.getId());
}
@OnMessage
public void onMessage(Session session, StringOrByteBuffer data) {
listener.onOpen(session.getId(), data);
}
@OnClose
public void OnClose(Session session) {
listener.onOpen(session.getId());
}
}
// A concrete class to write your business logic
@ServerEndpoint("/hello")
public class YourEndpoint extends NotifiableEndpoint {
// Your logic
}
不使用继承,通过 ServerEndpointConfig.Configurator.getEndpointInstance 反射可能会起作用。