Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

STOMP destination url vs endpoint url

The following code is from spring mvc documentation:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/portfolio");
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableSimpleBroker("/topic");
    }
}

@Controller
public class GreetingController {

    @MessageMapping("/greeting") {
    public String handle(String greeting) {
        return "[" + getTimestamp() + ": " + greeting;
    }
}

The client connects to http://localhost:8080/portfolio to establish WebSocket connection, I wonder what's the exact url of client sending request?

http://localhost:8080/portfolio/app

or

http://localhost:8080/app?

and in actual WebSocket frame, does the destination header contain relative url like /app, /topic or absolute url?

like image 942
mzoz Avatar asked Aug 25 '19 03:08

mzoz


People also ask

What is STOMP in WebSocket?

STOMP, an acronym for Simple Text Oriented Messaging Protocol, is a simple HTTP-like protocol for interacting with any STOMP message broker. Any STOMP client can interact with the message broker and be interoperable among languages and platforms.

What is StompEndpointRegistry?

public interface StompEndpointRegistry. A contract for registering STOMP over WebSocket endpoints.

Is STOMP deprecated?

This project is no longer maintained. If you encounter bugs with it or need enhancements, you can fork it and modify it as the project is under the Apache License 2.0.

What is the name of text based protocol used by Spring to send messages on top of WebSockets?

STOMP is the Simple (or Streaming) Text Oriented Messaging Protocol. It uses a set of commands like CONNECT, SEND, or SUBSCRIBE to manage the conversation.

What is an endpoint URL?

The term "endpoint URL" is synonymous with the term "server network address" used by the database mirroring user interface and documentation.

How do I create a stomp client JavaScript Object?

STOMP JavaScript clients will communicate to a STOMP server using a ws:// URL. To create a STOMP client JavaScript object, you need to call Stomp.client (url) with the URL corresponding to the server's WebSocket endpoint: var url = "ws://localhost:15674/ws" ; var client = Stomp.client (url);

How do I subscribe to a destination in webstomp?

When the connection is established, the callback handler is called. After the connection, the client uses the webstomp.subscribe methods to subscribe to destinations. This method accepts a destination and a callback handler that is called when a message is received and returns a subscription.

What is Stomp support in the Java Spring server?

The server is implemented as a Spring web application with Spring Web MVC framework to handle static web resources. One client is implemented as a JavaScript browser client and another client is implemented as a Java Spring console application. The following Spring configuration enables STOMP support in the Java Spring server.


Video Answer


1 Answers

[Android] https://github.com/NaikSoftware/StompProtocolAndroid

[Spring] https://docs.spring.io/spring/docs/5.1.9.RELEASE/spring-framework-reference/web.html#websocket-stomp

Just set the end point by using

addEndpoint("/portfolio");

Use the following Url to connect to websocket

ws://localhost:8080/portfolio

But remember you have to connect to socket only once and after that just invoke the endpoints without URL. Beacause socket is streamline connection and you have to establish connection only once.

setApplicationDestinationPrefixes("/app");

Above line will set the end point /app using this you can only publish over the socket. However all who has subscribed to this topic will get notified.

enableSimpleBroker("/topic");

Broker are responsible for handling subscribe and publish for both as they listen and send data in dual way means publish and subscribe both unlike /app.

private var mStompClient: StompClient? = null
mStompClient = Stomp.over(Stomp.ConnectionProvider.OKHTTP, "ws://localhost:8080/portfolio")

Connect to websocket using the above line. since we have to connect to socket end point only once write this in singleton.

val response = stomp.topic("/topic")
.subscribe { topicMessage -> }

Now above line will subscribe to your socket client means anytime you pushed the data from /topic this will this response variable will notified.

stompClient.send(StompMessage(StompCommand.SEND,
    listOf(StompHeader(StompHeader.DESTINATION, "/topic")),
    gson.toJson(myDataModel)))?
.subscribe()

Using above line you will you will you will send data to the socket which is specified as /topic.

@MessageMapping("/action")
fun performDeviceAction(@Payload myDataModel: MyDataModel) {}

Use the above line to receive the data from client on socket /action

public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new SocketTextHandler(), "/user");
    }

In order to tell Spring to forward client requests to the endpoint , we need to register the handler. Above snipplet will register a client.

Use below link and download source code for more information https://www.javainuse.com/spring/boot-websocket

like image 56
Kaushik Burkule Avatar answered Oct 20 '22 00:10

Kaushik Burkule