AppConfiguration icon indicating copy to clipboard operation
AppConfiguration copied to clipboard

Refresh configs not working for Azure App Configuration with SpringWebflux

Open jyotijauhari opened this issue 1 year ago • 4 comments

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 !

jyotijauhari avatar Sep 23 '24 07:09 jyotijauhari

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.

mrm9084 avatar Sep 30 '24 17:09 mrm9084

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 avatar Oct 01 '24 06:10 jyotijauhari

Hi @mrm9084 any update on this ?

jyotijauhari avatar Oct 09 '24 02:10 jyotijauhari

Seems I missed a part, try:

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

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

mrm9084 avatar Oct 09 '24 16:10 mrm9084

Hi @mrm9084 , thanks so much. I have tried it and it works! closing the issue!

jyotijauhari avatar Nov 13 '24 05:11 jyotijauhari