MongoDB,Kotlin和Spring WebFlux的響應流
1.概述
在本教程中,我們將編寫一個簡單的應用程序,展示使用Spring Data Reactive MongoDB和Spring SSeEmitter
的完全響應流。
一方面,我們將應用Spring Data Reactive MongoDB通過Mongo反應數據庫保存數據,並將其與Server-Sent-Events機制結合,以通知訂閱的客戶端有關傳入數據的信息。
此外,我們將利用Spring Boot的Kotlin支持。
所以,讓我們開始吧!
2.設定
首先,我們必須配置我們的Maven項目,在pom.xml
添加Spring Data Reactive MongoDB依賴項:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
此外,要使用Kotlin,我們需要將Kotlin標準庫添加到同一文件中:
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
</dependency>
現在,我們準備開始開發應用程序。我們將開始配置環境以支持反應式編程和Mongo DB,讓我們開始吧!
3. 響應性Mongo配置
我們要做的第一件事是配置我們的項目以支持反應式Spring Data。我們將添加一個從AbstractReactiveMongoConfiguration
擴展的新類,以配置Mongo反應式客戶端和Spring Data Repository:
@Configuration
@EnableReactiveMongoRepositories(
basePackageClasses = arrayOf(EventRepository::class))
class MongoConfig : AbstractReactiveMongoConfiguration() {
override fun getDatabaseName() = "mongoDatabase"
override fun reactiveMongoClient() = mongoClient()
@Bean
fun mongoClient() = MongoClients.create()
@Bean
override fun reactiveMongoTemplate()
= ReactiveMongoTemplate(mongoClient(), databaseName)
}
如果我們要以非反應方式與MongoDB交互,則不需要此配置。請注意,我們必須添加@EnableReactiveMongoRepositories
標記,以使配置知道我們的Spring Data存儲庫在哪裡.
在此之後,我們現在準備開始實現主要功能。我們要做的第一件事是開發一個新的數據類以保留傳入的信息,然後開發一個相關的Spring Data反應性存儲庫來管理該持久性。
4. Document
該document
是在MongoDB數據庫中存儲數據的單位。本單元使用JSON樣式存儲數據。
在我們的項目中,我們將使用一個名為Event
的虛擬文檔來簡化它,該文檔具有兩個屬性: id
和name:
@Document
class Event(id: String, name: String)
5. Spring Data Reactive倉庫
Spring Data抽象的目標是減少實現持久性存儲的數據訪問層所需的代碼量。
因此,反應式版本的工作方式相同,因此,我們將在下面的代碼行中實現整個反應式存儲庫:
interface EventRepository : ReactiveMongoRepository<Event, String>
6.控制器
每當保存任何反應性數據時, Controller
類都將負責發送Server-Sent Event
。
方法saveAndSend
首先將輸入的數據保存到我們的Mongo Reactive數據庫中,將此操作委派給我們的EventRepository.
因此,我們將添加一個新端點,該端點創建並保存新Events.
首先,讓我們看一下Kotlin代碼:
@GetMapping(value = "/save",
produces = arrayOf(MediaType.TEXT_EVENT_STREAM_VALUE))
fun saveAndSend(@RequestParam("eventName") eventName: String) =
eventRepository
.save(Event(UUID.randomUUID().toString(), eventName))
.flux()
如我們所見,在保存新數據之後,Spring Data反應性存儲庫將返回一個SSE,該SSE將被發送到訂閱的客戶端。
至此,我們可以說我們有一個完整的反應式Kotlin服務器端項目。我們已經具有執行我們的Spring Boot應用程序所需的所有元素。
因此,我們現在來看一下如何創建一個簡單的Web客戶端來發送和接收所有創建的Server-Sent事件。
7.訂閱者
在這裡,我們有一個簡單的Web客戶端,它將能夠保存數據並從服務器接收更改。
讓我們看看它是如何實現的:
7.1。發送數據
客戶端將通過“ Save new event
按鈕保存鍵入的事件名稱。
反過來,這將向我們的服務器端點saveEvent
發出HTTP請求:
<form method="get" action="/save">
<input type="text" name="eventName">
<button type="submit">Save new event</button>
</form>
7.2。接收數據
另一方面,客戶端也將監聽save
端點。請注意,每種編程語言都有其特定的框架來管理SSE。
但是,對於我們的示例,我們將使其盡可能簡單:
<div id="content"></div>
<script>
var source = new EventSource("save");
source.addEventListener('message', function (e) {
console.log('New message is received');
const index = JSON.parse(e.data);
const content = `New event added: ${index.name}<br>`;
document.getElementById("content").innerHTML += content;
}, false);
</script>
8.結論
總之, Spring Data MongoDB已更新,以利用Spring Framework 5中引入的反應式編程模型。現在,我們有一種使用此編程範例和Server-Sent事件的簡單方法。
因此,這為數據庫非阻塞應用程序提供了一種替代傳統非響應式應用程序的方法。
可以在GitHub項目中檢查此示例的實現。
這是一個基於Maven的項目,因此,請執行Spring Boot應用程序以查看其工作方式。不要忘記先運行Mongo DB服務器。