JavaRush /Kurslar /All lectures for UZ purposes /Annotatsiyalangan javob beruvchilar

Annotatsiyalangan javob beruvchilar

All lectures for UZ purposes
Daraja, Dars
Mavjud

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:

Java
@Configuration
static class ServerConfig {
@Bean
public RSocketMessageHandler rsocketMessageHandler() {
RSocketMessageHandler handler = new RSocketMessageHandler();
handler.routeMatcher(new PathPatternRouteMatcher());
return handler;
}
}
Kotlin
@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:

Java
ApplicationContext context = ... ;
RSocketMessageHandler handler = context.getBean(RSocketMessageHandler.class);
CloseableChannel server =
RSocketServer.create(handler.responder())
.bind(TcpServerTransport.create("localhost", 7000))
.block();
Kotlin
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:

Java
@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();
}
}
Kotlin
@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:

Java
@Controller
public class RadarsController {
@MessageMapping("locate.radars.within")
public Flux<AirportLocation> radars(MapRequest request) {
// ...
}
}
Kotlin
@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

@Payload

So‘rovning foydali ma’lumotlari. Bu Mono yoki Flux kabi asinxron turlarning aniq qiymatlari bo‘lishi mumkin.

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.

RSocketRequester

Qabul qiluvchi tomoniga so‘rovlar yuborish uchun rekvester.

@DestinationVariable

Yo‘naltirish shabloni asosida marshrutdan chiqarilgan qiymat, masalan, @MessageMapping("find.radar.{id}").

@Header

Olingan bo‘lgan metama’lumotlar qiymati.

@Headers Map<String, Object>

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 Mono<T> kabi bitta qiymatga ega asinxron tur.

Ko‘p

Ko'p qiymatga ega asinxron tur, masalan, Flux<T>.

0

Kirish bilan, bu metod argumentining @Payload bilan annotatsiyasi bo‘lmaganligini bildiradi.

Chiqish bilan, bu void yoki Mono<Void> kabi qiymatga ega bo‘lmagan asinxron tur.

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.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION