当前位置: 首页 > 知识库问答 >
问题:

在flatmap操作后访问map操作内的单对象

井誉
2023-03-14
exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, URI.create("https://" + newTargetURLHost + )
newTarget = serviceReturnsMono.getServerMapping(id).block().getHost();
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();

执行上述代码时,exchange属性不会发生变异。

我也尝试过以下方法,但没有成功:

            serverMappingMono
                    .map(serverMapping -> exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, URI.create("https://" + serverMapping.getHost() ))
                    .subscribe();

作为一个测试,当我按照下面的方式修改代码以排除故障时,下面的代码确实会发出一个硬编码字符串,并且exchange属性发生了变化。

                    .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();

        }));
    }
}
@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));
}

共有1个答案

薛栋
2023-03-14

我在我的手机上写这个,所以不能测试它,我从记忆中写,但它应该是这样的东西,我想。或者至少你明白了要旨。

我们首先提取ID。然后我们查找servermapping,如果进行顺利,我们将其作为一个属性,然后继续筛选器链。

您几乎不应该在应用程序中订阅,调用客户端通常是订阅方。并且永远不要在反应性应用程序中阻塞。

@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));
}
 类似资料:
  • FlatMap FlatMap将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的Observable FlatMap操作符使用一个指定的函数对原始Observable发射的每一项数据执行变换操作,这个函数返回一个本身也发射数据的Observable,然后FlatMap合并这些Observables发射的数据,最后将合并后的结果当做它自己的

  • Map 对Observable发射的每一项数据应用一个函数,执行变换操作 Map操作符对原始Observable发射的每一项数据应用一个你选择的函数,然后返回一个发射这些结果的Observable。 RxJava将这个操作符实现为map函数。这个操作符默认不在任何特定的调度器上执行。 Javadoc: map(Func1)) cast cast操作符将原始Observable发射的每一项数据都强制

  • 22.4. 建模CCI访问为操作对象 org.springframework.jca.cci.object 包中包含的支持类允许你以另一种风格访问EIS: 通过可重用的操作对象,类似于Spring的JDBC操作对象(参见JDBC一章)。 它通常都封装了 CCI 的API:将应用级的输入对象传入到操作对象, 从而它能创建输入record然后转换接收到的record数据到一个应用级输出对象并返回它。

  • 我正在集群中使用hazelcast-2.5。我有一个映射(键:字符串,值:用户定义对象的ArrayList)。我可以在大多数地方put/remove fine,但在代码的一个特定部分,put操作会无声无息地失败(用于put操作的键字符串是唯一的,ArrayList也不是空的)。不会引发异常。如果涉及锁,我甚至尝试了tryPut,该调用给出了一个真实的返回值。在put操作之后,我尝试打印出映射的ke

  • 对象是一个用于存储数据和元数据的容器。一个容器可以包 含很多对象,但是对象的名字必须唯一。这个 API 允许客 户端创建对象、设置访问权限及元数据、读取对象的数据和 元数据、以及删除对象。因为此 API 发出的请求是与用户 帐户信息相关的,所以此 API 内的所有请求都必须经过认 证,除非容器或对象的访问控制权限被故意设置成了可公开 访问(即允许匿名请求)。 创建或更新对象 要创建新对象,需发送带

  • 内存操作 函数 void *  rt_memset (void *s, int c, rt_ubase_t count)   设置内存数据   void *  rt_memcpy (void *dst, const void *src, rt_ubase_t count)   复制内存数据   void *  rt_memmove (void *dest, const void *src, rt_