最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Multiple STOMP subscriptions from JS to Spring in one request - Stack Overflow

programmeradmin6浏览0评论

The goal is to make multy-room chat using web interface and Spring framework. Lookes like STOMP over SockJS is the best bo for such project. STOMP's destination based subscription resolves all broadcasting issues. But if user uses 100 (for example) chats at once I need to send 100 subscription requests from web client each time he logs in.

So I'm looking for alternative one-request solution. Let me to consolidate questions:

1) Is there a way to make one client-side STOMP request for several subscriptions at once? If it is possible to make such request using other JS library - then I'll be glad to try it.

2) Is there a way to initiate subscriptions from Spring backend side? It would be great to register several destination message queries for one client on server side - I can use special request for that or do that during logging in.

3) Any other suggestions about this issue? Again: I'm glad to try other trendy tech as a last resort.

The code beloiw is the most simple echo service. I'm just testing this protocol and technology.

Basic client code:

window.onload = function () {
    window.s = new SockJS("http://localhost:8080/portfolio");
    window.s.onopen = function () {
        window.stompClient = Stomp.over(window.s);

        stompClient.connect('admin', 'admin', function(frame) {
            console.log('Connected: ', frame);
            stompClient.subscribe('/topic/echo', function(messageOutput) {
                console.log(messageOutput.body);
            })}, function(e){console.log("Fail My: ", e);})();
    };
};

STOMP config:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/portfolio").setAllowedOrigins("*").withSockJS()
        .setClientLibraryUrl( "/[email protected]/dist/sockjs.min.js" );
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {

        registry.enableSimpleBroker("/topic/");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

STOMP controller:

@Controller
public class GreetingController {

    @MessageMapping("/greetings")
    @SendTo("/topic/echo")
    public String handleMessage(@Payload String greeting) {
        System.out.println("[received]:" + greeting);
        return "[echo]: " + greeting;
    }
}

The goal is to make multy-room chat using web interface and Spring framework. Lookes like STOMP over SockJS is the best bo for such project. STOMP's destination based subscription resolves all broadcasting issues. But if user uses 100 (for example) chats at once I need to send 100 subscription requests from web client each time he logs in.

So I'm looking for alternative one-request solution. Let me to consolidate questions:

1) Is there a way to make one client-side STOMP request for several subscriptions at once? If it is possible to make such request using other JS library - then I'll be glad to try it.

2) Is there a way to initiate subscriptions from Spring backend side? It would be great to register several destination message queries for one client on server side - I can use special request for that or do that during logging in.

3) Any other suggestions about this issue? Again: I'm glad to try other trendy tech as a last resort.

The code beloiw is the most simple echo service. I'm just testing this protocol and technology.

Basic client code:

window.onload = function () {
    window.s = new SockJS("http://localhost:8080/portfolio");
    window.s.onopen = function () {
        window.stompClient = Stomp.over(window.s);

        stompClient.connect('admin', 'admin', function(frame) {
            console.log('Connected: ', frame);
            stompClient.subscribe('/topic/echo', function(messageOutput) {
                console.log(messageOutput.body);
            })}, function(e){console.log("Fail My: ", e);})();
    };
};

STOMP config:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/portfolio").setAllowedOrigins("*").withSockJS()
        .setClientLibraryUrl( "https://cdn.jsdelivr/npm/[email protected]/dist/sockjs.min.js" );
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {

        registry.enableSimpleBroker("/topic/");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

STOMP controller:

@Controller
public class GreetingController {

    @MessageMapping("/greetings")
    @SendTo("/topic/echo")
    public String handleMessage(@Payload String greeting) {
        System.out.println("[received]:" + greeting);
        return "[echo]: " + greeting;
    }
}
Share Improve this question edited Jul 15, 2019 at 6:31 Lex asked Jul 15, 2019 at 6:21 LexLex 5241 gold badge5 silver badges15 bronze badges 0
Add a ment  | 

1 Answer 1

Reset to default 6

The STOMP specification indicates that 1 SUBSCRIBE frame correlates to 1 subscription. In other words, there's no way to get multiple subscriptions for a single SUBSCRIBE frame.

It's possible (although unlikely in my opinion) that a library/API would wrap the ability to send multiple SUBSCRIBE frames in a single call, but that would just a convenience method and wouldn't actually yield any kind of performance benefit at the protocol level.

发布评论

评论列表(0)

  1. 暂无评论