領先一步
VMware 提供培訓和認證,以加速您的進展。
了解更多時間:約 15 分鐘。
有些開發人員看到這篇文章時,使用 HTTP 已經很多年了。 他們大多數人也知道,如果您想將 HTTP 與其他訊息傳遞模型(例如 fire-and-forget)一起使用,有時您必須使用聰明的變通方法,例如 Stackoverflow 上發布的這種方法。 這是因為 HTTP 是一種請求-回應協定。 它需要發送請求並接收回應。 它沒有單向訊息且不需任何形式回應的概念。
RSocket 採用不同的方法。 RSocket 在 TCP 和 WebSocket 等傳輸協議之上定義了一個新的協定層。 這個新協定為開發人員提供了更多選擇,內建支援四種不同的互動模型
在之前的文章中,您已經學習了如何使用 RSocket 進行請求-回應。 在這篇文章中,您將學習如何在您的程式碼中新增 fire-and-forget 訊息傳遞。 讓我們深入了解!
如果您沒有閱讀之前關於使用 RSocket 的 伺服器端 和 用戶端 請求-回應訊息傳遞的文章,現在是您的機會! 程式碼範例在 GitHub 上。
您會記得在您之前使用的 rsocket-server
專案中的 RSocketController
@Slf4j
@Controller
public class RSocketController {
// code goes here
}
RSocketController
是處理請求-回應訊息傳遞的伺服器端類別。 它的 .requestResponse()
方法接受一個 Message
物件作為參數,並傳回一個 Message
物件作為回應。 正是這種一個物件輸入、一個物件輸出的方法簽名使該方法成為請求-回應方法。
若要將 fire-and-forget 功能新增到伺服器,您必須新增一個具有不同簽名的方法。 .fireAndForget()
方法應接受單個 Message
參數,但這次傳回 void
,如下所示...
@MessageMapping("fire-and-forget")
public void fireAndForget(Message request) {
log.info("Received fire-and-forget request: {}", request);
}
您仍然必須在您的方法上使用 @MessageMapping
註解,但這次您必須為路由映射指定不同的名稱。 在上面的程式碼中,我使用了名稱 "fire-and-forget"。
在 Spring RSocket 文件中,方法簽名規則位於訊息映射章節中。
當您按照之前的文章操作時,您在 rsocket-client
專案中建立了您的 RSocketShellClient
@Slf4j
@ShellComponent
public class RSocketShellClient {
// code goes here
}
RSocketShellClient
使用 .requestResponse()
方法,使用在類別建構子中建立的 RSocketRequester
,向 RSocket 伺服器發送單個請求。
若要將 fire-and-forget 功能新增到您的用戶端,請將新的 .fireAndForget()
方法新增到 RSocketShellClient
,如下所示
@ShellMethod("Send one request. No response will be returned.")
public void fireAndForget() throws InterruptedException {
log.info("\nFire-And-Forget. Sending one request. Expect no response (check server log)...");
this.rsocketRequester
.route("fire-and-forget")
.data(new Message(CLIENT, FIRE_AND_FORGET))
.send()
.block();
}
讓我們更詳細地檢查這個方法中的程式碼
rsocketRequester
上的 .route()
設定為 "fire-and-forget"
。 這個路由名稱與 RSocketController
中 fire-and-forget 方法上的 @MessageMapping
註解相符。
新的 Message
實例為 .data()
方法提供資料。 訊息實例將其來源設定為 CLIENT
,並將 FIRE_AND_FORGET
設定為其互動模式。
請注意,沒有 .retrieveMono()
呼叫。 相反,fire-and-forget 特定的 .send()
方法將訊息發送到伺服器,而 .block()
訂閱並等待完成。 請記住,在沒有訂閱的情況下,反應式程式碼中不會發生任何事情。
所有編碼都已完成。 現在,是時候測試它是否正常運作了。
開啟終端機視窗並移動到 rsocket-server
目錄。 使用 Maven Wrapper 啟動伺服器,如下所示
cd rsocket-server
./mvnw clean package spring-boot:run -DskipTests=true
伺服器在 localhost
埠 7000
上啟動。
有關如何在 Windows 10 上執行 Linux 終端機的詳細資訊,請參閱 Ubuntu 的這份快速指南。
開啟第二個終端機視窗並移動到 rsocket-client
目錄。 從那裡,建置並執行用戶端應用程式,如下所示
cd rsocket-client
./mvnw clean package spring-boot:run -DskipTests=true
當用戶端執行時,Spring Shell 會向您顯示一個新的提示符
shell:>
您可以透過在提示符中輸入 fire-and-forget
,將您的 fire-and-forget 訊息發送到伺服器。
shell:>fire-and-forget
2020-02-03 14:54:14.028 INFO 2929 --- [ main] io.pivotal.rsocketclient.RSocketClient :
Fire-And-Forget. Sending one request. Expect no response (check server)...
用戶端不會印出任何回應,但如果您切換到伺服器的終端機視窗,您會注意到 fire-and-forget 訊息的接收已成功記錄到主控台
2020-02-03 14:54:14.129 INFO 2061 --- [or-http-epoll-2] io.pivotal.rsocketserver.RSocketServer : Received fire-and-forget request: Message(origin=Client, interaction=Fire-And-Forget, index=0, created=1580741654)
您可以透過在 shell:>
提示符中輸入 exit 來停止 rsocket-client
,如下所示。
shell:>exit
您可以透過在其終端機視窗中按下 Ctrl-C
來停止 rsocket-server
程序。
當呼叫 block()
方法時,用戶端的 .fireAndForget()
方法使用 RSocketRequester
向伺服器發送單個 Message
。 block 方法實際上是「訂閱並等待」的指令。
伺服器上的 RSocketController
檢查訊息元資料的 route
,並正確地將訊息傳遞到 .fireAndForget(Message request)
方法進行處理。 一旦用戶端發送請求,它就可以繼續處理其他事情。 當伺服器收到請求時,它也可以繼續處理其他工作。 它不需要向用戶端發送回應。
在這篇文章中,您學習了如何使用 Spring Boot 和 RSocket 快速建構 fire-and-forget 功能。 有關 Spring 的 RSocket 整合和訊息映射的更多資訊,請查看 Spring RSocket 文件。 在下一篇文章中,我們將介紹請求-串流訊息傳遞。 到時見!