Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refresh configs not working for Azure App Configuration with SpringWebflux #971

Open
jyotijauhari opened this issue Sep 23, 2024 · 4 comments

Comments

@jyotijauhari
Copy link

jyotijauhari commented Sep 23, 2024

Context: we are using azure app configuration to read the value of feature flag.

We are using reactive springboot library: springwebflux and the following dependency :

        <dependency>
            <groupId>com.azure.spring</groupId>
            <artifactId>spring-cloud-azure-appconfiguration-config</artifactId>
        </dependency>

        <dependency>
            <groupId>com.azure.spring</groupId>
            <artifactId>spring-cloud-azure-feature-management</artifactId>
        </dependency>

      <dependencyManagement>
            <dependency>
                <groupId>com.azure.spring</groupId>
                <artifactId>spring-cloud-azure-dependencies</artifactId>
                <version>5.2.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

Reading old issue it seems like Automated refresh is not supported with spring-cloud-azure-appconfiguration-config.

So I am trying manual refresh following this article

We have this configuration file which takes featureflag name and returns the value of it

open class AppConfigFeatureToggleManager(
    private val featureManager: FeatureManager,
    private val refresh: AppConfigurationRefresh?
) {

    suspend fun isFeatureEnabled(
        appConfigFeatureToggleName: AppConfigFeatureToggle
    ): Either<Throwable, Boolean> =
        Either.catch {
            refresh?.refreshConfigurations()?.awaitSingle() //MANUAL REFRESH
            featureManager
                .isEnabledAsync(appConfigFeatureToggleName.value)
                .onErrorResume { e ->
                    logger.error(
                        "Error checking feature flag ${appConfigFeatureToggleName.value}",
                        e,
                    )
                    mono { false }
                }
                .awaitSingle()
                .also {
                    logger.info(
                        "Feature flag ${appConfigFeatureToggleName.value}  isEnabled: {}",
                        it,
                    )
                }
        }
            .mapLeft {
                logger.error(
                    "Exception during feature flag evaluation: ${appConfigFeatureToggleName.value}",
                    it,
                )
                Throwable(it.message)
            }

My bootstrap.yaml

spring:
  profiles:
    active: ${SPRING_PROFILES_ACTIVE:default}
  cloud:
    azure:
      appconfiguration:
        enabled: true
        stores:
          - endpoint: endpoint
            enabled: true
            feature-flags:
              enabled: true
              selects:
                - label-filter: ${spring.profiles.active}
        credential:
          managed-identity-enabled: true
        monitoring:
          enabled: true
          refresh-interval: 30s
          triggers:
            - key: connectionTest

After deploying application, I am getting this error:

"context":"default","exception":"java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-epoll-2\n\tat reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:83)\n\tat reactor.core.publisher.Mono.block(Mono.java:1710)\n\tat com.azure.core.implementation.http.rest.AsyncRestProxy.handleRestReturnType(AsyncRestProxy.java:235)\n\tat com.azure.core.implementation.http.rest.AsyncRestProxy.invoke(AsyncRestProxy.java:86)\n\tat com.azure.core.implementation.http.rest.RestProxyBase.invoke(RestProxyBase.java:108)\n\tat com.azure.core.http.rest.RestProxy.invoke(RestProxy.java:92)\n\tat jdk.proxy3/jdk.proxy3.$Proxy77.listKeyValues(Unknown Source)\n\tat com.azure.data.appconfiguration.implementation.ConfigurationClientImpl.listConfigurationSettingsSinglePage(ConfigurationClientImpl.java:747)\n\tat com.azure.data.appconfiguration.implementation.ConfigurationClientImpl.lambda$listConfigurationSettings$24(ConfigurationClientImpl.java:616)\n\tat com.azure.core.http.rest.PagedIterable.lambda$new$1(PagedIterable.java:152)\n\tat com.azure.core.util.paging.ContinuablePagedByIteratorBase.requestPage(ContinuablePagedByIteratorBase.java:104)\n\tat com.azure.core.util.paging.ContinuablePagedByItemIterable$ContinuablePagedByItemIterator.(ContinuablePagedByItemIterable.java:83)\n\tat com.azure.core.util.paging.ContinuablePagedByItemIterable.iterator(ContinuablePagedByItemIterable.java:58)\n\tat com.azure.core.util.paging.ContinuablePagedIterable.iterator(ContinuablePagedIterable.java:141)\n\tat java.base/java.lang.Iterable.forEach(Iterable.java:74)\n\tat com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationReplicaClient.listSettings(AppConfigurationReplicaClient.java:125)\n\tat com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationRefreshUtil.refreshWithTimeFeatureFlags(AppConfigurationRefreshUtil.java:222)\n\tat com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationRefreshUtil.refreshStoresCheck(AppConfigurationRefreshUtil.java:89)\n\tat com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationPullRefresh.refreshStores(AppConfigurationPullRefresh.java:103)\n\tat com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationPullRefresh.refreshConfigurations(AppConfigurationPullRefresh.java:74)\n\tat it.aidexa.kyc.configurations.AppConfigFeatureToggleManager.isFeatureEnabled(AppConfigFeatureToggleManager.kt:25)\n\tat it.aidexa.kyc.appconfig.FeatureFlagController.getAppConfigToggle(FeatureFlagFromAppConfigController.kt:36)\n\tat it.aidexa.kyc.appconfig.FeatureFlagController.getAppConfigToggles(FeatureFlagFromAppConfigController.kt:30)\n\tat it.aidexa.kyc.appconfig.FeatureFlagController.getAllAvailableFeatureFlags(FeatureFlagFromAppConfigController.kt:24)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\n\tat kotlin.reflect.jvm.internal.calls.CallerImpl$Method.callMethod(CallerImpl.kt:97)\n\tat kotlin.reflect.jvm.internal.calls.CallerImpl$Method$Instance.call(CallerImpl.kt:113)\n\tat kotlin.reflect.jvm.internal.KCallableImpl.call(KCallableImpl.kt:107)\n\tat kotlin.reflect.full.KCallables.callSuspend(KCallables.kt:56)\n\tat org.springframework.core.CoroutinesUtils.lambda$invokeSuspendingFunction$2(CoroutinesUtils.java:108)\n\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$4.invokeSuspend(IntrinsicsJvm.kt:205)\n\tat kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)\n\tat kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:367)\n\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)\n\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25)\n\tat kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:110)\n\tat kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126)\n\tat kotlinx.coroutines.reactor.MonoKt.monoInternal$lambda-2(Mono.kt:90)\n\tat reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:58)\n\tat reactor.core.publisher.FluxFromMonoOperator.subscribe(FluxFromMonoOperator.java:83)\n\tat reactor.core.publisher.FluxDeferContextual.subscribe(FluxDeferContextual.java:57)\n\tat reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)\n\tat reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165)\n\tat reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)\n\tat reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200)\n\tat reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200)\n\tat reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:292)\n\tat reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:187)\n\tat reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:158)\n\tat reactor.core.publisher.MonoZip$ZipCoordinator.signal(MonoZip.java:293)\n\tat reactor.core.publisher.MonoZip$ZipInner.onNext(MonoZip.java:474)\n\tat reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180)\n\tat reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2545)\n\tat reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.request(MonoPeekTerminal.java:139)\n\tat reactor.core.publisher.MonoZip$ZipInner.onSubscribe(MonoZip.java:466)\n\tat reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onSubscribe(MonoPeekTerminal.java:152)\n\tat reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)\n\tat reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)\n\tat reactor.core.publisher.MonoZip$ZipCoordinator.request(MonoZip.java:216)\n\tat reactor.core.publisher.MonoFlatMap$FlatMapMain.request(MonoFlatMap.java:194)\n\tat reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onSubscribe(MonoIgnoreThen.java:134)\n\tat reactor.core.publisher.MonoFlatMap$FlatMapMain.onSubscribe(MonoFlatMap.java:117)\n\tat reactor.core.publisher.MonoZip.subscribe(MonoZip.java:125)\n\tat reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)\n\tat reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)\n\tat reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:240)\n\tat reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203)\n\tat reactor.core.publisher.MonoFlatMap$FlatMapMain.onComplete(MonoFlatMap.java:189)\n\tat reactor.core.publisher.Operators.complete(Operators.java:137)\n\tat reactor.core.publisher.MonoZip.subscribe(MonoZip.java:121)\n\tat reactor.core.publisher.Mono.subscribe(Mono.java:4485)\n\tat reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263)\n\tat reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)\n\tat reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)\n\tat reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165)\n\tat reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)\n\tat reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)\n\tat reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82)\n\tat reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.innerNext(FluxConcatMapNoPrefetch.java:258)\n\tat reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:863)\n\tat reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)\n\tat reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180)\n\tat reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2545)\n\tat reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.request(MonoPeekTerminal.java:139)\n\tat reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171)\n\tat reactor.core.publisher.Operators$MultiSubscriptionSubscriber.request(Operators.java:2305)\n\tat reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.request(FluxConcatMapNoPrefetch.java:338)\n\tat reactor.core.publisher.MonoNext$NextSubscriber.request(MonoNext.java:108)\n\tat reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2341)\n\tat reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2215)\n\tat reactor.core.publisher.MonoNext$NextSubscriber.onSubscribe(MonoNext.java:70)\n\tat reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.onSubscribe(FluxConcatMapNoPrefetch.java:164)\n\tat reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:201)\n\tat reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:83)\n\tat reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)\n\tat reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)\n\tat reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)\n\tat reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)\n\tat reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)\n\tat reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)\n\tat reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)\n\tat reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)\n\tat reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)\n\tat reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)\n\tat reactor.core.publisher.Mono.subscribe(Mono.java:4485)\n\tat reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263)\n\tat reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)\n\tat reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)\n\tat reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:55)\n\tat reactor.netty.http.server.HttpServer$HttpServerHandle.onStateChange(HttpServer.java:1006)\n\tat reactor.netty.ReactorNetty$CompositeConnectionObserver.onStateChange(ReactorNetty.java:710)\n\tat reactor.netty.transport.ServerTransport$ChildObserver.onStateChange(ServerTransport.java:477)\n\tat reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:633)\n\tat reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:113)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)\n\tat reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:228)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)\n\tat io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)\n\tat io.opentelemetry.javaagent.shaded.instrumentation.netty.v4_1.internal.server.HttpServerRequestTracingHandler.channelRead(HttpServerRequestTracingHandler.java:71)\n\tat io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)\n\tat io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)\n\tat io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)\n\tat io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)\n\tat io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)\n\tat io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)\n\tat io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)\n\tat io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:800)\n\tat io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$1.run(AbstractEpollChannel.java:425)\n\tat io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)\n\tat io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)\n\tat io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)\n\tat io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:403)\n\tat io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)\n\tat io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)\n\tat io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)\n\tat java.base/java.lang.Thread.run(Thread.java:833)\n"}

I tried searching and reading through articles available and didn't find anything related to this.

Additional details:
java version: 17

Spring boot dependency:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.5</version>
        <relativePath/>
    </parent>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

My application works when I remove
refresh?.refreshConfigurations()?.awaitSingle() //MANUAL REFRESH line
and

      monitoring:
         enabled: true
         refresh-interval: 30s
         triggers:
           - key: connectionTest

And in this old approach we have to restart pod everytime we change feature flag value.

Can you help us with this issue of manual refresh, thanks !

@mrm9084
Copy link
Member

mrm9084 commented Sep 30, 2024

Hi @jyotijauhari, you are correct that spring-cloud-azure-appconfiguration-config doesn't support auto refresh.

There is a current issue with this library not working with Spring WebFlux, because of how the design works we can't not block at some point, which can't be a thing in a thread tied to WebFlux controllers. We plan to fix this in the next major release. The current work around is doing:

refresh?.refreshConfigurations().subscribe();

or something similar. This will make it run the refresh in a new thread not tied to Spring WebFlux.

@jyotijauhari
Copy link
Author

Thanks for replying @mrm9084 ,

as suggested i updated the code to use subscribe

open class AppConfigFeatureToggleManager(
    private val featureManager: FeatureManager,
    private val refresh: AppConfigurationRefresh?
) {

    suspend fun isFeatureEnabled(
        appConfigFeatureToggleName: AppConfigFeatureToggle
    ): Either<Throwable, Boolean> =
        Either.catch {
            refresh?.refreshConfigurations()?.subscribe() //MANUAL REFRESH
            featureManager
                .isEnabledAsync(appConfigFeatureToggleName.value)
                .onErrorResume { e ->
                    logger.error(
                        "Error checking feature flag ${appConfigFeatureToggleName.value}",
                        e,
                    )
                    mono { false }
                }
                .awaitSingle()
                .also {
                    logger.info(
                        "Feature flag ${appConfigFeatureToggleName.value}  isEnabled: {}",
                        it,
                    )
                }
        }
            .mapLeft {
                logger.error(
                    "Exception during feature flag evaluation: ${appConfigFeatureToggleName.value}",
                    it,
                )
                Throwable(it.message)
            }

But I still have same error logs :

"exception":"java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-epoll-4\n\tat reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:83)\n\tat reactor.core.publisher.Mono.block(Mono.java:1710)\n\tat com.azure.core.implementation.http.rest.AsyncRestProxy.handleRestReturnType(AsyncRestProxy.java:235)\n\tat com.azure.core.implementation.http.rest.AsyncRestProxy.invoke(AsyncRestProxy.java:86)\n\tat com.azure.core.implementation.http.rest.RestProxyBase.invoke(RestProxyBase.java:108)\n\tat com.azure.core.http.rest.RestProxy.invoke(RestProxy.java:92)\n\tat jdk.proxy3/jdk.proxy3.$Proxy77.listKeyValues(Unknown Source)\n\tat com.azure.data.appconfiguration.implementation.ConfigurationClientImpl.listConfigurationSettingsSinglePage(ConfigurationClientImpl.java:747)\n\tat com.azure.data.appconfiguration.implementation.ConfigurationClientImpl.lambda$listConfigurationSettings$24(ConfigurationClientImpl.java:616)\n\tat com.azure.core.http.rest.PagedIterable.lambda$new$1(PagedIterable.java:152)\n\tat com.azure.core.util.paging.ContinuablePagedByIteratorBase.requestPage(ContinuablePagedByIteratorBase.java:104)\n\tat com.azure.core.util.paging.ContinuablePagedByItemIterable$ContinuablePagedByItemIterator.(ContinuablePagedByItemIterable.java:83)\n\tat com.azure.core.util.paging.ContinuablePagedByItemIterable.iterator(ContinuablePagedByItemIterable.java:58)\n\tat com.azure.core.util.paging.ContinuablePagedIterable.iterator(ContinuablePagedIterable.java:141)\n\tat java.base/java.lang.Iterable.forEach(Iterable.java:74)\n\tat com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationReplicaClient.listSettings(AppConfigurationReplicaClient.java:125)\n\tat com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationRefreshUtil.refreshWithTimeFeatureFlags(AppConfigurationRefreshUtil.java:222)\n\tat com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationRefreshUtil.refreshStoresCheck(AppConfigurationRefreshUtil.java:89)\n\tat com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationPullRefresh.refreshStores(AppConfigurationPullRefresh.java:103)\n\tat com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationPullRefresh.refreshConfigurations(AppConfigurationPullRefresh.java:74)\n\tat

@jyotijauhari
Copy link
Author

Hi @mrm9084 any update on this ?

@mrm9084
Copy link
Member

mrm9084 commented Oct 9, 2024

Seems I missed a part, try:

refresh.refreshConfigurations().subscribeOn(Schedulers.boundedElastic()).subscribe();

You need to make sure it's on a separate thread.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants