我正在尝试使用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的行,则此测试用例也不起作用。
答案 0 :(得分:0)
原来它是由我的virusscanner的“在线盾牌”引起的。一旦我关闭AVG AntiVirus商业版的在线屏蔽,运输工作就完美了。看起来它不喜欢流媒体数据。