【问题标题】:Spring Websocket Configuration: using WebSocketMessageBrokerConfigurationSupport and WebSocketConfigurer together - how?Spring Websocket 配置:一起使用 WebSocketMessageBrokerConfigurationSupport 和 WebSocketConfigurer - 如何?
【发布时间】:2017-09-24 01:45:14
【问题描述】:

我目前正在使用该类配置我的 Spring Websocket

public class WebSocketConfig extends WebSocketMessageBrokerConfigurationSupport

现在我遇到了Spring STOMP Websockets: any way to enable permessage-deflate on server side?的建议

利用

public class SampleJettyWebSocketsApplication implements WebSocketConfigurer 

并覆盖

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry)

和优惠

@Bean
public DefaultHandshakeHandler handshakeHandler() 

问题,WebSocketConfigurerWebSocketMessageBrokerConfigurationSupport是什么关系?换句话说,我是否可以通过第一类的 API WebSocketMessageBrokerConfigurationSupport 以某种方式从 WebSocketConfigurer 实现添加配置,因此所有配置都保留在一个文件中?

【问题讨论】:

  • 你能告诉我们为什么@EnableWebSocketMessageBroker 对你来说还不够吗?
  • @ArtemBilan,我只是在你的所有对象中有点弱:))我需要的是启用 permessage-deflate(参见问题中的链接)。我还覆盖了 OutgoingExecutorChannel,因为我们需要在多线程发送中严格排序。

标签: spring websocket jetty spring-websocket java-websocket


【解决方案1】:

WebSocketMessageBrokerConfigurationSupport 的实现是DelegatingWebSocketMessageBrokerConfiguration,它是通过@EnableWebSocketMessageBroker 配置的。您在自定义代码中只需要WebSocketMessageBrokerConfigurer 实现。而那个被注入到DelegatingWebSocketMessageBrokerConfiguration

@Autowired(required = false)
public void setConfigurers(List<WebSocketMessageBrokerConfigurer> configurers) {

这是我的测试用例中的示例配置:

@Configuration
@EnableWebSocketMessageBroker
static class ServerConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Bean
    public DefaultHandshakeHandler handshakeHandler() {
        return new DefaultHandshakeHandler(new TomcatRequestUpgradeStrategy());
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
                .setHandshakeHandler(handshakeHandler())
                .setAllowedOrigins("http://foo.com")
                .addInterceptors(new HandshakeInterceptor() {

                    @Override
                    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
                            WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
                        return request.getHeaders().getOrigin() != null;
                    }

                    @Override
                    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,
                            WebSocketHandler wsHandler, Exception exception) {

                    }

                })
                .withSockJS();
    }

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


}

【讨论】:

  • 谢谢 Artem,所以要从 stackoverflow.com/questions/35347077/… 添加 permessage-compress 我只能从那里借用 handshakeHandler,或者有更好的方法来设置“permessage-compress”?
  • 我不熟悉该功能。但既然布赖恩已经通过getExtensionFactory()回复了那里,我认为真的没有其他办法了。
  • 非常感谢,非常感谢您的帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 2015-11-28
  • 2014-03-03
  • 2021-06-14
相关资源
最近更新 更多