Как я могу зарегистрировать JSR-356 Websocket в PAX-Web? (В комплекте, а не WAR)

У меня проблема с PAX-Web. Я пытался зарегистрировать службу Websocket как декларативную, но она недоступна из Интернета. Я попробовал данный websocket-jsr356-6.0.3.war, и он отлично работает. Как я вижу, WAR-файл по-разному обрабатывает org.osgi.service.http.HttpContext. Я пробовал следующие сценарии:

Сценарий 1 - HTTP-метод OSGi R6 Whiteboard

Создание ServletContextHelper:

package hu.blackbelt.judo.common.rest.regular;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.osgi.service.http.context.ServletContextHelper;
import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;

@Component(immediate = true)
@Service(ServletContextHelper.class)
@Properties(value = {
        @Property(name = HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, value = "chat"),
        @Property(name = HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, value = "/test")
})
public class ChatServletContext extends ServletContextHelper {
}

И добавление конечной точки Websocket:

package hu.blackbelt.judo.common.rest.regular;


import lombok.extern.slf4j.Slf4j;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;

import javax.websocket.EncodeException;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@Component(immediate = true)
@Service(Object.class)
@Properties(value = {
        @Property(name = HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT,
                value = "=(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=chat)")
})
@Slf4j
public class ChatEndpoint {

    public static final String ROOM = "room";

    @OnOpen
    public void onOpen(final Session session, @PathParam(ROOM) final String room) {
        LOGGER.info("session openend and bound to room: " + room);
        session.getUserProperties().put(ROOM, room);
    }

    @OnMessage
    public void onMessage(final Session session, final ChatMessage chatMessage) {
        String room = (String) session.getUserProperties().get(ROOM);
        try {
            for (Session s : session.getOpenSessions()) {
                if (s.isOpen()
                        && room.equals(s.getUserProperties().get(ROOM))) {
                    s.getBasicRemote().sendObject(chatMessage);
                }
            }
        } catch (IOException | EncodeException e) {
            LOGGER.warn("onMessage failed", e);
        }
    }
}

Логи показывают, что конечная точка перехвачена. Я отладил, и Pax-Web регистрирует его.

Журнал показывает следующую строку:

2017-05-04 02:36:02,698 | INFO  | Thread-70        | WebSocketTracker                 | 330 - org.ops4j.pax.web.pax-web-extender-whiteboard - 6.0.3 | found websocket endpoint!!

Но веб-сокет недоступен по следующему URL: http://ws//localost:8181/test/chat/testroom

Сценарий 2 - свойства Pax-Web в зарегистрированном HttpContext (с JAX-RS это работает)

Создание экземпляра HttpContext: (с использованием OSGi заданного абстрактного класса Helper):

package hu.blackbelt.judo.common.rest.regular;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.context.ServletContextHelper;

@Component(immediate = true)
@Service(HttpContext.class)
@Properties(value = {
        @Property(name = "httpContext.id", value = "chat"),
        @Property(name = "httpContext.path", value = "test")
})
public class ChatHttpContext extends ServletContextHelper implements HttpContext {
}

И конечная точка Websocket:

package hu.blackbelt.judo.common.rest.regular;


import lombok.extern.slf4j.Slf4j;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;

import javax.websocket.EncodeException;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@SuppressWarnings({"checkstyle:missingctor", "checkstyle:illegaltoken"})

@Component(immediate = true)
@Service(Object.class)
@Properties(value = {
        @Property(name = "httpContext.id", value = "chat")
})
@ServerEndpoint(value = "/chat/{room}", encoders = ChatMessageEncoder.class, decoders = ChatMessageDecoder.class)
@Slf4j
public class ChatEndpoint {

    public static final String ROOM = "room";

    @OnOpen
    public void onOpen(final Session session, @PathParam(ROOM) final String room) {
        LOGGER.info("session openend and bound to room: " + room);
        session.getUserProperties().put(ROOM, room);
    }

    @OnMessage
    public void onMessage(final Session session, final ChatMessage chatMessage) {
        String room = (String) session.getUserProperties().get(ROOM);
        try {
            for (Session s : session.getOpenSessions()) {
                if (s.isOpen()
                        && room.equals(s.getUserProperties().get(ROOM))) {
                    s.getBasicRemote().sendObject(chatMessage);
                }
            }
        } catch (IOException | EncodeException e) {
            LOGGER.warn("onMessage failed", e);
        }
    }
}

Но веб-сокет недоступен по следующему URL: http://ws//localost:8181/test/chat/testroom

Как я могу добиться, чтобы webcsocket был доступен? Я не хочу переупаковывать свой комплект как WAB. Там в любом случае?

0 ответов

Другие вопросы по тегам