第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 flatmap 操作之后訪問 map 操作中的 Mono 對象

在 flatmap 操作之后訪問 map 操作中的 Mono 對象

慕絲7291255 2023-03-23 16:23:33
我正在嘗試使用自定義過濾器使用 Spring Cloud Gateway 創(chuàng)建網(wǎng)關(guān)代理路由器。當以阻塞和命令的方式覆蓋屬性時,一切都按預期工作。exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, URI.create("https://" + newTargetURLHost + )字符串變量 newTargetURLHost 是通過使用獲得的:newTarget = serviceReturnsMono.getServerMapping(id).block().getHost();我是 Webflux 的新手,但上面這行代碼對我來說已經(jīng)是一種代碼味道了。進一步閱讀后,這不是使用反應式的最佳方法。我試圖以更具功能性/反應性的方式重寫,但未能讓反應流發(fā)出所需的值。Mono.just(serviceReturnsMono.getServerMapping(id))                    .flatMap(flat -> flat)                    .subscribeOn(Schedulers.immediate())                    .map(server -> exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, URI.create("https://" + server.getHost() ))                    .subscribe();當上面的代碼執(zhí)行時,exchange 屬性不會發(fā)生變化。我也嘗試了以下但沒有成功:            serverMappingMono                   .map(serverMapping -> exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, URI.create("https://" + serverMapping.getHost() ))                    .subscribe();作為測試,當我修改下面的代碼進行故障排除時,下面確實發(fā)出了一個硬編碼字符串并且交換屬性發(fā)生了變化。                    .map(server -> exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, URI.create("https://" + "testHostName" ))                    .subscribe();任何想法或指示將不勝感激。更新:過濾代碼如下:    private ReturnsMonoServerMappingService returnsMonoServerMappingService;    @Override    public int getOrder() {        return 10001;    }    @Override    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {        final String id = exchange.getRequest().getHeaders().getFirst("reference");        return chain.filter(exchange).then(Mono.fromRunnable(() -> {            Mono<ServerMapping> serverMapping = returnsMonoServerMappingService.getServerMapping(id);            serverMapping                    .map(server -> exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, URI.create("https://" + server.getHost()  )))                    .subscribe();        }));    }}我忽略的缺失部分是“doOnSuccess”,因為 returnsMonoServerMappingService 已經(jīng)返回一個單聲道。然后通過“then”鏈接交換以委托給鏈中的下一個過濾器。
查看完整描述

1 回答

?
MMTTMM

TA貢獻1869條經(jīng)驗 獲得超4個贊

我在手機上寫這個,所以無法測試它,我是憑記憶寫的,但我認為它應該是這樣的?;蛘咧辽倌忝靼琢艘c。


我們首先提取id。然后我們查找服務器映射,如果一切順利,我們將其作為一個屬性,然后我們繼續(xù)過濾器鏈。


您幾乎不應該在應用程序中訂閱,調(diào)用客戶端通常是訂閱者。永遠不要阻塞反應性應用程序。


@Override

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {


    final String id = exchange.getRequest()

                                 .getHeaders()

                                 .getFirst("reference");

    

    return returnsMonoServerMappingService.getServerMapping(id)

                     .doOnSuccess(serverMapping -> {                

                         exchange.getAttributes()

                             .put(GATEWAY_REQUEST_URL_ATTR, URI.create("https://" + server.getHost()

        }).then(chain.filter(exchange));

}


查看完整回答
反對 回復 2023-03-23
  • 1 回答
  • 0 關(guān)注
  • 320 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號