Hi Achim, Thanks for the response.
When I deploy as a WAR it works fine - so I don't think there is a general problem. I've tried with debugging, but I don't know the details of Pax-Web. The HTTPContext was an idea to be able to emulate the isolation like in a WAR deployment - before I've tried without context with no luck. The log messages shows everything okay, because the Websocket tracker catches the service, find the annotation and find the HTTPContext. So it seems OK, but the URL is not mapped. I have the feeling something with the URL mapping goes wrong. I haven't tried that the very same HTTPContext initializing a Servlet - so I will try it. So all the two scenario mentioned earlier works same way - the websocket is catched and Jetty registration is called, but the URL is unavailable, I've got 404. - that was that point where I call for help, because my knowledge ended here :) I've checked the integraton test - WebSocketWhiteBoardIntegrationTest I see there is no any property on service, only the naked instance of service is registered. It is not fit for me, because I need managed instance of service (because I would like to reference other services). Regards, Robert On Monday, May 8, 2017 at 9:03:21 PM UTC+2, Achim Nierbeck wrote: > > Hi, > > this is actually a tricky one. Over the weekend I tried to work on some > integration tests for it, but failed. > Is it not working in general? Or just in combination with the HttpContext? > For the second one we might find an easier solution :) > > regards, Achim > > > 2017-05-08 20:19 GMT+02:00 Csákány Róbert <[email protected] <javascript:>>: > >> I'm not sure my problems related to this issue, or it is a different one. >> >> I have a problem with the PAX-Web. I've tried to register a Websocket >> service as declrarative, but it is unaccessible from web. I've tried the >> given websocket-jsr356-6.0.3.war and it works fine. As I see the WAR file >> handles differently the org.osgi.service.http.HttpContext. I've tried the >> following scenarios: >> >> >> **Scenario 1 - OSGi R6 Whiteboard HTTP method** >> >> >> Creating a 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 { >> } >> >> >> And adding the Websocket Endpoint: >> >> >> 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); >> } >> } >> } >> >> The logs show me that the Endpoint is catched. I've debugged and Pax-Web >> is registering it. >> >> >> The log shows the following line: >> >> 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!! >> >> >> But the websocket is unaccessible with the following URL: >> ws://localost:8181/test/chat/testroom >> >> >> >> **Scenario 2 - Pax-Web properties on registered HttpContext (with JAX-RS >> it works)** >> >> >> Creating HttpContext instance: (Utilizing the OSGi given Helper abstract >> class): >> >> 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 { >> } >> >> >> And the Websocket Endpoint: >> >> >> 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); >> } >> } >> } >> >> But the websocket is unaccessible with the following URL: >> ws://localost:8181/test/chat/testroom >> >> >> >> How can I achive that webcsocket be available? I do not want to repackage >> my bundle as WAB. Is there any way? >> >> -- >> -- >> ------------------ >> OPS4J - http://www.ops4j.org - [email protected] <javascript:> >> >> --- >> You received this message because you are subscribed to the Google Groups >> "OPS4J" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > > > > -- > > Apache Member > Apache Karaf <http://karaf.apache.org/> Committer & PMC > OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/> Committer & > Project Lead > blog <http://notizblog.nierbeck.de/> > Co-Author of Apache Karaf Cookbook <http://bit.ly/1ps9rkS> > > Software Architect / Project Manager / Scrum Master > > -- -- ------------------ OPS4J - http://www.ops4j.org - [email protected] --- You received this message because you are subscribed to the Google Groups "OPS4J" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
