Есть ли способ создать глобальный прослушиватель для получения сообщений из веб-сокета Java?

Я работаю с AngularJS, Ionic и Java в качестве бэкэнда. Я использую websocket для создания чата в реальном времени.

Я хочу настроить прослушиватель для получения всех сообщений в любом месте моего приложения, чтобы обработать его и сохранить без nodejs.

Есть ли способ сделать это?


person LTroya    schedule 25.03.2015    source источник
comment
вы используете Томкэт? взгляните на это   -  person Harold Ship    schedule 25.03.2015
comment
Конечно. Я использую tomcat, я создал веб-сокет. Проблема в том, что я могу управлять сообщениями, которые я получаю из веб-сокета, только в представлении. Я хочу иметь возможность управлять всеми сообщениями во всем проекте   -  person LTroya    schedule 25.03.2015
comment
Пробовали ли вы для этого модуль типа github.com/wilk/ng-websocket?   -  person RWAM    schedule 27.03.2015


Ответы (1)


Я не думаю, что есть хорошо подготовленный способ удовлетворить такие требования в Java WebSocket API. (Хотя это было бы возможно с JMX без особых усилий.) Однако вы можете просто сделать это, написав родительский класс конечной точки, чтобы каждый класс конечной точки расширял его следующим образом:

// 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 может работать.

person Donghwan Kim    schedule 27.03.2015