簡體   English   中英

在 Magnolia CMS 上使用 Spring + SockJS + STOMP 的 Websockets

[英]Websockets Using Spring + SockJS + STOMP on Magnolia CMS

我正在嘗試為在 Tomcat 7 上運行的 Web 應用程序實現一些 Websocket 功能。我正在使用以下技術:

  • (服務器) Spring Websocket + Spring Messaging
  • (客戶端) SockJS + Stomp.js

我正在遵循本指南(大致): http : //g00glen00b.be/spring-angular-sockjs/

我的配置與指南類似,但我將在此處添加一些代碼片段:

客戶:

    s.socket = new SockJS('http://localhost:8181/.cckiosk/socket/test');
    //s.socket = new SockJS('http://localhost:8181/.cckiosk/socket/test', {}, { transports: ['xhr-polling'] });
    s.client = Stomp.over(s.socket);
    s.client.connect({}, onConnect);
    s.client.onclose = onDisconnect;

服務器:

@Configuration
@ComponentScan
@EnableWebSocketMessageBroker
public class ModuleWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry broker) {
        //Prefix for messages FROM server TO client
        broker.enableSimpleBroker("/client");
        //Prefix for messages FROM client TO server
        broker.setApplicationDestinationPrefixes("/server");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/socket/test").setAllowedOrigins("*").withSockJS();
    }
}

控制器:

@MessageMapping("/socket/test")
@SendTo("/client/message")
public GenericMessage doSample(GenericMessage msg) {
    log.info("doSample: " + JsonUtil.jsonify(msg));
    return new GenericMessage(msg.getId(), msg.getMessage(), new Date());
}

我在香草 Spring 應用程序中設置了所有內容,並且一切正常。

但是,當我將相同的代碼移植到 Magnolia 模塊時,代碼停止工作,我可以看到以下錯誤:

客戶端錯誤:

客戶端錯誤

服務器端錯誤:

2015-09-19 16:28:43,412 DEBUG eb.socket.handler.LoggingWebSocketHandlerDecorator: New WebSocketServerSockJsSession[id=tde1syjd]
2015-09-19 16:28:43,413 DEBUG eb.socket.handler.LoggingWebSocketHandlerDecorator: Transport error in WebSocketServerSockJsSession[id=tde1syjd]
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:196)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at org.apache.coyote.http11.upgrade.BioServletInputStream.doRead(BioServletInputStream.java:37)
    at org.apache.coyote.http11.upgrade.AbstractServletInputStream.read(AbstractServletInputStream.java:129)
    at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:47)
    at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:203)
    at org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:203)
    at org.apache.coyote.http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:93)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

它實際上是連接重置或管道損壞。

將傳輸協議更改為非 websocket 協議(例如xhr-polling )也無濟於事。

知道 Magnolia 中可能有什么導致長期存在的 Websocket 會話關閉其連接嗎?

解決方案在於簡單地完全繞過 Magnolia 過濾器鏈。

我只需要在 Magnolia admincentral 中創建一個全局旁路對象:配置 > 服務器/過濾器/旁路

class: info.magnolia.StartsWithURIVoter
pattern: /socket

並且連接不再重置或中斷。

在 Mangolia 5 中,它是“info.magnolia.voting.voters.URIStartsWithVoter”,而不是“info.magnolia.StartsWithURIVoter”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM