天天看點

《Spring實戰》摘錄 - 27

271

Q: #17.3.3-1 | RabbitMQ連接配接工廠的作用是建立到RabbitMQ的連接配接

A: 如果你希望通過RabbitMQ發送消息,那麼你可以将connectionFactorybean注入到AlertServiceImpl類中,并使用它來建立Connection,使用這個Connection來建立Channel,然後使用這個Channel釋出消息到Exchange上

272

Q: #18.0-1 | 全雙工意味着伺服器可以發送消息給浏覽器,浏覽器也可以發送消息給伺服器。Spring 4.0為WebSocket通信提供了支援,包括

A:

  • 發送和接收消息的低層級API;
  • 發送和接收消息的進階API;
  • 用來發送消息的模闆;
  • 支援SockJS,用來解決浏覽器端、伺服器以及代理不支援WebSocket的問題。

273

Q: #18.1-1 | WebSocket是兩個應用之間全雙工的通信通道

A:

《Spring實戰》摘錄 - 27

274

Q: #18.1-2 | MarcoHandler處理通過WebSocket傳送的文本消息

A:

package marcopolo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;

public class MarcoHandler extends AbstractWebSocketHandler{
    private static final Logger logger = LoggerFactory.getLogger(MarcoHandler.calss);
    
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception{//處理文本消息
        logger.info("Received message: " + message.getPayload());

        Thread.sleep(2000);//模拟延時

        session.sendMessage(new TextMessage("Polo!"));//發送文本消息
    }
}           

複制

275

Q: #18.1-3 | 除了重載WebSocketHandler中所定義的五個方法以外,我們還可以重載AbstractWebSocketHandler中所定義的三個方法:

A:

  • handleBinaryMessage()
  • handlePongMessage()
  • handleTextMessage()

276

Q: #18.1-4 | 可以重載afterConnectionEstablished()和afterConnectionClosed(),來建立或關閉連接配接,的代碼片段

A:

public void afterConnectionEstablished(WebSocketSession session)
    throws Exception {
  logger.info("Connection established");
}


@Override
public void afterConnectionClosed(
    WebSocketSession session, CloseStatus status) throws Exception {
  logger.info("Connection closed. Status: " + status);
}           

複制

277

Q: #18.1-5 | 借助websocket命名空間以XML的方式配置WebSocket

A:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:websocket="http://www.springframework.org/schema/websocket"
    xsi:schemaLocation="
        http://www.springframework.org/schema/websocket
        http://www.springframework.org/schema/websocket/spring-websocket.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <websocket:handlers>
        <websocket:mapping handler="marcoHandler" path="/marco" /> //将Marco Handle映射到“/marco”
    </websocket:handlers>

    <bean id="marcoHandler" class="marcopolo.MarcoHandler" /> //聲明MarcoHandler bean
</beans>           

複制

278

Q: #18.1-6 | 連接配接到“marco” WebSocket的JavaScript用戶端

A:

var url='ws://' + window.location.host + '/websocket/marco';
var sock = new WebSocket(url);//打開WebSocket

sock.onopen = function(){//處理連接配接開啟事件
    console.log('Opening');
    sayMarco();
};

sock.onmessage = function(e){//處理資訊
    console.log('Received message: ', e.data);
    setTimeout(function(){sayMarco()}, 2000);
}

sock.onclose = function(){//處理連接配接關閉事件
    console.log('Closing');
}

function sayMarco(){
    console.log('Sending Marco!');
    sock.send("Marco!");//發送消息
}           

複制

在本例中,URL使用了“ws://”字首,表明這是一個基本的WebSocket連接配接。如果是安全WebSocket的話,協定的字首将會是“wss://”。

279

Q: #18.2-1 | cdn,是什麼?

A: 内容分發網絡(英語:Content delivery network或Content distribution network,縮寫:CDN)是指一種透過網際網路互相連接配接的計算機網絡系統,利用最靠近每位使用者的伺服器,更快、更可靠地将音樂、圖檔、影片、應用程式及其他檔案發送給使用者,來提供高性能、可擴充性及低成本的網絡内容傳遞給使用者。

280

Q: #18.2-2 | SockJS所處理的URL是

A: 是“http://”或“https://”模式,而不是“ws://”和“wss://”