RSocket-javob beruvchilar @MessageMapping va @ConnectMapping annotatsiyalangan metodlar sifatida amalga oshirilishi mumkin. @MessageMapping bilan annotatsiyalangan metodlar alohida so'rovlarni qayta ishlasa, @ConnectMapping bilan annotatsiyalangan metodlar esa ulanish darajasidagi hodisalarni (metama’lumotlarni sozlash va itarish) qayta ishlaydi. Annotatsiyalangan javob beruvchilar simmetrik tarzda qo‘llab-quvvatlanadi, server va mijoz tomonidan javoblar uchun.
Server tarafidagi javob beruvchilar
Annotatsiyalangan javob beruvchilarni server tarafida ishlatish uchun @Controller annotatsiyalangan metodlari bilan biradigan binlarni topish uchun Spring konfiguratsiyasiga RSocketMessageHandler ni qo'shing:
@Configuration
static class ServerConfig {
@Bean
public RSocketMessageHandler rsocketMessageHandler() {
RSocketMessageHandler handler = new RSocketMessageHandler();
handler.routeMatcher(new PathPatternRouteMatcher());
return handler;
}
}
@Configuration
class ServerConfig {
@Bean
fun rsocketMessageHandler() = RSocketMessageHandler().apply {
routeMatcher = PathPatternRouteMatcher()
}
}
Keyin RSocket-serverini Java uchun RSocket API orqali ishga tushiring va javob beruvchi uchun RSocketMessageHandler ni quyidagi tarzda ulang:
ApplicationContext context = ... ;
RSocketMessageHandler handler = context.getBean(RSocketMessageHandler.class);
CloseableChannel server =
RSocketServer.create(handler.responder())
.bind(TcpServerTransport.create("localhost", 7000))
.block();
import org.springframework.beans.factory.getBean
val context: ApplicationContext = ...
val handler = context.getBean<RSocketMessageHandler>()
val server = RSocketServer.create(handler.responder())
.bind(TcpServerTransport.create("localhost", 7000))
.awaitSingle()
RSocketMessageHandler o‘rnatilgan holda murakkab metama’lumotlar va yo‘naltirish metama’lumotlarini qo‘llab-quvvatlaydi. Agar boshqa MIME-type ga o‘tish yoki qo‘shimcha MIME-typesni ro‘yxatga olish kerak bo‘lsa, uning MetadataExtractor ini sozlash mumkin.
Metama’lumotlar va ma’lumot formatlarini qo‘llab-quvvatlash uchun Encoder va Decoder misollarini sozlash kerak bo‘ladi. Codeclarni amalga oshirish uchun, ehtimol, spring-web moduli kerak bo‘ladi.
Odatiy bo‘lib, marshrutlarni AntPathMatcher orqali moslashtirish uchun SimpleRouteMatcher ishlatiladi. Marshrutlarni samarali moslashtirish uchun spring-web dan PathPatternRouteMatcherni bog‘lashni tavsiya etamiz. RSocket marshrutlar iyerarxik bo‘lishi mumkin, ammo URL marshrutlari emas. Ikkala marshrut moslashtiruvchi asboblar standart ravishda "." ajratgich sifatida foydalanishga o‘rnatilgan, URL-larni dekodlash esa, HTTP URL-lardagi kabi, yo‘q.
RSocketMessageHandler ni RSocketStrategies orqali sozlash mumkin, agar mijoz va server konfiguratsiyasini bir xil jarayonda bo‘lishish kerak bo‘lsa, bu foydali bo‘ladi:
@Configuration
static class ServerConfig {
@Bean
public RSocketMessageHandler rsocketMessageHandler() {
RSocketMessageHandler handler = new RSocketMessageHandler();
handler.setRSocketStrategies(rsocketStrategies());
return handler;
}
@Bean
public RSocketStrategies rsocketStrategies() {
return RSocketStrategies.builder()
.encoders(encoders -> encoders.add(new Jackson2CborEncoder()))
.decoders(decoders -> decoders.add(new Jackson2CborDecoder()))
.routeMatcher(new PathPatternRouteMatcher())
.build();
}
}
@Configuration
class ServerConfig {
@Bean
fun rsocketMessageHandler() = RSocketMessageHandler().apply {
rSocketStrategies = rsocketStrategies()
}
@Bean
fun rsocketStrategies() = RSocketStrategies.builder()
.encoders { it.add(Jackson2CborEncoder()) }
.decoders { it.add(Jackson2CborDecoder()) }
.routeMatcher(PathPatternRouteMatcher())
.build()
}
Mijoz tarafidagi javob beruvchilar
Mijoz tarafidagi annotatsiyalangan javob beruvchilar RSocketRequester.Builder da sozlanishi kerak.
@MessageMapping
Server yoki mijoz uchun javob beruvchi konfiguratsiyasi o‘rnatilgandan so‘ng, @MessageMapping annotatsiyalangan metodlardan quyidagi tarzda foydalanish mumkin:
@Controller
public class RadarsController {
@MessageMapping("locate.radars.within")
public Flux<AirportLocation> radars(MapRequest request) {
// ...
}
}
@Controller
class RadarsController {
@MessageMapping("locate.radars.within")
fun radars(request: MapRequest): Flow<AirportLocation> {
// ...
}
}
Yuqoridagi @MessageMapping annotatsiyalangan metod "locate.radars.within" marshruti bilan Request-Stream turidagi o‘zaro aloqaga javob beradi. U quyidagi metod argumentlaridan foydalanish imkoniyatiga ega metod uchun moslashuvchan imzo bilan ta’minlangan:
| Metod argumenti | Taʼrif |
|---|---|
|
|
So‘rovning foydali ma’lumotlari. Bu Eslatma: Annotatsiya ishlatish shart emas. Oddiy tur yoki boshqa qo‘llab-quvvatlanadigan argumentga ega bo‘lmagan metodning argumenti kutilayotgan foydali ma’lumotlar deb qabul qilinadi. |
|
|
Qabul qiluvchi tomoniga so‘rovlar yuborish uchun rekvester. |
|
|
Yo‘naltirish shabloni asosida marshrutdan chiqarilgan qiymat, masalan, |
|
|
Olingan bo‘lgan metama’lumotlar qiymati. |
|
|
Olingan bo‘lishi lozim bo‘lgan barcha metama’lumotlar qiymatlari. |
Qaytariladigan qiymatlar javobning foydali ma’lumotlari sifatida seriyalanadigan bir yoki bir nechta ob’yekt bo‘lishi kutiladi. Bu Mono yoki Flux kabi asinxron turlar, aniq qiymatlar yoki void va qiymatga ega bo‘lmagan asinxron tur, masalan, Mono<Void> bo‘lishi mumkin.
@MessageMapping annotatsiyalangan metodni qo‘llab-quvvatlaydigan RSocket o‘zaro aloqasi turi kiritish va chiqarish qudrat majmuasi bo‘yicha belgilanadi, bu erda qudrat majmuasi quyidagi ma’noni anglatadi:
| Kudrat majmuasi | Ta'rif |
|---|---|
| 1 |
Barqaror qiymat yoki |
| Ko‘p |
Ko'p qiymatga ega asinxron tur, masalan, |
| 0 |
Kirish bilan, bu metod argumentining Chiqish bilan, bu |
Quyidagi jadvalda kiritish va chiqarish qudrati majmui va mos keluvchi o‘zaro aloqa turlari ko‘rsatilgan:
| Kirish qudrati majmuasi | Chiqish qudrati majmuasi | O‘zaro aloqa turlari |
|---|---|---|
| 0, 1 |
0 |
Fire-and-Forget, Request-Response |
| 0, 1 |
1 |
Request-Response |
| 0, 1 |
Ko‘p |
Request-Stream |
| Ko‘p |
0, 1, ko‘p |
Request-Channel |
@ConnectMapping
@ConnectMapping annotatsiyasi RSocket ulanishi o‘rnatilishining boshida SETUP freymi va METADATA_PUSH freymi orqali metamaʼlumotlarni itarish bo‘yicha barcha keyingi xabarnomalarga ishlov beradi, yaʼni io.rsocket.RSocket da metadataPush(Payload).
@ConnectMapping bilan annotatsiyalangan metodlar @MessageMapping annotatsiyalangan metodlar kabi bir xil argumentlarni qo‘llab-quvvatlaydi, ammo ular SETUP va METADATA_PUSH freymalarining metama’lumotlari va ma’lumotlari asosida. @ConnectMapping annotatsiyasi marshrut orqali ma’lum ulanishlar uchun qayta ishlash tartibini ajratish uchun shablon bilan ta’minlanishi mumkin, agar shablonlar e’lon qilinmasa, barcha ulanishlar mos keladi.
@ConnectMapping bilan annotatsiyalangan metodlar ma’lumotlarni qaytarolmaydi, shuning uchun ularni void yoki Mono<Void> qaytariladigan qiymat sifatida qo‘llab-quvvatlash bilan e’lon qilish kerak. Agar yangi ulanish uchun qayta ishlash tartibi xatoni qaytarsa, ulangan ulanish rad etiladi. Qayta ishlash tartibi RSocketRequester da aniq ulanishiga so‘rovlar qilish uchun o‘z vaqtini kechiktirmaslik lozim.
GO TO FULL VERSION