spring-websocket的RestTemplateXhrTransport有效吗?

时间:2014-09-25 14:03:07

标签: tomcat websocket spring-websocket

我正在尝试使用spring-websocket RestTemplateXhrTransport进行集成测试,但我无法让它工作。

服务器设置为spring-websocket(4.1-RELEASE),带有by-the-book-configuration:

@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/socket").withSockJS().setClientLibraryUrl("../common/lib/sockjs.js");
    }

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

我原本期望以下代码可以工作,但它只是等待序言。如果我查看网络流量,我可以看到前导码是由服务器发送的,但客户端只是在读取了标题后挂起等待数据:

    List<Transport> transports = new ArrayList<>();
    RestTemplate restTemplate = new RestTemplate();
    RestTemplateXhrTransport xhrTransport = new RestTemplateXhrTransport(restTemplate);

    // This makes it work, but that is xhr-polling, and I want xhr-streaming.
    //xhrTransport.setXhrStreamingDisabled(true);

    transports.add(xhrTransport);
    SockJsClient sockJsClient = new SockJsClient(transports);
    AbstractWebSocketHandler webSocketHandler = new AbstractWebSocketHandler() {
        @Override
        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
            System.out.println("connected");
        }
    };
    sockJsClient.doHandshake(webSocketHandler, new WebSocketHttpHeaders(), new URI("http://localhost:8080/socket"))
            .get(3000, TimeUnit.SECONDS);

我正在使用Tomcat应用程序服务器。它无法与7.0.55和8.0.12一起使用。

我还尝试从spring-websockets-portfolio示例中查看IntegrationPortfolioTests。如果我在setup-method中注释掉将WebSocketTransport添加为主要传输的行,并保留使用RestTemplateXhrTransport的行,则此测试用例也不起作用。

1 个答案:

答案 0 :(得分:0)

原来它是由我的virusscanner的“在线盾牌”引起的。一旦我关闭AVG AntiVirus商业版的在线屏蔽,运输工作就完美了。看起来它不喜欢流媒体数据。