micronaut-projects / micronaut-discovery-client Goto Github PK
View Code? Open in Web Editor NEWMicronaut's Discovery Client
License: Apache License 2.0
Micronaut's Discovery Client
License: Apache License 2.0
References "io.micronaut.discovery:micronaut-discovery-client"
References "io.micronaut:micronaut-discovery-client"
Unfortunately I don't know how adoc resolves the dependency:micronaut-discovery-client
thingy. Otherwise I'd create a PR :)
No response
No response
3.0.0
We are looking to integrate with Vault, and the current VaultConfiguration
class does not have a way to generate the authentication token at runtime.
Our use case is that Vault is secured using Googles IAM authentication and service accounts. We need to be able to generate an IAM token to be used for authentication at runtime, and not have it hard coded in a property.
Looking at the current code, I would have to override and replace VaultClientConfiguration and shove our IAM token stuff in there. I think it's possible, but it's not very nice or flexible. Spring provides a simple ClientAuthentication interface you can implement to provide the token, and something similar would suffice.
If I have time I'll see about getting a more thorough proposal together, but wanted to throw this out there and see if maybe my approach has an obvious downsides.
% ./gradlew test --parallel
Version catalog 'mnTest' can be automatically imported. You can remove it from settings.gradle(.kts) file.
Type-safe project accessors is an incubating feature.
Project accessors enabled, but root project name not explicitly set for 'buildSrc'. Checking out the project in different folders will impact the generated code and implicitly the buildscript classpath, breaking caching.
> Task :test-suite-consul-graal:internalStartTestResourcesService
[1.312s][warning][cds] Preload Warning: Cannot find io/netty/channel/$Proxy12
[1.767s][warning][cds] Skipping jdk/internal/event/Event: JFR event class
[1.769s][warning][cds] Skipping jdk/internal/event/ProcessStartEvent: JFR event class
[1.769s][warning][cds] Skipping jdk/internal/event/SecurityProviderServiceEvent: JFR event class
[test-resources-service] 12:00:33.272 [ForkJoinPool.commonPool-worker-20] INFO i.m.t.e.TestResourcesResolverLoader - Loaded 1 test resources resolvers: io.micronaut.testresources.testcontainers.GenericTestContainerProvider
> Task :micronaut-discovery-client:testecuting test io.micronaut.discovery.consul.ConsulMockAutoRegistrationSpec
Predictive Test Selection: all test classes selected
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test mock server PASSED
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that the service is automatically registered with Consul PASSED
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that the service is automatically de-registered with Consul PASSED
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a service can be registered with tags PASSED
[test-resources-service] 12:00:33.373 [main] INFO i.m.t.server.TestResourcesService - A Micronaut Test Resources server is listening on port 65349, started in 153ms
[test-resources-service] 12:00:34.600 [default-nioEventLoopGroup-1-2] INFO i.m.t.e.TestResourcesResolverLoader - Loaded 1 test resources resolvers: io.micronaut.testresources.testcontainers.GenericTestContainerProvider
[test-resources-service] 12:00:34.843 [default-nioEventLoopGroup-1-2] INFO o.t.utility.ImageNameSubstitutor - Image name substitution will be performed by: DefaultImageNameSubstitutor (composite of 'ConfigurationFileImageNameSubstitutor' and 'PrefixingImageNameSubstitutor')eted
[test-resources-service] 12:00:34.845 [default-nioEventLoopGroup-1-2] INFO i.m.t.testcontainers.TestContainers - Starting test container consul
[test-resources-service] 12:00:34.958 [default-nioEventLoopGroup-1-2] INFO o.t.d.DockerClientProviderStrategy - Found Docker environment with Testcontainers Host with tc.host=tcp://127.0.0.1:65500
[test-resources-service] 12:00:34.959 [default-nioEventLoopGroup-1-2] INFO o.testcontainers.DockerClientFactory - Docker host IP address is 127.0.0.1
[test-resources-service] 12:00:34.962 [default-nioEventLoopGroup-1-2] INFO o.testcontainers.DockerClientFactory - Connected to docker:
Server Version: 24.0.6 (via Testcontainers Desktop 1.4.16)
API Version: 1.43l-graal:test > Executing test io.micronaut.consul.graal.ConsulTest
Operating System: Docker Desktop
Total Memory: 48105 MB
[test-resources-service] 12:00:34.964 [default-nioEventLoopGroup-1-2] INFO o.testcontainers.DockerClientFactory - Checking the system...
[test-resources-service] 12:00:34.964 [default-nioEventLoopGroup-1-2] INFO o.testcontainers.DockerClientFactory - ✔︎ Docker server version should be at least 1.6.0
[test-resources-service] 12:00:34.979 [default-nioEventLoopGroup-1-2] INFO tc.consul:1.9.0 - Creating container for image: consul:1.9.0
[test-resources-service] 12:00:35.112 [default-nioEventLoopGroup-1-2] INFO tc.testcontainers/ryuk:0.5.1 - Creating container for image: testcontainers/ryuk:0.5.1
[test-resources-service] 12:00:40.040 [default-nioEventLoopGroup-1-2] INFO tc.testcontainers/ryuk:0.5.1 - Container testcontainers/ryuk:0.5.1 is starting: ccc3906f6ec98de7e8355b9d87f71e1b7547356ed3651e3258ca95d7254776b9
[test-resources-service] 12:00:41.246 [default-nioEventLoopGroup-1-2] INFO tc.testcontainers/ryuk:0.5.1 - Container testcontainers/ryuk:0.5.1 started in PT6.134272S
[test-resources-service] 12:00:41.270 [default-nioEventLoopGroup-1-2] INFO tc.consul:1.9.0 - Container consul:1.9.0 is starting: e9ed335d684538878ee6ee8a7a22e743c4bc42f1492794a558aa85c2556cabd1
[test-resources-service] 12:00:41.397 [default-nioEventLoopGroup-1-2] INFO o.t.c.wait.strategy.HttpWaitStrategy - /inspiring_lalande: Waiting for 60 seconds for URL: http://127.0.0.1:65393/v1/status/leader (where port 65393 maps to container port 8500)l:test > 0 tests completed
[test-resources-service] 12:00:42.411 [default-nioEventLoopGroup-1-2] INFO tc.consul:1.9.0 - Container consul:1.9.0 started in PT7.446201S
> Task :micronaut-discovery-client:test
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a service can be registered with metadata PASSED (30s)
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a service can be registered with an HTTP health check PASSED
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a service can be registered with an HTTP health check and deregisterCriticalServiceAfter PASSEDDLE
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a service can be registered with an HTTP health check and tlsSkipVerify PASSED
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a service can be registered with an HTTP health check and HTTP method PASSED
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a asl token can be configured PASSED
Test Run :micronaut-discovery-client:test > Partition 2 in session 1 on localhost-executor-1 > EurekaAutoRegistrationSpec test that an application can be registered and de-registered with Eureka PASSED (17.1s)
Test Run :micronaut-discovery-client:test > Partition 3 in session 1 on localhost-executor-1 > EurekaClientSpec test is a discovery client PASSED
Test Run :micronaut-discovery-client:test > Partition 3 in session 1 on localhost-executor-1 > EurekaClientSpec test validation PASSED
Test Run :micronaut-discovery-client:test > Partition 3 in session 1 on localhost-executor-1 > EurekaClientSpec test register and de-register instance PASSED
Test Run :micronaut-discovery-client:test > Partition 6 in session 1 on localhost-executor-1 > VaultJacksonIntegrationTest test list secrets from vault PASSED (1.3s)
Test Run :micronaut-discovery-client:test > Partition 6 in session 1 on localhost-executor-1 > ClientScopeSpec test that a client can be discovered using @Client scope PASSED (3.1s)
Test Run :micronaut-discovery-client:test > Partition 6 in session 1 on localhost-executor-1 > ClientScopeSpec test that a client can be discovered using @Client scope with Consul SKIPPED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > ConsulAutoRegistrationSpec test that the service is automatically registered with Consul with a TTL configuration PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > ConsulAutoRegistrationSpec test that the service is automatically registered with Consul with a HTTP configuration PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > ConsulAutoRegistrationSpec test that a service can be registered with tags and queried with tags PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > ConsulAutoRegistrationSpec test that a service can be registered with metadata PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > ConsulAutoRegistrationSpec test that when Consul is explicitly configured, no AWS service discovery stuff is registered PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > ConsulAutoRegistrationSpec test auto-registration with checks PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > EurekaMockAutoRegistrationSpec test that an application can be registered and de-registered with Eureka hyphenated PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > EurekaMockAutoRegistrationSpec test that an application can be registered and de-registered with Eureka PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > EurekaMockAutoRegistrationSpec > test that an application can be registered and de-registered with Eureka with metadata test that an application can be registered and de-registered with Eureka with metadata [serviceId: myService, configuration: [asgName:test, vipAddress:myVip, secureVipAddress:mySecureVip, appGroupName:myAppGroup, status:STARTING], #0] PASSE
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > EurekaMockAutoRegistrationSpec > test that an application can be registered and de-registered with Eureka with metadata test that an application can be registered and de-registered with Eureka with metadata [serviceId: myService, configuration: [homePageUrl:http://home, statusPageUrl:http://status, healthCheckUrl:http://health, secureHealthCheckUrl:http://securehealth], #1] PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > EurekaMockAutoRegistrationSpec > test that an application can be registered and de-registered with Eureka with metadata test that an application can be registered and de-registered with Eureka with metadata [serviceId: myService, configuration: [metadata:[foo:bar]], #2] PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > EurekaMockAutoRegistrationSpec > test that an application can be registered and de-registered with Eureka with metadata test that an application can be registered and de-registered with Eureka with metadata [serviceId: myService, configuration: [port:9999, securePort:9998], #3] PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test is a discovery client PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test list services PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test register and deregister catalog entry PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test register and deregister service entry PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test register service with health check PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test list members PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test get self PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EagerInitSpec test run with eager init PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulHealthStatusSpec test the consul service's health status is correct PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaMockHeartbeatSpec test that the server reports a heartbeat to Eureka PASSED (5s)
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > test configure default zone test configure default zone [value: localhost:8087, result: [http://localhost:8087 (eureka)], #0] PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > test configure default zone test configure default zone [value: localhost:8087,localhost:8088, result: [http://localhost:8087 (eureka), http://localhost:8088 (eureka)], #1] PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > test configure other zones test configure other zones [value: localhost:8087, result: [http://localhost:8087 (eureka)], #0] PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > test configure other zones test configure other zones [value: localhost:8087,localhost:8088, result: [http://localhost:8087 (eureka), http://localhost:8088 (eureka)], #1] PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec test configure registration client PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > should correctly setup instance info (prefer ip-addr: #preferIpAddr) should correctly setup instance info (prefer ip-addr: true) PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > should correctly setup instance info (prefer ip-addr: #preferIpAddr) should correctly setup instance info (prefer ip-addr: false) PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > should correctly setup instance info with overrides from configuration properties (prefer ip-addr: #preferIpAddr) should correctly setup instance info with overrides from configuration properties (prefer ip-addr: true) PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > should correctly setup instance info with overrides from configuration properties (prefer ip-addr: #preferIpAddr) should correctly setup instance info with overrides from configuration properties (prefer ip-addr: false) PASSED
Test Run :micronaut-discovery-client:test > Partition 4 in session 1 on localhost-executor-1 > TtlHeartbeatSpec test that the server reports a TTL heartbeat when configured to do so PASSED (5.1s)
Test Run :micronaut-discovery-client:test > Partition 4 in session 1 on localhost-executor-1 > TtlHeartbeatSpec test that if the consul server goes down and comes back up the application re-registers SKIPPED
Test Run :micronaut-discovery-client:test > Partition 5 in session 1 on localhost-executor-1 > EurekaContextPathSpec test that the server reports a heartbeat to Eureka PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > MockConfigurationDiscoverySpec test read application configuration from Consul PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > MockConfigurationDiscoverySpec test multiple environment precedence PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > MockConfigurationDiscoverySpec test disable application configuration from Consul PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientFilesSpec test discovery property sources from Consul with YAML handling PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaMockBasicAuthSpec test authentication works PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > SpringCloudConfigSecuredTest test spring name configuration field when server secured and authorization provided PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > SpringCloudConfigSecuredTest test when cloud server secured and authorization not provided PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > SpringCloudConfigSecuredTest test when cloud server secured and only username is provided PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > SpringCloudConfigSecuredTest test when cloud server secured and invalid user credentials provided PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > CompositeDiscoverySpec test multiple service discovery clients PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockHealthStatusSpec test the consul service's health status is correct PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > VaultClientV2ConfigTest test configuration order PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > VaultClientV2ConfigTest test prefixed configuration order PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > DigitalOceanMetadataResolverSpec test building digital ocean compute metadata PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaEnabledSpec test client is not enabled with no config PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaEnabledSpec test client is enabled with service discovery settings PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaEnabledSpec test client is enabled with service discovery enabled PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaEnabledSpec test client is enabled with registration settings PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaEnabledSpec test client is enabled with registration enabled PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaEnabledSpec test client is disabled if both registration and discovery are disabled PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > VaultClientV1ConfigTest test configuration order PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > VaultClientV1ConfigTest test prefixed configuration order PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaHealthIndicatorSpec test eureka health indicator PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > SpringCloudConfigTest test configuration order PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > SpringCloudConfigTest test spring name configuration field PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientYamlSpec initializationError FAILED
java.lang.IllegalStateException: failed to create a child event loop
at app//io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:88)
at app//io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:60)
at app//io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:49)
at app//io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:59)
at app//io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:87)
at app//io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:82)
at app//io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:69)
at app//io.micronaut.http.netty.channel.NioEventLoopGroupFactory.createEventLoopGroup(NioEventLoopGroupFactory.java:56)
at app//io.micronaut.http.netty.channel.EventLoopGroupFactory.createEventLoopGroup(EventLoopGroupFactory.java:75)
at app//io.micronaut.http.netty.channel.DefaultEventLoopGroupFactory.createEventLoopGroup(DefaultEventLoopGroupFactory.java:96)
at app//io.micronaut.http.server.netty.DefaultNettyEmbeddedServerFactory.createEventLoopGroup(DefaultNettyEmbeddedServerFactory.java:284)
at app//io.micronaut.http.server.netty.NettyHttpServer.newEventLoopGroup(NettyHttpServer.java:688)
at app//io.micronaut.http.server.netty.NettyHttpServer.lambda$createParentEventLoopGroup$11(NettyHttpServer.java:478)
at [email protected]/java.util.Optional.orElseGet(Optional.java:364)
at app//io.micronaut.http.server.netty.NettyHttpServer.createParentEventLoopGroup(NettyHttpServer.java:477)
at app//io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:272)
at app//io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:104)
at app//io.micronaut.context.ApplicationContext.run(ApplicationContext.java:238)
at app//io.micronaut.context.ApplicationContext.run(ApplicationContext.java:210)
at app//io.micronaut.discovery.consul.ConsulMockConfigurationClientYamlSpec.$spock_initializeSharedFields(ConsulMockConfigurationClientYamlSpec.groovy:36)
Caused by: io.netty.channel.ChannelException: failed to open a new selector
at app//io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:179)
at app//io.netty.channel.nio.NioEventLoop.<init>(NioEventLoop.java:146)
at app//io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:183)
at app//io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:38)
at app//io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:84)
... 19 more
Caused by: java.io.IOException: Too many open files
at [email protected]/sun.nio.ch.KQueueSelectorImpl.<init>(KQueueSelectorImpl.java:82)
at [email protected]/sun.nio.ch.KQueueSelectorProvider.openSelector(KQueueSelectorProvider.java:36)
at app//io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:177)
... 23 more
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientJsonSpec test discovery property sources from Consul with JSON handling PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientJsonSpec test discovery property sources from Consul with invalid JSON PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientNativeSpec test read and write key values with ConsulClient PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientNativeSpec test discovery property sources from Consul with native property handling PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaInstanceInfoSpec test deserialize amazon instance info PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > DiscoveryClientHealthIndicatorConfigurationSpec test that the health indicator configuration is not available when disabled via config PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > DiscoveryClientHealthIndicatorConfigurationSpec test that the health indicator configuration is available when no entry is in config PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientPropertiesSpec test discovery property sources from Consul with Properties file handling PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > InstanceInfoSpec test instance info PASSED
FAILURE: Executed 86 tests in 1m 33s (1 failed, 2 skipped)
86 tests completed, 1 failed, 2 skipped
> Task :micronaut-discovery-client:test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':micronaut-discovery-client:test'.
> There were failing tests. See the report at: file:///Users/sdelamo/github/micronaut-projects/micronaut-discovery-client/discovery-client/build/reports/tests/test/index.html
Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
For more on this, please refer to https://docs.gradle.org/8.2.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.
BUILD FAILED in 1m 34s
22 actionable tasks: 4 executed, 2 from cache, 16 up-to-date
Publishing build scan...
https://ge.micronaut.io/s/xkc4dflt7k5dk
Registration with Eureka should work when using Micronaut serialization just as it does when using Jackson serialization.
During registration, Micronaut reports an error that PortWrapper could not be serialized:
Caused by: io.micronaut.serde.exceptions.SerdeException: No serializable introspection present for type PortWrapper portWrapper. Consider adding Serdeable. Serializable annotate to type PortWrapper portWrapper. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(PortWrapper.class) to enable serialization of this type.
at io.micronaut.serde.support.serializers.ObjectSerializer$4.tryToFindSerializer(ObjectSerializer.java:218)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.lambda$getSerializer$0(ObjectSerializer.java:280)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.getSerializer(ObjectSerializer.java:278)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.serialize(ObjectSerializer.java:245)
at io.micronaut.serde.support.serializers.CustomizedObjectSerializer.serialize(CustomizedObjectSerializer.java:132)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.serialize(ObjectSerializer.java:245)
at io.micronaut.serde.jackson.JacksonJsonMapper.writeValue(JacksonJsonMapper.java:114)
at io.micronaut.serde.jackson.JacksonJsonMapper.writeValue(JacksonJsonMapper.java:193)
at io.micronaut.json.body.JsonMessageHandler.writeTo(JsonMessageHandler.java:136)
... 45 common frames omitted
This seems like an easy fix – just adding @Serdeable
to PortWrapper. However, when I clone the code and add the @Serdeable annotation to the PortWrapper, the registration still doesn't work. This time, the issue is with serializing the DataCenterInfo class. On the discovery service side (spring boot application), the following exception is logged (trimmed for conciseness):
com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class com.netflix.appinfo.DataCenterInfo]: missing type id property '@Class'
at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 707]
at com.fasterxml.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:43) ~[jackson-databind-2.14.1.jar:2.14.1]
at com.fasterxml.jackson.databind.DeserializationContext.missingTypeIdException(DeserializationContext.java:2088) ~[jackson-databind-2.14.1.jar:2.14.1]
Looking at what's being sent, it seems that Micronaut serialization indeed does not include the @Class attribute into the json. Here's the resulting json:
{"instance":{"hostName":"localhost","port":{"@enabled":true,"$":8099},"securePort":{"@enabled":false,"$":0},"app":"transaction-service","instanceId":"transaction-service:8099","countryId":1,"ipAddr":"127.0.0.1","status":"UP","dataCenterInfo":{"dataCenterInfo":{"name":"MyOwn"},"leaseInfo":{"leaseInfo":{"registrationTimestamp":0,"lastRenewalTimestamp":0,"evictionTimestamp":0,"serviceUpTimestamp":0,"renewalIntervalInSecs":30,"durationInSecs":90},"statusPageUrl":"http://localhost:8099/health","homePageUrl":"http://localhost:8099","healthCheckUrl":"http://localhost:8099/health","vipAddress":"transaction-service","secureVipAddress":"transaction-service","secureHealthCheckUrl":"https://localhost/health"}}}}]
micronaut.application.name=demo
eureka.client.defaultZone=${EUREKA_HOST\:localhost}\:${EUREKA_PORT\:8761}
eureka.client.registration.enabled=true
@Serdeable
to the PortWrapper class, repeat the steps to see the second failureNo response
4.2.0
Problem Statement:
Let's say the micronaut.application.name is "MicronautConfigClientExample" and profile/environment is "test", it is actually searching for "micronaut-config-client-example" properties in Spring Config Server. Thus, unable to find the desired configuration. Is it possible to make the kebab format configurable so that developers can turn it off or on as per their own requirement and thus, they would be liable for the degraded performance ?.
Evidence Log:
19:00:41.855 [main] DEBUG i.m.d.s.c.SpringCloudConfigurationClient - Application Name: micronaut-config-client-example, Application Profiles: test, label: null
Hello,
I don't think it is an issue or a new feature, but here is what we have:
when starting application for hello-world, its name matchs the configurations both applications when we want to have it matching only its own application configuration
In the code ConsulConfigurationClient#L167 we can see that the test is on the path match startsWith
boolean isApplicationSpecificConfigKey = hasApplicationSpecificConfig && key.startsWith(applicationSpecificPath);
Nowhere on the documentation there is any mention about the name matching strategy, so we though it was an equals
I understand that this startWith strategy help manage the environment key (hello-world,dev or hello-world,prod for instances), but can't it be handle in a way that let the exact matching for the name ?
Like
boolean isApplicationSpecificConfigKey = hasApplicationSpecificConfig && (key.equals(applicationSpecificPath) || key.startsWith(applicationSpecificPath + ","));
Thanks for your time
We removed the Graal native test from our gitlab suite as it required a custom test runner.
We will move it in to here
v1.1.0.RC2.
ConsulClient currently doesn't provide consistency options for reads. This is a problem for clients that want to use something other than the default consistency.
https://www.consul.io/api/kv.html#read-key
Consistency is supported by ?consistent
or ?stale
query parameters.
Connect to eureka and get client id to call the api rest
I received and error when i run the tests.
first, i received the next error:
i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: No cache configured for name: discovery-client
i activated the cache and change the cache to cafffeine and the error is the same.
second, i change the cache to redis cache including the next sentences in the properties.
redis:
caches:
discovery-client:
expire-after-access: 60s
and the error changed to the next:
18:07:07.296 [default-nioEventLoopGroup-1-12] ERROR i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: I/O error occurred during serialization: io.micronaut.discovery.eureka.EurekaServiceInstance
io.micronaut.core.serialize.exceptions.SerializationException: I/O error occurred during serialization: io.micronaut.discovery.eureka.EurekaServiceInstance
at io.micronaut.core.serialize.JdkSerializer.serialize(JdkSerializer.java:63)
I do not which key and value i should to add to serializate the object correctly
No response
Windows 10
JDK 11
No response
2.3.0
Run the tutorial and demonstrage how sonsul would work.
The application fails with the following stack trace:
/Users/kristianrickert/.sdkman/candidates/java/17.0.5-amzn/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=62002:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/kristianrickert/Downloads/micronaut-microservices-services-discover-consul-gradle-kotlin (1)/bookrecommendation/build/classes/kotlin/main:/Users/kristianrickert/Downloads/micronaut-microservices-services-discover-consul-gradle-kotlin (1)/bookrecommendation/build/generated/ksp/main/classes:/Users/kristianrickert/Downloads/micronaut-microservices-services-discover-consul-gradle-kotlin (1)/bookrecommendation/build/resources/main:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.discovery/micronaut-discovery-client/4.0.1/93edd521ca27ce769f590abc22eac7389df6ad65/micronaut-discovery-client-4.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.kotlin/micronaut-kotlin-runtime/4.0.2/a85061b54a2a7908dbf3a7991af58e7e7846704a/micronaut-kotlin-runtime-4.0.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.reactor/micronaut-reactor-http-client/3.0.2/81d44de5e8cc0bedf6f4b4872022eff4b3505ca0/micronaut-reactor-http-client-3.0.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.reactor/micronaut-reactor/3.0.2/209dc7dc4710e241c048a8bafaaf6b0003b99b40/micronaut-reactor-3.0.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.serde/micronaut-serde-jackson/2.2.4/2c037ddb72942d01cd742424a35ab6699a33c1ff/micronaut-serde-jackson-2.2.4.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-http-client/4.1.6/991f4f20ccfc135bd369f3a4d1873f7f1dfbec1d/micronaut-http-client-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-retry/4.1.6/3347c66e64e7070eade33dcade17a64806152aae/micronaut-retry-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-management/4.1.6/ab0d444971a5967cface2fa969a56d1f17a7ba67/micronaut-management-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-http-server-netty/4.1.6/88b4c225560685e668133e3d67caf35877f5ed6b/micronaut-http-server-netty-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-inject/4.1.6/51ead8f85c5abfeaa4e9234f1bf7cc5ffcafdee6/micronaut-inject-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.nativeimage/svm/23.0.1/3a8dc6ab2a0a01b6a5a0cf02941492d6a5a9beea/svm-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.8.22/b52be44bc57cb6fd2169a29aefa4507c4e49c858/kotlin-reflect-1.8.22.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.8.22/b25c86d47d6b962b9cf0f8c3f320c8a10eea3dd1/kotlin-stdlib-jdk8-1.8.22.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-discovery-core/4.1.6/4f6c414c5a110b9a90cafa4670ee7d22668d243c/micronaut-discovery-core-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-json-core/4.1.6/899071d64f2f2696f6ad465751e3d98c46c4d922/micronaut-json-core-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.validation/micronaut-validation/4.0.3/2792c9474f65b5d5ff775d4d804bde7dd3ad1699/micronaut-validation-4.0.3.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-context/4.1.6/b52f30d46cec46c176d9dac3020f62372b82e6ab/micronaut-context-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.projectreactor/reactor-core/3.5.10/b2d043508fbc0190bfb63eea1b33551f48a8c32b/reactor-core-3.5.10.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.serde/micronaut-serde-api/2.2.4/b0de3fa4823a97e91f3c385400b4e6c21ce6edfa/micronaut-serde-api-2.2.4.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-jackson-core/4.1.6/e0450ffc50b1533645d29658a46cd5e186ff925a/micronaut-jackson-core-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-annotations/2.15.2/4724a65ac8e8d156a24898d50fd5dbd3642870b8/jackson-annotations-2.15.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-websocket/4.1.6/22eac813b6d57125ac5301f19c7b75c8d80b32cf/micronaut-websocket-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-http-client-core/4.1.6/e47a5eab2eb6a9ef5ae8bbe9fe66bcfbd3c619b6/micronaut-http-client-core-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-http-netty/4.1.6/c6c287095312541c62bf03a3665eca6628b700da/micronaut-http-netty-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-handler-proxy/4.1.97.Final/a99ecef0e1d86a92e40a7c89805c236d9cd7493e/netty-handler-proxy-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/2.0.9/7cf2726fdcfbc8610f9a71fb3ed639871f315340/slf4j-api-2.0.9.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-core-reactive/4.1.6/856b4ef83a273b39ba2b4a39657eca7e73ab6fe9/micronaut-core-reactive-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-router/4.1.6/eeaf11ff4caaea6a2ae24ebe733f1440d885fd2d/micronaut-router-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-http-server/4.1.6/eabe112b07c2c0174279359da1ba80e4109406d7/micronaut-http-server-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-codec-http/4.1.97.Final/af78acec783ffd77c63d8aeecc21041fd39ac54f/netty-codec-http-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-core/4.1.6/7165916b17e00ea684ec960d38598828702e81ea/micronaut-core-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/jakarta.annotation/jakarta.annotation-api/2.1.1/48b9bda22b091b1f48b13af03fe36db3be6e1ae3/jakarta.annotation-api-2.1.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/jakarta.inject/jakarta.inject-api/2.0.1/4c28afe1991a941d7702fe1362c365f0a8641d1e/jakarta.inject-api-2.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.nativeimage/objectfile/23.0.1/fdf2498dec4e3a9c245194459489326139542ebb/objectfile-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.nativeimage/pointsto/23.0.1/4c00015096d190329bed2afb6d944e3325d3c5e8/pointsto-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.nativeimage/native-image-base/23.0.1/5e6f202d15d266fad0fb80691608578dfb36b97d/native-image-base-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.compiler/compiler/23.0.1/d46d27452f8565a54f753208b16d4e0809180a98/compiler-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.sdk/graal-sdk/23.0.1/a9e13a0f6d6dea76f2dfdedc7f10325e4f0481c4/graal-sdk-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.8.22/636bf8b320e7627482771bbac9ed7246773c02bd/kotlin-stdlib-1.8.22.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.8.22/4dabb8248310d833bb6a8b516024a91fd3d275c/kotlin-stdlib-jdk7-1.8.22.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-http/4.1.6/45f92cb2a7806464e5788583fb20950fd26c1593/micronaut-http-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/jakarta.validation/jakarta.validation-api/3.0.2/92b6631659ba35ca09e44874d3eb936edfeee532/jakarta.validation-api-3.0.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-aop/4.1.6/8e06948b197df724bfec6661dec2d657df169c4b/micronaut-aop-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.reactivestreams/reactive-streams/1.0.4/3864a1320d97d7b045f729a326e1e077661f31b7/reactive-streams-1.0.4.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.15.2/a6fe1836469a69b3ff66037c324d75fc66ef137c/jackson-core-2.15.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-buffer-netty/4.1.6/57429cf821a1f39ed1f1e0efb99f5ec0ab267d17/micronaut-buffer-netty-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-codec-http2/4.1.97.Final/893888d09a7bef0d0ba973d7471943e765d0fd08/netty-codec-http2-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-handler/4.1.97.Final/abb86c6906bf512bf2b797a41cd7d2e8d3cd7c36/netty-handler-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-codec-socks/4.1.97.Final/30e8fa29a349db5a933225d61891b8802836bb79/netty-codec-socks-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-codec/4.1.97.Final/384ba4d75670befbedb45c4d3b497a93639c206d/netty-codec-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport/4.1.97.Final/f37380d23c9bb079bc702910833b2fd532c9abd0/netty-transport-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-buffer/4.1.97.Final/f8f3d8644afa5e6e1a40a3a6aeb9d9aa970ecb4f/netty-buffer-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-common/4.1.97.Final/7cceacaf11df8dc63f23d0fb58e9d4640fc88404/netty-common-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.truffle/truffle-api/23.0.1/7a374e07d336784c1ec94e8fed45a61a700c0993/truffle-api-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.8.22/1a8e3601703ae14bb58757ea6b2d8e8e5935a586/kotlin-stdlib-common-1.8.22.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-unix-common/4.1.97.Final/d469d84265ab70095b01b40886cabdd433b6e664/netty-transport-native-unix-common-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-resolver/4.1.97.Final/cec8348108dc76c47cf87c669d514be52c922144/netty-resolver-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.module/jackson-module-kotlin/2.15.2/475c9721f5a2a5b7bea57d504bd8b0586d1ba5e/jackson-module-kotlin-2.15.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.4.11/54450c0c783e896a1a6d88c043bd2f1daba1c382/logback-classic-1.4.11.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.yaml/snakeyaml/2.0/3aab2116756442bf0d4cd1c089b24d34c3baa253/snakeyaml-2.0.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/com.typesafe/config/1.4.2/4c40a633e7994cfb0354244efb6d03fcb11c3ecf/config-1.4.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.serde/micronaut-serde-support/2.2.4/80a9170538d1097bfc376e9ba994b3b435625cba/micronaut-serde-support-2.2.4.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-databind/2.15.2/9353b021f10c307c00328f52090de2bdb4b6ff9c/jackson-databind-2.15.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.4.11/2f9f280219a9922a74200eaf7138c4c17fb87c0f/logback-core-1.4.11.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-context-propagation/4.1.6/ba078112b19834cbe716321a79d2039e01c89b1b/micronaut-context-propagation-4.1.6.jar example.micronaut.ApplicationKt
| / () ___ _ __ ___ _ __ __ _ _ | |
| |/| | |/ | '/ _ | ' \ / ` | | | | |
| | | | | (| | | () | | | | (| | || | |_
|| |||___|| ___/|| ||_,|_,|__|
20:18:52.607 [main] INFO i.m.c.DefaultApplicationContext$RuntimeConfiguredEnvironment - Established active environments: [dev]
20:18:52.609 [main] INFO i.m.c.DefaultApplicationContext$BootstrapEnvironment - Established active environments: [dev]
20:18:52.618 [main] INFO i.m.context.DefaultBeanContext - Reading bootstrap environment configuration
20:18:53.126 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 730ms. Server Running: http://localhost:8080
20:19:03.140 [default-nioEventLoopGroup-1-2] WARN i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.timeout.ReadTimeoutException: null
20:19:09.167 [default-nioEventLoopGroup-1-3] WARN i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.timeout.ReadTimeoutException: null
20:19:18.178 [default-nioEventLoopGroup-1-4] WARN i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.timeout.ReadTimeoutException: null
20:19:20.195 [default-nioEventLoopGroup-1-5] ERROR i.m.d.registration.AutoRegistration - Error occurred during service registration with Consul: Error encoding object [io.micronaut.discovery.consul.client.v1.NewServiceEntry@9a176cd9] to JSON: No serializable introspection present for type Inet4Address. Consider adding Serdeable. Serializable annotate to type Inet4Address. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(Inet4Address.class) to enable serialization of this type.
io.micronaut.http.codec.CodecException: Error encoding object [io.micronaut.discovery.consul.client.v1.NewServiceEntry@9a176cd9] to JSON: No serializable introspection present for type Inet4Address. Consider adding Serdeable. Serializable annotate to type Inet4Address. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(Inet4Address.class) to enable serialization of this type.
at io.micronaut.json.body.JsonMessageHandler.decorateWrite(JsonMessageHandler.java:127)
at io.micronaut.json.body.JsonMessageHandler.writeTo(JsonMessageHandler.java:136)
at io.micronaut.http.body.MessageBodyWriter.writeTo(MessageBodyWriter.java:138)
at io.micronaut.http.netty.body.NettyJsonHandler.writeTo(NettyJsonHandler.java:133)
at io.micronaut.http.body.DynamicMessageBodyWriter.writeTo(DynamicMessageBodyWriter.java:79)
at io.micronaut.http.client.netty.DefaultHttpClient.buildNettyRequest(DefaultHttpClient.java:1326)
at io.micronaut.http.client.netty.DefaultHttpClient.sendRequestThroughChannel(DefaultHttpClient.java:1468)
at io.micronaut.http.client.netty.DefaultHttpClient.lambda$exchangeImpl$26(DefaultHttpClient.java:1102)
at reactor.core.publisher.FluxCreate.subscribe(FluxCreate.java:95)
at reactor.core.publisher.Flux.subscribe(Flux.java:8773)
at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onNext(MonoFlatMapMany.java:195)
at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82)
at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82)
at io.micronaut.http.client.netty.CancellableMonoSink.tryForward(CancellableMonoSink.java:69)
at io.micronaut.http.client.netty.CancellableMonoSink.tryEmitValue(CancellableMonoSink.java:86)
at io.micronaut.http.client.netty.ConnectionManager$Pool$ConnectionHolder.emitPoolHandle(ConnectionManager.java:1155)
at io.micronaut.http.client.netty.ConnectionManager$Pool$Http1ConnectionHolder.dispatch0(ConnectionManager.java:1308)
at io.micronaut.http.client.netty.ConnectionManager$Pool$ConnectionHolder.dispatch(ConnectionManager.java:1179)
at io.micronaut.http.client.netty.PoolResizer.dispatchSafe(PoolResizer.java:169)
at io.micronaut.http.client.netty.PoolResizer.doSomeWork(PoolResizer.java:115)
at io.micronaut.http.client.netty.PoolResizer.dirty(PoolResizer.java:77)
at io.micronaut.http.client.netty.PoolResizer.onNewConnectionEstablished1(PoolResizer.java:208)
at io.micronaut.http.client.netty.ConnectionManager$Pool$Http1ConnectionHolder.init(ConnectionManager.java:1248)
at io.micronaut.http.client.netty.ConnectionManager$Pool$2$1.channelActive(ConnectionManager.java:1038)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:262)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:238)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelActive(AbstractChannelHandlerContext.java:231)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelActive(CombinedChannelDuplexHandler.java:412)
at io.netty.channel.ChannelInboundHandlerAdapter.channelActive(ChannelInboundHandlerAdapter.java:69)
at io.netty.channel.CombinedChannelDuplexHandler.channelActive(CombinedChannelDuplexHandler.java:211)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:260)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:238)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelActive(AbstractChannelHandlerContext.java:231)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelActive(DefaultChannelPipeline.java:1398)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:258)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:238)
at io.netty.channel.DefaultChannelPipeline.fireChannelActive(DefaultChannelPipeline.java:895)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:305)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:335)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:776)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: io.micronaut.serde.exceptions.SerdeException: No serializable introspection present for type Inet4Address. Consider adding Serdeable. Serializable annotate to type Inet4Address. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(Inet4Address.class) to enable serialization of this type.
at io.micronaut.serde.support.serializers.ObjectSerializer$4.tryToFindSerializer(ObjectSerializer.java:218)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.lambda$getSerializer$0(ObjectSerializer.java:280)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.getSerializer(ObjectSerializer.java:278)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.serialize(ObjectSerializer.java:245)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.serialize(ObjectSerializer.java:245)
at io.micronaut.serde.support.serializers.OptionalSerializer$1.serialize(OptionalSerializer.java:63)
at io.micronaut.serde.support.serializers.OptionalSerializer$1.serialize(OptionalSerializer.java:51)
at io.micronaut.serde.support.serializers.CustomizedObjectSerializer.serialize(CustomizedObjectSerializer.java:132)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.serialize(ObjectSerializer.java:245)
at io.micronaut.serde.jackson.JacksonJsonMapper.writeValue(JacksonJsonMapper.java:114)
at io.micronaut.serde.jackson.JacksonJsonMapper.writeValue(JacksonJsonMapper.java:193)
at io.micronaut.json.body.JsonMessageHandler.writeTo(JsonMessageHandler.java:134)
... 45 common frames omitted
Caused by: io.micronaut.core.beans.exceptions.IntrospectionException: No serializable introspection present for type Inet4Address. Consider adding Serdeable. Serializable annotate to type Inet4Address. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(Inet4Address.class) to enable serialization of this type.
at io.micronaut.serde.support.DefaultSerdeIntrospections.getSerializableIntrospection(DefaultSerdeIntrospections.java:102)
at io.micronaut.serde.support.serializers.SerBean.(SerBean.java:107)
at io.micronaut.serde.support.serializers.ObjectSerializer.create(ObjectSerializer.java:202)
at io.micronaut.serde.support.serializers.ObjectSerializer.lambda$getSerBean$0(ObjectSerializer.java:193)
at io.micronaut.core.util.SupplierUtil$2.get(SupplierUtil.java:79)
at io.micronaut.serde.support.serializers.ObjectSerializer.getSerBean(ObjectSerializer.java:194)
at io.micronaut.serde.support.serializers.ObjectSerializer.createSpecificInternal(ObjectSerializer.java:93)
at io.micronaut.serde.support.serializers.ObjectSerializer.createSpecific(ObjectSerializer.java:86)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.tryToFindSerializer(ObjectSerializer.java:296)
at io.micronaut.serde.support.serializers.ObjectSerializer$4.tryToFindSerializer(ObjectSerializer.java:216)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.lambda$getSerializer$0(ObjectSerializer.java:280)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.getSerializer(ObjectSerializer.java:278)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.isEmpty(ObjectSerializer.java:256)
at io.micronaut.serde.support.serializers.OptionalSerializer$1.isEmpty(OptionalSerializer.java:77)
at io.micronaut.serde.support.serializers.OptionalSerializer$1.isEmpty(OptionalSerializer.java:51)
at io.micronaut.serde.support.serializers.CustomizedObjectSerializer.serialize(CustomizedObjectSerializer.java:100)
... 49 common frames omitted
20:20:03.761 [parallel-4] ERROR i.m.m.health.indicator.HealthResult - Health indicator [compositeDiscoveryClient(consul)] reported exception: io.micronaut.http.client.exceptions.ReadTimeoutException: Read Timeout
io.micronaut.http.client.exceptions.ReadTimeoutException: Read Timeout
at io.micronaut.http.client.exceptions.ReadTimeoutException.(ReadTimeoutException.java:26)
at io.micronaut.http.client.netty.DefaultHttpClient.lambda$exchangeImpl$28(DefaultHttpClient.java:1135)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.handleTimeout(FluxTimeout.java:295)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.doTimeout(FluxTimeout.java:280)
at reactor.core.publisher.FluxTimeout$TimeoutTimeoutSubscriber.onNext(FluxTimeout.java:419)
at reactor.core.publisher.FluxOnErrorReturn$ReturnSubscriber.onNext(FluxOnErrorReturn.java:162)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.propagateDelay(MonoDelay.java:271)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.run(MonoDelay.java:286)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.239 [default-nioEventLoopGroup-1-5] ERROR i.m.d.registration.AutoRegistration - Error occurred de-registering service [bookrecommendation] with Consul: Read Timeout
io.micronaut.http.client.exceptions.ReadTimeoutException: Read Timeout
at io.micronaut.http.client.exceptions.ReadTimeoutException.(ReadTimeoutException.java:26)
at io.micronaut.http.client.netty.DefaultHttpClient.lambda$exchangeImpl$28(DefaultHttpClient.java:1135)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.handleTimeout(FluxTimeout.java:295)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.doTimeout(FluxTimeout.java:280)
at reactor.core.publisher.FluxTimeout$TimeoutTimeoutSubscriber.onNext(FluxTimeout.java:419)
at reactor.core.publisher.FluxOnErrorReturn$ReturnSubscriber.onNext(FluxOnErrorReturn.java:162)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.propagateDelay(MonoDelay.java:271)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.run(MonoDelay.java:286)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.367 [default-nioEventLoopGroup-1-23] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.367 [default-nioEventLoopGroup-1-21] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.369 [default-nioEventLoopGroup-1-24] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.370 [default-nioEventLoopGroup-1-22] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.371 [default-nioEventLoopGroup-1-25] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.372 [default-nioEventLoopGroup-1-27] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.372 [default-nioEventLoopGroup-1-29] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.470 [default-nioEventLoopGroup-1-28] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.470 [default-nioEventLoopGroup-1-26] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:34.326 [Thread-0] INFO io.micronaut.runtime.Micronaut - Embedded Application shutting down
Process finished with exit code 0
brew tap hashicorp/tap
brew install hashicorp/tap/consul
consul agent -dev
JDK
java --version
openjdk 17.0.8 2023-07-18 LTS
OpenJDK Runtime Environment Corretto-17.0.8.7.1 (build 17.0.8+7-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.8.7.1 (build 17.0.8+7-LTS, mixed mode, sharing)
OSX - Sonoma 14
Micronaut consul tutorial
https://guides.micronaut.io/latest/micronaut-microservices-services-discover-consul-gradle-kotlin.html
https://guides.micronaut.io/latest/micronaut-microservices-services-discover-consul-maven-java.html
Both fail
I also have an app on github below that fails in the same manner. There are 2 standalone grpc servers on that code, both have the same failures
I also tried running consul as local docker deploy. Same result
Furthermore, I get a similar error when trying Eureka
https://github.com/krickert/search_indexer
mn -V: Micronaut Version: 4.1.3
The application should start.
The BeanInstantiationException exception is thrown.
Stack trace:
19:20:06.684 [main] INFO i.m.context.DefaultBeanContext - Reading bootstrap environment configuration
19:20:06.848 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: Bean definition [io.micronaut.discovery.eureka.EurekaServiceInstanceList] could
not be loaded: io/micronaut/http/client/HttpClientConfiguration
io.micronaut.context.exceptions.BeanInstantiationException: Bean definition [io.micronaut.discovery.eureka.EurekaServiceInstanceList] could not be loaded: io/micronaut/http/client/HttpClientConfiguration
at io.micronaut.context.DefaultBeanContext$BeanDefinitionProducer.getDefinition(DefaultBeanContext.java:4157)
at io.micronaut.context.DefaultBeanContext.collectBeanCandidates(DefaultBeanContext.java:2138)
at io.micronaut.context.DefaultBeanContext.findBeanCandidates(DefaultBeanContext.java:2113)
at io.micronaut.context.DefaultBeanContext.findBeanCandidatesInternal(DefaultBeanContext.java:3362)
at io.micronaut.context.DefaultBeanContext.getBeanRegistrations(DefaultBeanContext.java:3417)
at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:1436)
at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:881)
at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:871)
at io.micronaut.context.event.ApplicationEventPublisherFactory$2.lambda$$1(ApplicationEventPublisherFactory.java:215)
at io.micronaut.core.util.SupplierUtil$1.get(SupplierUtil.java:47)
at io.micronaut.context.event.ApplicationEventPublisherFactory$2.publishEvent(ApplicationEventPublisherFactory.java:226)
at io.micronaut.context.DefaultBeanContext.publishEvent(DefaultBeanContext.java:1779)
at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:360)
at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:198)
at io.micronaut.runtime.Micronaut.start(Micronaut.java:73)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:322)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:308)
at foo.Application.main(Application.java:8)
Caused by: java.lang.NoClassDefFoundError: io/micronaut/http/client/HttpClientConfiguration
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at io.micronaut.discovery.eureka.$EurekaServiceInstanceList$Definition.<clinit>(Unknown Source)
at io.micronaut.discovery.eureka.$EurekaServiceInstanceList$Definition$Reference.load(Unknown Source)
at io.micronaut.context.AbstractInitializableBeanDefinitionReference.load(AbstractInitializableBeanDefinitionReference.java:178)
at io.micronaut.context.DefaultBeanContext$BeanDefinitionProducer.getDefinition(DefaultBeanContext.java:4152)
... 17 common frames omitted
Caused by: java.lang.ClassNotFoundException: io.micronaut.http.client.HttpClientConfiguration
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 39 common frames omitted
Create a new micronaut application with discovery-client feature.
Run the application.
mn create-app foo.bar --features=discovery-client --build=maven --lang=java
cd bar
mvn mn:run
OS: Windows 11 / WSL 2 (Ubuntu)
$ java -version
openjdk version "17.0.8.1" 2023-08-24
OpenJDK Runtime Environment Temurin-17.0.8.1+1 (build 17.0.8.1+1)
OpenJDK 64-Bit Server VM Temurin-17.0.8.1+1 (build 17.0.8.1+1, mixed mode, sharing)
mvn --version
Apache Maven 3.9.4 (dfbb324ad4a7c8fb0bf182e6d91b0ae20e3d2dd9)
Maven home: /home/user/.sdkman/candidates/maven/current
Java version: 17.0.8.1, vendor: Eclipse Adoptium, runtime: /home/user/.sdkman/candidates/java/17.0.8.1-tem
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "5.15.90.1-microsoft-standard-wsl2", arch: "amd64", family: "unix"
mn --version
Micronaut Version: 4.1.1
No response
4.1.1
When combining @value with a Configuration Server like Consul, the changes to the properties in Consul are not propagated automatically to the beans that reference them
We can only force it using the /refresh endpoint that would reload all the beans annotated with Refreshable.
Micronaut could benefit if a mechanism is in place in order to subcsribe to events Consul changes, in order to perform the same action, without the need of hitting the refresh endpoint
Hi,
I configured a micronaut service to connect to Eureka which works fine for a regular Java package. But if I package it via docker-native
as a GraalVM image, the microservice throw constantly exceptions at runtime.
13:02:08.386 [default-nioEventLoopGroup-1-19] ERROR i.m.m.health.indicator.HealthResult - Health indicator [eureka] reported exception: io.micronaut.http.client.exceptions.HttpClientResponseException: Error decoding HTTP response body: Error decoding stream for type [class io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$Applicatio
nInfos]: Cannot construct instance of `io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$ApplicationInfos` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{"applications":{"versions__delta":"1","apps__hashcode":"DOWN_1_UP_1_","application":[{"name":"MODULE1","instance":[{"instanceId":"module1:8080","hostName":"module1-001","app":"MODULE1","ipAddr":"172.20.0.5","status":"DOWN","overriddenStatus":"DOWN","port":{"$":8080,"@enabled":"true"},"securePort":{"$":0,"@enabled":"false"},"
countryId":1,"dataCenterInfo":{"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo","name":"MyOwn"},"leaseInfo":{"renewalIntervalInSecs":30,"durationInSecs":90,"reg"[truncated 1612 bytes]; line: 1, column: 18]
io.micronaut.http.client.exceptions.HttpClientResponseException: Error decoding HTTP response body: Error decoding stream for type [class io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$ApplicationInfos]: Cannot construct instance of `io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$ApplicationInfos` (no Creators, like
default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{"applications":{"versions__delta":"1","apps__hashcode":"DOWN_1_UP_1_","application":[{"name":"MODULE1","instance":[{"instanceId":"module1:8080","hostName":"module1-001","app":"MODULE1","ipAddr":"172.20.0.5","status":"DOWN","overriddenStatus":"DOWN","port":{"$":8080,"@enabled":"true"},"securePort":{"$":0,"@enabled":"false"},"
countryId":1,"dataCenterInfo":{"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo","name":"MyOwn"},"leaseInfo":{"renewalIntervalInSecs":30,"durationInSecs":90,"reg"[truncated 1612 bytes]; line: 1, column: 18]
at io.micronaut.http.client.netty.DefaultHttpClient$12.channelReadInstrumented(DefaultHttpClient.java:2206)
at io.micronaut.http.client.netty.DefaultHttpClient$12.channelReadInstrumented(DefaultHttpClient.java:2076)
at io.micronaut.http.client.netty.DefaultHttpClient$SimpleChannelInboundHandlerInstrumented.channelRead0(DefaultHttpClient.java:2780)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:193)
at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:183)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:829)
at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:553)
at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
Caused by: io.micronaut.http.codec.CodecException: Error decoding stream for type [class io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$ApplicationInfos]: Cannot construct instance of `io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$ApplicationInfos` (no Creators, like default constructor, exist): cannot deserialize
from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{"applications":{"versions__delta":"1","apps__hashcode":"DOWN_1_UP_1_","application":[{"name":"MODULE1","instance":[{"instanceId":"module1:8080","hostName":"module1-001","app":"MODULE1","ipAddr":"172.20.0.5","status":"DOWN","overriddenStatus":"DOWN","port":{"$":8080,"@enabled":"true"},"securePort":{"$":0,"@enabled":"false"},"
countryId":1,"dataCenterInfo":{"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo","name":"MyOwn"},"leaseInfo":{"renewalIntervalInSecs":30,"durationInSecs":90,"reg"[truncated 1612 bytes]; line: 1, column: 18]
at io.micronaut.jackson.codec.JacksonMediaTypeCodec.decode(JacksonMediaTypeCodec.java:209)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.convertByteBuf(FullNettyClientHttpResponse.java:280)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.lambda$getBody$1(FullNettyClientHttpResponse.java:218)
at java.util.HashMap.computeIfAbsent(HashMap.java:1133)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.getBody(FullNettyClientHttpResponse.java:192)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.<init>(FullNettyClientHttpResponse.java:111)
at io.micronaut.http.client.netty.DefaultHttpClient$12.channelReadInstrumented(DefaultHttpClient.java:2136)
... 45 common frames omitted
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$ApplicationInfos` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{"applications":{"versions__delta":"1","apps__hashcode":"DOWN_1_UP_1_","application":[{"name":"MODULE1","instance":[{"instanceId":"module1:8080","hostName":"module1-001","app":"MODULE1","ipAddr":"172.20.0.5","status":"DOWN","overriddenStatus":"DOWN","port":{"$":8080,"@enabled":"true"},"securePort":{"$":0,"@enabled":"false"},"
countryId":1,"dataCenterInfo":{"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo","name":"MyOwn"},"leaseInfo":{"renewalIntervalInSecs":30,"durationInSecs":90,"reg"[truncated 1612 bytes]; line: 1, column: 18]
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1764)
at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1209)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1415)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:362)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:195)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext._unwrapAndDeserialize(DefaultDeserializationContext.java:355)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:319)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3609)
at io.micronaut.jackson.codec.JacksonMediaTypeCodec.decode(JacksonMediaTypeCodec.java:206)
... 51 common frames omitted
Imho, Jackson fails because it uses an unsupported reflection access to deserialize io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient.ApplicationInfo
. Micronaut Documentation states that you have to annotate such classes with @Introspected
to point out to the compiler to add additional configuration information.
Greets, Aaron
If a path return 404 - NOT_FOUND, the application start
The API return 404 - NOT_FOUND with a body
{
"errors": []
}
and the application does not start and we got the error:
java.lang.IllegalAccessError: class io.micronaut.http.hateoas.JsonError$Creator4JacksonDeserializer066f2705 tried to access method 'void io.micronaut.http.hateoas.JsonError.()' (io.micronaut.http.hateoas.JsonError$Creator4JacksonDeserializer066f2705 is in unnamed module of loader com.fasterxml.jackson.module.afterburner.util.MyClassLoader @7e93f3b0; io.micronaut.http.hateoas.JsonError is in unnamed module of loader 'app')
at io.micronaut.http.hateoas.JsonError$Creator4JacksonDeserializer066f2705.createUsingDefault(io/micronaut/http/hateoas/JsonError$Creator4JacksonDeserializer.java)
at com.fasterxml.jackson.module.afterburner.deser.SuperSonicBeanDeserializer.deserialize(SuperSonicBeanDeserializer.java:136)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4730)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3771)
at io.micronaut.jackson.databind.JacksonDatabindMapper.readValue(JacksonDatabindMapper.java:119)
at io.micronaut.json.codec.MapperMediaTypeCodec.decode(MapperMediaTypeCodec.java:190)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.convertByteBuf(FullNettyClientHttpResponse.java:279)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.lambda$getBody$1(FullNettyClientHttpResponse.java:217)
at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1220)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.getBody(FullNettyClientHttpResponse.java:191)
at io.micronaut.http.client.exceptions.HttpClientResponseException.initResponse(HttpClientResponseException.java:95)
at io.micronaut.http.client.exceptions.HttpClientResponseException.(HttpClientResponseException.java:63)
at io.micronaut.http.client.exceptions.HttpClientResponseException.(HttpClientResponseException.java:50)
at io.micronaut.http.client.exceptions.HttpClientResponseException.(HttpClientResponseException.java:41)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.makeErrorFromRequestBody(DefaultHttpClient.java:2232)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.buildResponse(DefaultHttpClient.java:2194)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.buildResponse(DefaultHttpClient.java:2117)
at io.micronaut.http.client.netty.DefaultHttpClient$BaseHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2092)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2153)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2117)
at io.micronaut.http.client.netty.SimpleChannelInboundHandlerInstrumented.channelRead0(SimpleChannelInboundHandlerInstrumented.java:49)
If I understand it correctly, as the body returned by the response is not taken into account, the response generated has a null
body, so the serializer try to use the empty constructor of JsonError
which is package accessible only
@Internal
JsonError() {
}
so can not be accessed by the Jackson and thus throw the error
I was able to pass through this issue by replacing client VaultConfigHttpClientV2
by a custom one, adding the errorType
parameter to the client configuration
@Client(
value = VaultClientConfiguration.VAULT_CLIENT_CONFIG_ENDPOINT,
configuration = VaultClientConfiguration.class,
errorType = VaultErrorV2.class)
@Replaces(io.micronaut.discovery.vault.config.v2.VaultConfigHttpClientV2.class)
@BootstrapContextCompatible
public interface VaultConfigHttpClientV2Fixed extends VaultConfigHttpClient<VaultResponseV2> {
...
}
@Introspected
public class VaultErrorV2 {
protected List<String> errors;
@JsonCreator
@Internal
public VaultErrorV2(@JsonProperty("errors") final List<String> errors) {
this.errors = errors;
}
public List<String> getErrors() {
return errors;
}
}
I'll try to create a small project to reproduce it
No response
3.9.1
Spring Cloud Configuration supports a property called name inside spring.cloud.config configuration, Micronaut does not. This configuration is interesting because sometimes the configuration file name differs from project name. Besides that, Spring Cloud Config supports a list of file names, like file1, file2, file3
. This is useful when you share some configuration files between microservices, like logging configurations for example.
Read the file name from spring.cloud.config.name if it is set, otherwise read the name from micronaut.application.name
Read the file name from micronaut.application.name
GIVEN an application with both netty and gRPC server
WHEN application start
THEN both server are registered as service
WHEN application stop
THEN both services are deregistered
The 1st server (netty) only is deregistered, the seconde one (gRPC) is on timeout
2023-06-28 15:39:46,059 INFO [main ] [GrpcEmbeddedServerListener.java] - GRPC started on port 9380 - [] - []
2023-06-28 15:39:46,062 INFO [main ] [Micronaut.java] - Startup completed in 1538ms. Server Running: http://localhost:9381 - [] - []
2023-06-28 15:39:46,092 INFO [default-nioEventLoopGroup-3-2] [DiscoveryServiceAutoRegistration.java] - Registered service [my-applicationr-grpc] with Consul - [] - []
2023-06-28 15:39:46,094 INFO [default-nioEventLoopGroup-3-3] [DiscoveryServiceAutoRegistration.java] - Registered service [my-application] with Consul - [] - []
Disconnected from the target VM, address: '127.0.0.1:51820', transport: 'socket'
2023-06-28 15:39:49,621 INFO [Thread-4 ] [Micronaut.java] - Embedded Application shutting down - [] - []
2023-06-28 15:39:49,651 INFO [Thread-4 ] [DiscoveryServiceAutoRegistration.java] - De-registered service [generic-data-provider] with Consul - [] - []
2023-06-28 15:39:49,652 INFO [Thread-4 ] [ApplicationLifeCycleHook.java] - Cooling down - [] - []
2023-06-28 15:39:49,652 INFO [Thread-4 ] [ApplicationLifeCycleHook.java] - Cooling down - [] - []
2023-06-28 15:39:49,656 INFO [ForkJoinPool.commonPool-worker-4] [ConsulConfigurationsWatchesHook.java] - All watches closed - [] - []
2023-06-28 15:39:49,656 INFO [ForkJoinPool.commonPool-worker-4] [ConsulConfigurationsWatchesHook.java] - All watches closed - [] - []
2023-06-28 15:39:55,785 WARN [parallel-7] [AbstractChannel.java:490] - Force-closing a channel whose registration task was not accepted by an event loop: [id: 0xd7b3aa4c] - [] - [] -
java.util.concurrent.RejectedExecutionException: event executor terminated
at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:934)
at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:351)
at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:344)
at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:836)
at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:827)
at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:817)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register(AbstractChannel.java:483)
at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:89)
at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:83)
at io.netty.channel.MultithreadEventLoopGroup.register(MultithreadEventLoopGroup.java:86)
at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:323)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:155)
at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:139)
at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:123)
at io.micronaut.http.client.netty.ConnectionManager.doConnect(ConnectionManager.java:419)
at io.micronaut.http.client.netty.ConnectionManager.lambda$connectForExchange$8(ConnectionManager.java:487)
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:58)
at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
at io.micronaut.configuration.metrics.binder.web.WebMetricsPublisher.subscribe(WebMetricsPublisher.java:151)
at reactor.core.publisher.Flux.subscribe(Flux.java:8660)
at reactor.core.publisher.FluxSwitchMapNoPrefetch$SwitchMapMain.subscribeInner(FluxSwitchMapNoPrefetch.java:218)
at reactor.core.publisher.FluxSwitchMapNoPrefetch$SwitchMapMain.onNext(FluxSwitchMapNoPrefetch.java:164)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
at reactor.core.publisher.MonoCallable$MonoCallableSubscription.request(MonoCallable.java:156)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171)
at reactor.core.publisher.FluxSwitchMapNoPrefetch$SwitchMapMain.onSubscribe(FluxSwitchMapNoPrefetch.java:147)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:96)
at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:48)
at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
at reactor.core.publisher.FluxDelaySubscription.accept(FluxDelaySubscription.java:59)
at reactor.core.publisher.FluxDelaySubscription.accept(FluxDelaySubscription.java:36)
at reactor.core.publisher.FluxDelaySubscription$DelaySubscriptionOtherSubscriber.onNext(FluxDelaySubscription.java:131)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.propagateDelay(MonoDelay.java:271)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.run(MonoDelay.java:286)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
... (lot of the same error)
2023-06-28 15:40:45,898 ERROR [scheduled-executor-thread-4] [DefaultPromise.java:864] - Failed to submit a listener notification task. Event loop shut down? - [] - [] -
java.util.concurrent.RejectedExecutionException: event executor terminated
at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:934)
at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:351)
at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:344)
at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:836)
at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:827)
at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:817)
at io.netty.util.concurrent.DefaultPromise.safeExecute(DefaultPromise.java:862)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:500)
at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:185)
at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95)
at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30)
at io.micronaut.http.client.netty.ConnectionManager.addInstrumentedListener(ConnectionManager.java:905)
at io.micronaut.http.client.netty.ConnectionManager.lambda$connectForExchange$8(ConnectionManager.java:488)
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:58)
at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
at io.micronaut.configuration.metrics.binder.web.WebMetricsPublisher.subscribe(WebMetricsPublisher.java:151)
at reactor.core.publisher.Flux.subscribe(Flux.java:8660)
at reactor.core.publisher.FluxSwitchMapNoPrefetch$SwitchMapMain.subscribeInner(FluxSwitchMapNoPrefetch.java:218)
at reactor.core.publisher.FluxSwitchMapNoPrefetch$SwitchMapMain.onNext(FluxSwitchMapNoPrefetch.java:164)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
at reactor.core.publisher.MonoCallable$MonoCallableSubscription.request(MonoCallable.java:156)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171)
at reactor.core.publisher.FluxSwitchMapNoPrefetch$SwitchMapMain.onSubscribe(FluxSwitchMapNoPrefetch.java:147)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:96)
at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:48)
at reactor.core.publisher.Flux.subscribe(Flux.java:8660)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:426)
at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:272)
at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:230)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:371)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:165)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:87)
at reactor.core.publisher.Mono.subscribe(Mono.java:4444)
at io.micronaut.management.health.monitor.HealthMonitorTask.monitor(HealthMonitorTask.java:98)
at io.micronaut.management.health.monitor.$HealthMonitorTask$Definition$Exec.dispatch(Unknown Source)
at io.micronaut.context.AbstractExecutableMethodsDefinition$DispatchedExecutableMethod.invoke(AbstractExecutableMethodsDefinition.java:371)
at io.micronaut.inject.DelegatingExecutableMethod.invoke(DelegatingExecutableMethod.java:76)
at io.micronaut.scheduling.processor.ScheduledMethodProcessor.lambda$process$5(ScheduledMethodProcessor.java:127)
at io.micrometer.core.instrument.composite.CompositeTimer.record(CompositeTimer.java:141)
at io.micrometer.core.instrument.Timer.lambda$wrap$0(Timer.java:196)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.runAndReset$$$capture(FutureTask.java:305)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
2023-06-28 15:40:45,904 ERROR [ForkJoinPool.commonPool-worker-4] [HealthMonitorTask.java:116] - Health monitor check failed with exception: Unable to start GRPC server: Failed to bind to address 0.0.0.0/0.0.0.0:9380 - [] - [] -
io.micronaut.runtime.exceptions.ApplicationStartupException: Unable to start GRPC server: Failed to bind to address 0.0.0.0/0.0.0.0:9380
at io.micronaut.grpc.server.GrpcEmbeddedServer.start(GrpcEmbeddedServer.java:194)
at io.micronaut.grpc.server.GrpcEmbeddedServer.getPort(GrpcEmbeddedServer.java:130)
at io.micronaut.grpc.server.health.GrpcServerHealthIndicator.getHealthResult(GrpcServerHealthIndicator.java:76)
at io.micronaut.core.async.publisher.AsyncSingleResultPublisher$ExecutorServiceSubscription.lambda$request$1(AsyncSingleResultPublisher.java:100)
at java.base/java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1375)
at java.base/java.util.concurrent.ForkJoinTask.doExec$$$capture(ForkJoinTask.java:373)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: java.io.IOException: Failed to bind to address 0.0.0.0/0.0.0.0:9380
at io.grpc.netty.NettyServer.start(NettyServer.java:328)
at io.grpc.internal.ServerImpl.start(ServerImpl.java:184)
at io.grpc.internal.ServerImpl.start(ServerImpl.java:93)
at io.micronaut.grpc.server.GrpcEmbeddedServer.start(GrpcEmbeddedServer.java:169)
... 10 common frames omitted
Caused by: java.net.BindException: Address already in use
at java.base/sun.nio.ch.Net.bind0(Native Method)
at java.base/sun.nio.ch.Net.bind(Net.java:555)
at java.base/sun.nio.ch.ServerSocketChannelImpl.netBind(ServerSocketChannelImpl.java:337)
at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:294)
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:141)
at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:562)
at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1334)
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:600)
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:579)
at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973)
at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:260)
at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:356)
at io.netty.util.concurrent.AbstractEventExecutor.runTask$$$capture(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
2023-06-28 15:40:49,805 ERROR [Thread-4] [DiscoveryServiceAutoRegistration.java:140] - Error occurred de-registering service [generic-data-provider-grpc] with Consul: Read Timeout - [] - [] -
io.micronaut.http.client.exceptions.ReadTimeoutException: Read Timeout
at io.micronaut.http.client.exceptions.ReadTimeoutException.(ReadTimeoutException.java:26)
at io.micronaut.http.client.netty.DefaultHttpClient.lambda$exchangeImpl$33(DefaultHttpClient.java:1097)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.handleTimeout(FluxTimeout.java:295)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.doTimeout(FluxTimeout.java:280)
at reactor.core.publisher.FluxTimeout$TimeoutTimeoutSubscriber.onNext(FluxTimeout.java:419)
at reactor.core.publisher.FluxOnErrorReturn$ReturnSubscriber.onNext(FluxOnErrorReturn.java:162)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.propagateDelay(MonoDelay.java:271)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.run(MonoDelay.java:286)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
Process finished with exit code 130 (interrupted by signal 2: SIGINT)
Note: suffixing grpc instance
consul:
client:
registration:
enabled: true
grpc:
server:
instance-id: ${micronaut.application.name}-grpc
No response
3.3.1
The log should state some line similar to:
Registered service [<project-name>] with Consul
Log shows error message after a while:
10:56:21.911 [nioEventLoopGroup-1-5] ERROR i.m.d.registration.AutoRegistration - Error occurred during service registration with Consul: Request decode failed: json: unknown field "ID"
io.micronaut.http.client.exceptions.HttpClientResponseException: Request decode failed: json: unknown field "ID"
at io.micronaut.http.client.DefaultHttpClient$10.channelRead0(DefaultHttpClient.java:1821)
at io.micronaut.http.client.DefaultHttpClient$10.channelRead0(DefaultHttpClient.java:1739)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:190)
at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:185)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:321)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:295)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
This issue seems to be triggered by a major change from 1.6 to 1.7 in Consul server, see https://www.consul.io/docs/upgrading/upgrade-specific#stricter-json-decoding
Using consul config (format: FILE), in ConsulConfigurationClient
class the resolveEnvironment
method should correctly determine the envName
variable allowing it to find the appropriate environment configuration.
Running the application with MICRONAUT_ENVIRONMENTS={ENV_NAME} should result in overwriting the default properties with those from the environment file.
I created the Pull Request #532.
Running the application with MICRONAUT_ENVIRONMENTS={ENV_NAME} with the existing code, the value of the envName variable will never be resolved correctly.
For example: if the name of the configuration file is my-service-prod.yaml (where prod is the name of the environment) and we provide fileName as a parameter (value is my-service-prod) instead of finalName (value is my-service[alpha]), then resolveEnvironment method will not be able to find environment.
The effect is that consul will overwrite the environment configuration with the standard configuration (e.g. my-service.yaml), i.e. the environment configuration will not be considered appropriate. If the same properties will be used, then result of that property will be from standard config file, not file with environment.
mongodb:
uri: mongodb://127.0.0.1:27017/standard
mongodb:
uri: mongodb://127.0.0.1:27017/prod
The environment will not be considered appropriate. If the same properties will be used, then result will be connecting to db named standard
instead of prod
.
No response
No response
3.8.7 - *
Now all the clients are in the same module. Even though the clients are conditionally loaded into the context, it is still lot of code that makes it into final application.
We need to build this modules with Java 21. See what @timyates did for micronaut-projects/micronaut-crac#209 and micronaut-projects/micronaut-serialization#594
To use consul I have this config:
micronaut:
application:
name: myProject
config-client:
enabled: true
This will collect all key values from Consul which are in application and in myProject directory. This is cool.
But it also will collect all keys from myProject2. Which we do not want. I can imagine that this can be a handy feature. That I can have generic keys which will merge into other projects. But we have over 50 projects and we run into names which happen to start the same.
What we do now to work around this is adding a / at the end of the name. Which is a problem as profiles will not work any more. Than it will look for myProject/,profile1 instead of myProject,profile
So a solution could be that there is an option like this
micronaut:
application:
name: myProject
config-client:
enabled: true
use-name-as-prefix: false
Which will not use the name as a prefix but only exact matches are allowed
v1.1.0.RC2.
ConsulClient currently doesn't provide any methods for releasing and acquiring locks and sessions.
https://www.consul.io/docs/internals/sessions.html
In addition to service discovery and distributed configuration management, sessions API is a very useful mechanism in Consul for implementing leader election or distributed semaphores. I had no previous experience working with Micronaut, or Consul, but I was able to come up with this class that gets the basic job done. Perhaps you could improve on it to add session management to the ConsulClient
.
bootstrap.yml
micronaut:
application:
name: demoApp
config-client:
enabled: true
application.yml
consul:
client:
registration:
enabled: true
check:
http: true
default-zone: "${CONSUL_HOST:localhost}:${CONSUL_PORT:8500}"
On Consul's web client you should see that the application is running with no problems.
Under health checks tab for the service, Consul's web client reports the following:
Get "http://localhost:8080/health": dial tcp 127.0.0.1:8080: connect: connection refused
I would also like to report that there are currently inconsistencies in what is stated in the guide with respect to Consul configuration and what https://micronaut.io/launch configures for service discovery with Consul. On the official Micronaut Discovery Client guide page, it is stated that implementation("io.micronaut:micronaut-discovery-client")
is needed to add the discovery client to the application but, checking what is generated with the launcher, the dependency is instead the following: implementation("io.micronaut.discovery:micronaut-discovery-client")
.
I have attached a picture that describes the problem.
Some time ago we faced with unstable tests. They become very often on CI and rare at dev machine. I found out that there is an issue with registration and deregistration in consul (I'll prove logs and traces bellow)
@Client(id = 'service-id', path = '/api/endpoint-path')
@MicronautTest
(in my case it's validation configuration test)@MicronautTest
in the first test app register and then deregister correctly and the second test goes OK
first test call deregister earlier than register and make consul inconsistent
the second fails with stacktrace
?[36m18:57:37.257?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.context.env.DefaultEnvironment?[0;39m - Established active environments: [test]
?[36m18:57:37.263?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.context.DefaultBeanContext?[0;39m - Reading Startup environment from bootstrap.yml
?[36m18:57:37.319?[0;39m ?[1;30m[default-nioEventLoopGroup-3-3]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP PUT to http://localhost:8500/v1/agent/service/register
?[36m18:57:37.355?[0;39m ?[1;30m[default-nioEventLoopGroup-4-2]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP GET to http://localhost:8500/v1/kv/config/myproject?recurse=true
?[36m18:57:37.356?[0;39m ?[1;30m[default-nioEventLoopGroup-4-1]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP GET to http://localhost:8500/v1/kv/config/application?recurse=true
?[36m18:57:37.359?[0;39m ?[1;30m[default-nioEventLoopGroup-4-2]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 404 from http://localhost:8500/v1/kv/config/myproject?recurse=true
?[36m18:57:37.367?[0;39m ?[1;30m[default-nioEventLoopGroup-4-1]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 404 from http://localhost:8500/v1/kv/config/application?recurse=true
?[36m18:57:37.371?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.discovery.client.config.DistributedPropertySourceLocator?[0;39m - Resolved 0 configuration sources from client: compositeConfigurationClient(consul)
?[36m18:57:37.400?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mcom.zaxxer.hikari.HikariDataSource?[0;39m - HikariPool-2 - Starting...
?[36m18:57:37.408?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mcom.zaxxer.hikari.HikariDataSource?[0;39m - HikariPool-2 - Start completed.
?[36m18:57:37.421?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.flyway.AbstractFlywayMigration?[0;39m - Cleaning schema for database with qualifier [default]
?[36m18:57:37.423?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.license.VersionPrinter?[0;39m - Flyway Community Edition 7.0.4 by Redgate
?[36m18:57:37.426?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.database.base.DatabaseType?[0;39m - Database: jdbc:postgresql://localhost:5432/jdkmn_main_test (PostgreSQL 12.4)
?[36m18:57:37.435?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbClean?[0;39m - Successfully dropped pre-schema database level objects (execution time 00:00.000s)
?[36m18:57:37.462?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbClean?[0;39m - Successfully cleaned schema "public" (execution time 00:00.026s)
?[36m18:57:37.463?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbClean?[0;39m - Successfully dropped post-schema database level objects (execution time 00:00.000s)
?[36m18:57:37.528?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.flyway.AbstractFlywayMigration?[0;39m - Running migrations for database with qualifier [default]
?[36m18:57:37.529?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.license.VersionPrinter?[0;39m - Flyway Community Edition 7.0.4 by Redgate
?[36m18:57:37.556?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbValidate?[0;39m - Successfully validated 2 migrations (execution time 00:00.013s)
?[36m18:57:37.569?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.schemahistory.JdbcTableSchemaHistory?[0;39m - Creating Schema History table "public"."flyway_schema_history" ...
?[36m18:57:37.588?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Current version of schema "public": << Empty Schema >>
?[36m18:57:37.593?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Migrating schema "public" to version "0.0 - create-testing-schema"
?[36m18:57:37.608?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Migrating schema "public" to version "1.0 - initial-ddl"
?[36m18:57:37.627?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Successfully applied 2 migrations to schema "public" (execution time 00:00.044s)
?[36m18:57:37.704?[0;39m ?[1;30m[default-nioEventLoopGroup-5-3]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP PUT to http://localhost:8500/v1/agent/service/register
?[36m18:57:37.714?[0;39m ?[1;30m[default-nioEventLoopGroup-5-3]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 200 from http://localhost:8500/v1/agent/service/register
?[36m18:57:37.715?[0;39m ?[1;30m[default-nioEventLoopGroup-5-3]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.discovery.registration.AutoRegistration?[0;39m - Registered service [myproject] with Consul
?[36m18:57:38.019?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.mongodb.driver.cluster?[0;39m - Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms'}
?[36m18:57:38.064?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.mongodb.driver.cluster?[0;39m - Cluster description not yet available. Waiting for 30000 ms before timing out
?[36m18:57:38.102?[0;39m ?[1;30m[cluster-ClusterId{value='606e00a25e8b1707517304df', description='null'}-localhost:27017]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.mongodb.driver.connection?[0;39m - Opened connection [connectionId{localValue:1, serverValue:22}] to localhost:27017
?[36m18:57:38.102?[0;39m ?[1;30m[cluster-rtt-ClusterId{value='606e00a25e8b1707517304df', description='null'}-localhost:27017]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.mongodb.driver.connection?[0;39m - Opened connection [connectionId{localValue:2, serverValue:23}] to localhost:27017
?[36m18:57:38.116?[0;39m ?[1;30m[cluster-ClusterId{value='606e00a25e8b1707517304df', description='null'}-localhost:27017]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.mongodb.driver.cluster?[0;39m - Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=REPLICA_SET_PRIMARY, state=CONNECTED, ok=true, minWireVersion=0, maxWireVersion=8, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=31479707, setName='rs0', canonicalAddress=mongo:27017, hosts=[mongo:27017], passives=[mongo-repl1:27018, mongo-repl2:27019], arbiters=[], primary='mongo:27017', tagSet=TagSet{[]}, electionId=7fffffff0000000000000001, setVersion=1, topologyVersion=null, lastWriteDate=Wed Apr 07 18:57:31 UTC 2021, lastUpdateTimeNanos=894121323822}
?[36m18:57:38.264?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.mongodb.driver.connection?[0;39m - Opened connection [connectionId{localValue:3, serverValue:24}] to localhost:27017
?[36m18:57:38.530?[0;39m ?[1;30m[default-nioEventLoopGroup-5-4]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP GET to http://localhost:8500/v1/health/service/myproject?passing=false
?[36m18:57:38.538?[0;39m ?[1;30m[default-nioEventLoopGroup-5-4]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 200 from http://localhost:8500/v1/health/service/myproject?passing=false
?[36m18:57:38.654?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[1;31mERROR?[0;39m ?[35mio.micronaut.retry.intercept.RecoveryInterceptor?[0;39m - Type [myproject.NavigationFsControllerSpec$NavigationFsControllerClient$Intercepted] executed with error: Connect Error: Connection refused: localhost/127.0.0.1:28394
io.micronaut.http.client.exceptions.HttpClientException: Connect Error: Connection refused: localhost/127.0.0.1:28394
at io.micronaut.http.client.netty.DefaultHttpClient.lambda$null$34(DefaultHttpClient.java:1119)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578)
at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:571)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:550)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616)
at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:609)
at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:117)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:321)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:337)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:707)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:28394
Caused by: java.net.ConnectException: Connection refused
at java.base/sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:779)
at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:707)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:834)
What happens in consul
==> Found address '172.18.0.3' for interface 'eth0', setting bind option...
==> Starting Consul agent...
Version: '1.8.9'
Node ID: '34af0a18-a36b-e150-61c6-1b9fbb6abf99'
Node name: '0e17b5bd8380'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: false)
Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
Cluster Addr: 172.18.0.3 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
==> Log data will now stream in as it occurs:
2021-04-07T18:55:24.940Z [INFO] agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:34af0a18-a36b-e150-61c6-1b9fbb6abf99 Address:172.18.0.3:8300}]"
2021-04-07T18:55:24.940Z [INFO] agent.server.serf.wan: serf: EventMemberJoin: 0e17b5bd8380.dc1 172.18.0.3
2021-04-07T18:55:24.940Z [INFO] agent.server.serf.lan: serf: EventMemberJoin: 0e17b5bd8380 172.18.0.3
2021-04-07T18:55:24.941Z [INFO] agent.router: Initializing LAN area manager
2021-04-07T18:55:24.941Z [INFO] agent.server: Adding LAN server: server="0e17b5bd8380 (Addr: tcp/172.18.0.3:8300) (DC: dc1)"
2021-04-07T18:55:24.941Z [INFO] agent.server: Handled event for server in area: event=member-join server=0e17b5bd8380.dc1 area=wan
2021-04-07T18:55:24.941Z [INFO] agent: Started DNS server: address=0.0.0.0:8600 network=udp
2021-04-07T18:55:24.941Z [INFO] agent.server.raft: entering follower state: follower="Node at 172.18.0.3:8300 [Follower]" leader=
2021-04-07T18:55:24.941Z [INFO] agent: Started DNS server: address=0.0.0.0:8600 network=tcp
2021-04-07T18:55:24.942Z [INFO] agent: Started HTTP server: address=[::]:8500 network=tcp
2021-04-07T18:55:24.942Z [INFO] agent: Started gRPC server: address=[::]:8502 network=tcp
2021-04-07T18:55:24.942Z [INFO] agent: started state syncer
==> Consul agent running!
2021-04-07T18:55:24.981Z [WARN] agent.server.raft: heartbeat timeout reached, starting election: last-leader=
2021-04-07T18:55:24.982Z [INFO] agent.server.raft: entering candidate state: node="Node at 172.18.0.3:8300 [Candidate]" term=2
2021-04-07T18:55:24.982Z [DEBUG] agent.server.raft: votes: needed=1
2021-04-07T18:55:24.982Z [DEBUG] agent.server.raft: vote granted: from=34af0a18-a36b-e150-61c6-1b9fbb6abf99 term=2 tally=1
2021-04-07T18:55:24.982Z [INFO] agent.server.raft: election won: tally=1
2021-04-07T18:55:24.982Z [INFO] agent.server.raft: entering leader state: leader="Node at 172.18.0.3:8300 [Leader]"
2021-04-07T18:55:24.982Z [INFO] agent.server: cluster leadership acquired
2021-04-07T18:55:24.982Z [DEBUG] agent.server: Cannot upgrade to new ACLs: leaderMode=0 mode=0 found=true leader=172.18.0.3:8300
2021-04-07T18:55:24.982Z [INFO] agent.server: New leader elected: payload=0e17b5bd8380
2021-04-07T18:55:24.982Z [INFO] agent.leader: started routine: routine="federation state anti-entropy"
2021-04-07T18:55:24.983Z [INFO] agent.leader: started routine: routine="federation state pruning"
2021-04-07T18:55:24.983Z [DEBUG] connect.ca.consul: consul CA provider configured: id=07:80:c8:de:f6:41:86:29:8f:9c:b8:17:d6:48:c2:d5:c5:5c:7f:0c:03:f7:cf:97:5a:a7:c1:68:aa:23:ae:81 is_primary=true
2021-04-07T18:55:24.989Z [INFO] agent.server.connect: initialized primary datacenter CA with provider: provider=consul
2021-04-07T18:55:24.990Z [INFO] agent.leader: started routine: routine="intermediate cert renew watch"
2021-04-07T18:55:24.990Z [INFO] agent.leader: started routine: routine="CA root pruning"
2021-04-07T18:55:24.990Z [DEBUG] agent.server: Skipping self join check for node since the cluster is too small: node=0e17b5bd8380
2021-04-07T18:55:24.990Z [INFO] agent.server: member joined, marking health alive: member=0e17b5bd8380
2021-04-07T18:55:25.013Z [INFO] agent.server: federation state anti-entropy synced
2021-04-07T18:55:25.073Z [DEBUG] agent: Skipping remote check since it is managed automatically: check=serfHealth
2021-04-07T18:55:25.073Z [INFO] agent: Synced node info
2021-04-07T18:55:26.407Z [DEBUG] agent: Skipping remote check since it is managed automatically: check=serfHealth
2021-04-07T18:55:26.407Z [DEBUG] agent: Node info in sync
2021-04-07T18:55:26.407Z [DEBUG] agent: Node info in sync
2021-04-07T18:56:24.982Z [DEBUG] agent.server: Skipping self join check for node since the cluster is too small: node=0e17b5bd8380
2021-04-07T18:56:33.857Z [DEBUG] agent: Skipping remote check since it is managed automatically: check=serfHealth
2021-04-07T18:56:33.857Z [DEBUG] agent: Node info in sync
2021-04-07T18:57:24.941Z [DEBUG] agent.router.manager: Rebalanced servers, new active server: number_of_servers=1 active_server="0e17b5bd8380.dc1 (Addr: tcp/172.18.0.3:8300) (DC: dc1)"
2021-04-07T18:57:24.941Z [DEBUG] agent.router.manager: Rebalanced servers, new active server: number_of_servers=1 active_server="0e17b5bd8380 (Addr: tcp/172.18.0.3:8300) (DC: dc1)"
2021-04-07T18:57:24.982Z [DEBUG] agent.server: Skipping self join check for node since the cluster is too small: node=0e17b5bd8380
2021-04-07T18:57:34.982Z [DEBUG] agent.http: Request finished: method=GET url=/v1/kv/config/application?recurse=true from=172.18.0.1:35540 latency=88.79µs
2021-04-07T18:57:34.985Z [DEBUG] agent.http: Request finished: method=GET url=/v1/kv/config/myproject?recurse=true from=172.18.0.1:35536 latency=64.455µs
2021-04-07T18:57:37.177Z [WARN] agent: Failed to deregister service: service=myproject:28394 error="Service {"myproject:28394" {}} does not exist"
2021-04-07T18:57:37.177Z [DEBUG] agent: Node info in sync
2021-04-07T18:57:37.177Z [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/service/deregister/myproject%3A28394 from=172.18.0.1:35590 latency=647.099µs
2021-04-07T18:57:37.350Z [DEBUG] agent: Node info in sync
2021-04-07T18:57:37.350Z [INFO] agent: Synced service: service=myproject:28394
2021-04-07T18:57:37.350Z [DEBUG] agent: Check in sync: check=service:myproject:28394
2021-04-07T18:57:37.350Z [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/service/register from=172.18.0.1:35586 latency=3.44803ms
2021-04-07T18:57:37.350Z [DEBUG] agent: Node info in sync
2021-04-07T18:57:37.350Z [DEBUG] agent: Service in sync: service=myproject:28394
2021-04-07T18:57:37.350Z [DEBUG] agent: Check in sync: check=service:myproject:28394
2021-04-07T18:57:37.357Z [DEBUG] agent.http: Request finished: method=GET url=/v1/kv/config/myproject?recurse=true from=172.18.0.1:35598 latency=48.017µs
2021-04-07T18:57:37.360Z [DEBUG] agent.http: Request finished: method=GET url=/v1/kv/config/application?recurse=true from=172.18.0.1:35594 latency=60.014µs
You can see log
2021-04-07T18:57:37.177Z [WARN] agent: Failed to deregister service: service=myproject:28394 error="Service {"myproject:28394" {}} does not exist"
appears earlier than registration bellow. We use random port configuration so every test uses it's own port
my fast test looks like
@MicronautTest(application = TestingApplication)
class MicronautValidationSpec extends Specification {
@Inject Validator validator
void "dto is validated with validator"() {
//some code
}
def "hack for very fast register and deregister in consul" (){
when: "on CI it can leads to inconsistency in consult when all integration test takes several ms"
sleep(500)
then: 'deregister done correctly'
noExceptionThrown()
}
}
and this is it's log
?[36m18:57:33.077?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.context.env.DefaultEnvironment?[0;39m - Established active environments: [test]
?[36m18:57:33.102?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.context.env.DefaultEnvironment?[0;39m - Established active environments: [test]
?[36m18:57:33.134?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.context.DefaultBeanContext?[0;39m - Reading Startup environment from bootstrap.yml
?[36m18:57:34.925?[0;39m ?[1;30m[default-nioEventLoopGroup-1-2]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP GET to http://localhost:8500/v1/kv/config/jdkmn-main?recurse=true
?[36m18:57:34.927?[0;39m ?[1;30m[default-nioEventLoopGroup-1-1]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP GET to http://localhost:8500/v1/kv/config/application?recurse=true
?[36m18:57:34.991?[0;39m ?[1;30m[default-nioEventLoopGroup-1-2]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 404 from http://localhost:8500/v1/kv/config/jdkmn-main?recurse=true
?[36m18:57:34.993?[0;39m ?[1;30m[default-nioEventLoopGroup-1-1]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 404 from http://localhost:8500/v1/kv/config/application?recurse=true
?[36m18:57:35.004?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.discovery.client.config.DistributedPropertySourceLocator?[0;39m - Resolved 0 configuration sources from client: compositeConfigurationClient(consul)
?[36m18:57:35.519?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mcom.zaxxer.hikari.HikariDataSource?[0;39m - HikariPool-1 - Starting...
?[36m18:57:35.603?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mcom.zaxxer.hikari.HikariDataSource?[0;39m - HikariPool-1 - Start completed.
?[36m18:57:35.610?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.flyway.AbstractFlywayMigration?[0;39m - Cleaning schema for database with qualifier [default]
?[36m18:57:35.622?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.license.VersionPrinter?[0;39m - Flyway Community Edition 7.0.4 by Redgate
?[36m18:57:35.669?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.database.base.DatabaseType?[0;39m - Database: jdbc:postgresql://localhost:5432/myproject_test (PostgreSQL 12.4)
?[36m18:57:35.705?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbClean?[0;39m - Successfully dropped pre-schema database level objects (execution time 00:00.000s)
?[36m18:57:35.730?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbClean?[0;39m - Successfully cleaned schema "public" (execution time 00:00.022s)
?[36m18:57:35.731?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbClean?[0;39m - Successfully dropped post-schema database level objects (execution time 00:00.000s)
?[36m18:57:36.130?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.flyway.AbstractFlywayMigration?[0;39m - Running migrations for database with qualifier [default]
?[36m18:57:36.131?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.license.VersionPrinter?[0;39m - Flyway Community Edition 7.0.4 by Redgate
?[36m18:57:36.184?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbValidate?[0;39m - Successfully validated 2 migrations (execution time 00:00.029s)
?[36m18:57:36.196?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.schemahistory.JdbcTableSchemaHistory?[0;39m - Creating Schema History table "public"."flyway_schema_history" ...
?[36m18:57:36.232?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Current version of schema "public": << Empty Schema >>
?[36m18:57:36.238?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Migrating schema "public" to version "0.0 - create-testing-schema"
?[36m18:57:36.267?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Migrating schema "public" to version "1.0 - initial-ddl"
?[36m18:57:36.291?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Successfully applied 2 migrations to schema "public" (execution time 00:00.068s)
?[36m18:57:37.146?[0;39m ?[1;30m[default-nioEventLoopGroup-3-6]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP PUT to http://localhost:8500/v1/agent/service/deregister/jdkmn-main%3A28394
?[36m18:57:37.178?[0;39m ?[1;30m[default-nioEventLoopGroup-3-6]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 200 from http://localhost:8500/v1/agent/service/deregister/jdkmn-main%3A28394
?[36m18:57:37.180?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.discovery.registration.AutoRegistration?[0;39m - De-registered service [jdkmn-main] with Consul
?[36m18:57:37.213?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mcom.zaxxer.hikari.HikariDataSource?[0;39m - HikariPool-1 - Shutdown initiated...
?[36m18:57:37.244?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mcom.zaxxer.hikari.HikariDataSource?[0;39m - HikariPool-1 - Shutdown completed.
You can see that timing is odd in consul, looks like registering takes more time and deregistering ignores fails and during heartbeat (I think) all next tests can see wrong registration
How I create my clients inside test
@MicronautTest(application = TestingApplication, rollback = false, transactional = false)
class NavigationFsControllerSpec extends Specification {
@Inject NavigationFsControllerClient client
//tests
@Client(id = 'jmyproject', path = '/api/web/navigation')
static interface NavigationFsControllerClient extends NavigationFsEndpoints {}
}
Please follow the instructions in micronaut-projects/micronaut-core#5607 and update that core issue with the information related to the upgrade.
Micronaut Serialization may not support all the Jackson features used here, but it's worth trying
Original implementation from spring has ability to add properties for authorization like username
and password
Example bootstrap.yml
spring:
cloud:
config:
uri: https://myconfig.mycompany.com
username: user
password: secret
I tried to add the same properties to my micronaut bootstrap.yml
config but got fail
22:34:45.037 [main] DEBUG io.micronaut.discovery.client.config.DistributedPropertySourceLocator - Resolving configuration sources from client: compositeConfigurationClient(spring-cloud-config-client)
22:34:45.038 [main] DEBUG io.micronaut.discovery.spring.config.SpringCloudConfigurationClient - Spring Cloud Config Active: Optional[http://awesome-config-service:8888/awesome-micronaut-service]
22:34:45.040 [main] DEBUG io.micronaut.discovery.spring.config.SpringCloudConfigurationClient - Application Name: awesome-micronaut-service, Application Profiles: null, label: null
22:34:46.154 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: Error reading distributed configuration from Spring Cloud: Unauthorized
io.micronaut.context.exceptions.ConfigurationException: Error reading distributed configuration from Spring Cloud: Unauthorized
at io.micronaut.discovery.spring.config.SpringCloudConfigurationClient.lambda$getPropertySources$0(SpringCloudConfigurationClient.java:119)
at io.reactivex.internal.operators.flowable.FlowableOnErrorNext$OnErrorNextSubscriber.onError(FlowableOnErrorNext.java:103)
at io.micronaut.core.async.publisher.Publishers$1.doOnError(Publishers.java:216)
at io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onError(CompletionAwareSubscriber.java:63)
at io.reactivex.internal.util.HalfSerializer.onError(HalfSerializer.java:70)
at io.reactivex.internal.subscribers.StrictSubscriber.onError(StrictSubscriber.java:103)
at io.reactivex.internal.operators.flowable.FlowableSwitchMap$SwitchMapSubscriber.drain(FlowableSwitchMap.java:221)
at io.reactivex.internal.operators.flowable.FlowableSwitchMap$SwitchMapInnerSubscriber.onError(FlowableSwitchMap.java:403)
at io.reactivex.internal.operators.flowable.FlowableOnErrorNext$OnErrorNextSubscriber.onError(FlowableOnErrorNext.java:90)
at io.reactivex.internal.subscriptions.EmptySubscription.error(EmptySubscription.java:55)
at io.reactivex.internal.operators.flowable.FlowableError.subscribeActual(FlowableError.java:40)
at io.reactivex.Flowable.subscribe(Flowable.java:14918)
at io.reactivex.Flowable.subscribe(Flowable.java:14865)
at io.reactivex.internal.operators.flowable.FlowableOnErrorNext$OnErrorNextSubscriber.onError(FlowableOnErrorNext.java:115)
at io.reactivex.internal.operators.flowable.FlowableTimeoutTimed$TimeoutSubscriber.onError(FlowableTimeoutTimed.java:115)
at io.reactivex.internal.operators.flowable.FlowableCreate$BaseEmitter.error(FlowableCreate.java:292)
at io.reactivex.internal.operators.flowable.FlowableCreate$BaseEmitter.tryOnError(FlowableCreate.java:281)
at io.micronaut.http.client.netty.DefaultHttpClient$11.channelRead0(DefaultHttpClient.java:2051)
at io.micronaut.http.client.netty.DefaultHttpClient$11.channelRead0(DefaultHttpClient.java:1964)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:190)
at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:185)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:321)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:295)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: io.micronaut.http.client.exceptions.HttpClientResponseException: Unauthorized
at io.micronaut.http.client.netty.DefaultHttpClient$11.channelRead0(DefaultHttpClient.java:2046)
... 42 common frames omitted
I've checked SpringCloudConfigurationClient sources and I didn't find any username
, password
mention.
Micronaut HashiCorp Vault supports structure of kv engine where applications secrets starts from engine root
Directory | Description |
---|---|
/application | Configuration shared by all applications |
/[APPLICATION_NAME] | Application-specific configuration |
/application/[ENV_NAME] | Configuration shared by all applications for an active environment name |
/ | Application-specific configuration for an active environment name |
And there is no way to use secrets placed somewhere deeper in engine.
Creating secret engine for each project in companies with a lot of departments with a lot of projects will cause project hell in root of vault.
It would be great to add some optional property like vault.client.path-prefix
where you can put smth like [PROJECT_NAME]
or [GROUP_NAME]/[PROJECT_NAME]/[SUBPROJECT_NAME]
with any level of depth
Directory | Description |
---|---|
[PATH_PREFIX]/application | Configuration shared by all applications |
[PATH_PREFIX]/[APPLICATION_NAME] | Application-specific configuration |
[PATH_PREFIX]/application/[ENV_NAME] | Configuration shared by all applications for an active environment name |
[PATH_PREFIX]/ | Application-specific configuration for an active environment name |
This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.
These branches will be created by Renovate only once you click their checkbox below.
actions/download-artifact
, actions/upload-artifact
)These updates are awaiting their schedule. Click on a checkbox to get an update now.
These updates have all been created already. Click a checkbox below to force a retry/rebase of any.
.github/workflows/central-sync.yml
actions/checkout v4
gradle/wrapper-validation-action v2
actions/setup-java v4
.github/workflows/graalvm-dev.yml
actions/checkout v4
actions/checkout v4
.github/workflows/graalvm-latest.yml
actions/checkout v4
actions/checkout v4
.github/workflows/gradle.yml
actions/checkout v4
graalvm/setup-graalvm v1.2.1
gradle/gradle-build-action v3.2.1
mikepenz/action-junit-report v4
actions/upload-artifact v3.1.3@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
haya14busa/action-cond v1
.github/workflows/publish-snapshot.yml
actions/checkout v4
actions/cache v4
actions/setup-java v4
.github/workflows/release.yml
actions/checkout v4
gradle/wrapper-validation-action v2
actions/setup-java v4
actions/upload-artifact v3.1.3@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
actions/upload-artifact v3.1.3@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
actions/download-artifact v3.0.2@9bc31d5ccc31df68ecc42ccf4149144866c47d8a
slsa-framework/slsa-github-generator v1.10.0
actions/checkout v4.1.1@b4ffde65f46336ab88eb53be808477a3936bae11
actions/download-artifact v3.0.2@9bc31d5ccc31df68ecc42ccf4149144866c47d8a
softprops/action-gh-release v0.1.15@de2c0eb89ae2a093876385947365aca7b0e5f844
gradle.properties
settings.gradle
io.micronaut.build.shared.settings 6.7.0
build.gradle
buildSrc/build.gradle
buildSrc/src/main/groovy/io.micronaut.build.internal.discovery-client-base.gradle
buildSrc/src/main/groovy/io.micronaut.build.internal.discovery-client-module.gradle
buildSrc/src/main/groovy/io.micronaut.build.internal.discovery-client-tests-consul.gradle
buildSrc/src/main/groovy/io.micronaut.build.internal.discovery-client-tests.gradle
discovery-client/build.gradle
discovery-client-bom/build.gradle
discovery-client-tests/build.gradle
gradle/libs.versions.toml
io.micronaut:micronaut-core-bom 4.4.1
io.micronaut.reactor:micronaut-reactor-bom 3.3.0
io.micronaut.serde:micronaut-serde-bom 2.9.0
io.micronaut.test:micronaut-test-bom 4.3.0
io.micronaut.testresources:micronaut-test-resources-bom 2.4.0
io.micronaut.validation:micronaut-validation-bom 4.5.0
io.micronaut.docs:micronaut-docs-asciidoc-config-props 2.0.0
org.awaitility:awaitility 4.2.1
org.spockframework:spock-core 2.3-groovy-4.0
gradle/license.gradle
test-suite-consul-graal/build.gradle.kts
test-suite-consul-graal-jacksondatabind/build.gradle.kts
org.graalvm.buildtools.native 0.10.1
io.micronaut.library 4.3.6
io.micronaut.test-resources 4.3.6
test-suite-consul-graal-serde/build.gradle.kts
org.graalvm.buildtools.native 0.10.1
io.micronaut.library 4.3.6
io.micronaut.test-resources 4.3.6
gradle/wrapper/gradle-wrapper.properties
gradle 8.7
See example application for details.
If an application requires has both Service Discovery cache configuration and Caffeine cache configuration, it fails on DependencyInjectionException
since both DefaultCacheConfiguration
and DiscoveryClientCacheConfiguration
implement CacheConfiguration
.
Both Caffeine and Service Discovery cache are configured.
An exception gets thrown:
➜ micronaut-cache-configuration git:(main) ✗ ./gradlew run
> Task :run
10:30:03.763 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: Failed to inject value for parameter [cacheConfiguration] of class: io.micronaut.cache.caffeine.DefaultSyncCache
Message: Multiple possible bean candidates found: [io.micronaut.cache.caffeine.DefaultCacheConfiguration, io.micronaut.cache.discovery.DiscoveryClientCacheConfiguration]
Path Taken: new Service(ApplicationContext applicationContext,[DummyClient dummyClient]) --> new DummyClient$Intercepted(BeanContext beanContext,Qualifier qualifier,[Interceptor[] interceptors]) --> new CacheInterceptor([CacheManager cacheManager],CacheErrorHandler errorHandler,AsyncCacheErrorHandler asyncCacheErrorHandler,ExecutorService ioExecutor,BeanContext beanContext) --> new DefaultCacheManager([List caches],Provider dynamicCacheManager) --> new DefaultSyncCache([CacheConfiguration cacheConfiguration],ApplicationContext applicationContext,ConversionService conversionService)
io.micronaut.context.exceptions.DependencyInjectionException: Failed to inject value for parameter [cacheConfiguration] of class: io.micronaut.cache.caffeine.DefaultSyncCache
Message: Multiple possible bean candidates found: [io.micronaut.cache.caffeine.DefaultCacheConfiguration, io.micronaut.cache.discovery.DiscoveryClientCacheConfiguration]
Path Taken: new Service(ApplicationContext applicationContext,[DummyClient dummyClient]) --> new DummyClient$Intercepted(BeanContext beanContext,Qualifier qualifier,[Interceptor[] interceptors]) --> new CacheInterceptor([CacheManager cacheManager],CacheErrorHandler errorHandler,AsyncCacheErrorHandler asyncCacheErrorHandler,ExecutorService ioExecutor,BeanContext beanContext) --> new DefaultCacheManager([List caches],Provider dynamicCacheManager) --> new DefaultSyncCache([CacheConfiguration cacheConfiguration],ApplicationContext applicationContext,ConversionService conversionService)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1035)
at io.micronaut.cache.caffeine.$DefaultSyncCacheDefinition.build(Unknown Source)
at io.micronaut.context.BeanDefinitionDelegate.build(BeanDefinitionDelegate.java:143)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
at io.micronaut.context.DefaultBeanContext.addCandidateToList(DefaultBeanContext.java:2990)
at io.micronaut.context.DefaultBeanContext.getBeansOfTypeInternal(DefaultBeanContext.java:2891)
at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:1045)
at io.micronaut.context.AbstractBeanDefinition.lambda$getBeansOfTypeForConstructorArgument$9(AbstractBeanDefinition.java:1143)
at io.micronaut.context.AbstractBeanDefinition.resolveBeanWithGenericsFromConstructorArgument(AbstractBeanDefinition.java:1820)
at io.micronaut.context.AbstractBeanDefinition.getBeansOfTypeForConstructorArgument(AbstractBeanDefinition.java:1138)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:990)
at io.micronaut.cache.$DefaultCacheManagerDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:2647)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2633)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2305)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2279)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1245)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1013)
at io.micronaut.cache.interceptor.$CacheInterceptorDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
at io.micronaut.context.DefaultBeanContext.addCandidateToList(DefaultBeanContext.java:2990)
at io.micronaut.context.DefaultBeanContext.getBeansOfTypeInternal(DefaultBeanContext.java:2865)
at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:1045)
at io.micronaut.context.AbstractBeanDefinition.lambda$getBeansOfTypeForConstructorArgument$9(AbstractBeanDefinition.java:1143)
at io.micronaut.context.AbstractBeanDefinition.resolveBeanWithGenericsFromConstructorArgument(AbstractBeanDefinition.java:1820)
at io.micronaut.context.AbstractBeanDefinition.getBeansOfTypeForConstructorArgument(AbstractBeanDefinition.java:1138)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:987)
at example.micronaut.$DummyClient$InterceptedDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:2647)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2633)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2305)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2279)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1245)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1013)
at example.micronaut.$ServiceDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
at io.micronaut.context.DefaultBeanContext.addCandidateToList(DefaultBeanContext.java:2990)
at io.micronaut.context.DefaultBeanContext.getBeansOfTypeInternal(DefaultBeanContext.java:2865)
at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:754)
at io.micronaut.context.DefaultBeanContext.publishEvent(DefaultBeanContext.java:1288)
at io.micronaut.http.server.netty.NettyHttpServer.fireStartupEvents(NettyHttpServer.java:495)
at io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:341)
at io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:110)
at io.micronaut.runtime.Micronaut.lambda$start$2(Micronaut.java:70)
at java.base/java.util.Optional.ifPresent(Optional.java:183)
at io.micronaut.runtime.Micronaut.start(Micronaut.java:68)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:299)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:285)
at example.micronaut.Application.main(Application.groovy:11)
Caused by: io.micronaut.context.exceptions.NonUniqueBeanException: Multiple possible bean candidates found: [io.micronaut.cache.caffeine.DefaultCacheConfiguration, io.micronaut.cache.discovery.DiscoveryClientCacheConfiguration]
at io.micronaut.context.DefaultBeanContext.findConcreteCandidate(DefaultBeanContext.java:1987)
at io.micronaut.context.DefaultApplicationContext.findConcreteCandidate(DefaultApplicationContext.java:434)
at io.micronaut.context.DefaultBeanContext.lastChanceResolve(DefaultBeanContext.java:2624)
at io.micronaut.context.DefaultBeanContext.findConcreteCandidateNoCache(DefaultBeanContext.java:2535)
at io.micronaut.context.DefaultBeanContext.findConcreteCandidate(DefaultBeanContext.java:2478)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2259)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1245)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1013)
... 50 common frames omitted
> Task :run FAILED
I have a eureka micro-service whose service ID is in camelCaseForm, not kebab-case: TradingCenterService
Here is how a created a Client to consume this service:
@Client(id = "TradingCenterService")
public interface TradingCenterClient extends TradingCenterOperations {
@Get("/v1/quotaTotal/query")
Single<Result> callUserQuotaQuantity(@Body BaseUserCQQueryDto queryDto);
}
When it get called, it complained No available services for ID: trading-center-service
seems like it always hiphenate the serviceID, which in my case stops me from consuming services with camelCase serviceIDs.
Declaring a key-vault binding in the bootstrap.yml according to the documentation (https://docs.micronaut.io/latest/guide/#distributedConfigurationVault) should import keys provided in the vault into the application properties.
When declaring a key-vault in the bootstrap.yml according to the documentation (https://docs.micronaut.io/latest/guide/#distributedConfigurationVault), micronaut fails with the error
12:14:28.292 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: No bean of type [io.micronaut.http.client.loadbalance.DiscoveryClientLoadBalancerFactory] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).
Without even contacting the actual key-vault.
docker run -d --name dev-consul --rm -p 8500:8500 consul
docker run -d --name dev-server --rm --cap-add=IPC_LOCK -e 'VAULT_DEV_ROOT_TOKEN_ID=vault-token' -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:1234' -p 1234:1234 vault
Note: The code was created via web-start, but some additional configs (i.e. enabling discovery client) were added, as it seems necessary. Possibly the documentation needs updating, too.
https://github.com/0xSpell/keyvault
3.4.2
In the documentation, we can read
Within the /config directory Micronaut searches values within the following directories in order of precedence:
Directory | Description |
---|---|
/config/application | Configuration shared by all applications |
/config/application,prod | Configuration shared by all applications for the prod Environment |
/config/[APPLICATION_NAME] | Application-specific configuration, example /config/hello-world |
/config/[APPLICATION_NAME],prod | Application-specific configuration for an active Environment |
will should so have the order
The order applied instead is
if we have a look inside the code of ConsulConfigurationClient
for (LocalSource localSource: propertySources.values()) {
int priority;
if (localSource.environment != null) {
priority = envBasePriority + (activeNames.indexOf(localSource.environment) * 2);
} else {
priority = basePriority + 1;
}
if (localSource.appSpecific) {
priority++;
}
emitter.next(PropertySource.of(ConsulClient.SERVICE_ID + '-' + localSource.name, localSource.values, priority));
}
we can easily see that we have an incrementation of the priority in case of appSpecific so we have correctly precedence for appSpecific over application (with and without environment)
but nothing is done to have the priority appSpecific > application,env
Using a simple test:
private static class LocalSource {
private final boolean appSpecific;
private final String environment;
private final String name;
LocalSource(boolean appSpecific, String environment, String name) {
this.appSpecific = appSpecific;
this.environment = environment;
this.name = name;
}
@Override
public String toString() {
if (environment != null && environment.length() > 0) {
return "%s[%s]".formatted(name, environment);
}
return name;
}
}
@Test
void should_correctly_resolve_order_precedences() {
// given
int basePriority = EnvironmentPropertySource.POSITION + 100; // -100
int envBasePriority = basePriority + 50; // -50
List<String> activeNames = List.of("prod", "other");
var localSources = List.of(
new LocalSource(false, null, "application"),
new LocalSource(false, "other", "application"),
new LocalSource(false, "prod", "application"),
new LocalSource(true, null, "my-app"),
new LocalSource(true, "prod", "my-app"),
new LocalSource(true, "other", "my-app"));
// ACTUAL
// when
Map<String, Integer> priorities = new HashMap<>();
for (LocalSource localSource : localSources) {
int priority;
if (localSource.environment != null) {
priority = envBasePriority + (activeNames.indexOf(localSource.environment) * 2);
} else {
priority = basePriority + 1;
}
if (localSource.appSpecific) {
priority++;
}
priorities.put(localSource.toString(), priority);
}
// then
SoftAssertions.assertSoftly(softAssertions -> {
softAssertions.assertThat(priorities.get("application")).isEqualTo(-99); // -100 + 1
softAssertions.assertThat(priorities.get("my-app")).isEqualTo(-98); // (-100 + 1) + 1
softAssertions.assertThat(priorities.get("application[prod]")).isEqualTo(-50); // -50 + (0 * 2)
softAssertions.assertThat(priorities.get("my-app[prod]")).isEqualTo(-49); // (-50 + (0 * 2)) + 1
softAssertions.assertThat(priorities.get("application[other]")).isEqualTo(-48); // -50 + (1 * 2)
softAssertions.assertThat(priorities.get("my-app[other]")).isEqualTo(-47); // (-50 + (1 * 2)) + 1
// => we get a mixed order of application/my-app precedences, not very easy to know where to put configuration correctly without it being overridden
});
// EXPECTING
for (LocalSource localSource : localSources) {
int priority;
if (localSource.appSpecific) {
if (localSource.environment != null) {
priority = envBasePriority + ((activeNames.indexOf(localSource.environment) + 1) * 2);
} else {
priority = envBasePriority + 1;
}
} else {
if (localSource.environment != null) {
priority = basePriority + ((activeNames.indexOf(localSource.environment) + 1) * 2);
} else {
priority = basePriority + 1;
}
}
priorities.put(localSource.toString(), priority);
}
// expecting something more like
SoftAssertions.assertSoftly(softAssertions -> {
// 1s the global application, followed by the environment ordered as given in activeNames
softAssertions.assertThat(priorities.get("application")).isEqualTo(-99);
softAssertions.assertThat(priorities.get("application[prod]")).isEqualTo(-98);
softAssertions.assertThat(priorities.get("application[other]")).isEqualTo(-96);
// then the app specific, followed by the environment ordered as given in activeNames
softAssertions.assertThat(priorities.get("my-app")).isEqualTo(-49);
softAssertions.assertThat(priorities.get("my-app[prod]")).isEqualTo(-48);
softAssertions.assertThat(priorities.get("my-app[other]")).isEqualTo(-46);
});
}
No response
No response
3.4.3
I followed the directions on how to get a consul client, but I'm getting an exception:
Caused by: io.micronaut.http.client.exceptions.HttpClientResponseException: Client 'consul': Error decoding HTTP response body: No bean introspection available for type [class java.net.InetAddress]. Ensure the class is annotated with io.micronaut.core.annotation.Introspected
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.makeNormalBodyParseError(DefaultHttpClient.java:2254)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.forwardResponseToPromise(DefaultHttpClient.java:2184)
I'm almost positive this is related to #524 and #517 -
InetAddress bean injection failure with exception above
No response
No response
mn -V: Micronaut Version: 4.1.3
The same behavior that occurs when running the .jar of the application
The service does no report health check. The error occurs checking for both ttl and http
The error persists both in a local environment and in a kubernetes cluster.
3.5.0
The spring cloud config client should be able to read and deserialize the JSON response from config server into a ConfigServerResponse
instance. When this happens, a log entry similar to the one below can be seen:
Resolved XX configuration sources from client: compositeConfigurationClient(spring-cloud-config-client)
When running the docker-native
image, a io.micronaut.http.codec.CodecException
is thrown with cause Cannot construct instance of
io.micronaut.discovery.spring.config.client.ConfigServerResponse (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
.
Error starting Micronaut server: Error reading distributed configuration from Spring Cloud: Error decoding HTTP response body: Error decoding stream for type [class io.micronaut.discovery.spring.config.client.ConfigServerResponse]: Cannot construct instance of `io.micronaut.discovery.spring.config.client.ConfigServerResponse` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{"name":"some-service","profiles":["cloud,staging"],"label":null,"version":"649fa009bd06a9c69c2b5809f2a4bb0559017d6c","state":null,"propertySources":[{"name":"https://git.myorg.com/configuration.git/some-service-staging.yml","source":{"mongodb.uri":"mongodb://template:template@localhost:27017/template110","mongodb.database":"template110"}},{"name":"https://git.myorg.com/configuration.git/application-stag"[truncated 691 bytes]; line: 1, column: 2]
io.micronaut.context.exceptions.ConfigurationException: Error reading distributed configuration from Spring Cloud: Error decoding HTTP response body: Error decoding stream for type [class io.micronaut.discovery.spring.config.client.ConfigServerResponse]: Cannot construct instance of `io.micronaut.discovery.spring.config.client.ConfigServerResponse` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{"name":"some-service","profiles":["cloud,staging"],"label":null,"version":"649fa009bd06a9c69c2b5809f2a4bb0559017d6c","state":null,"propertySources":[{"name":"https://git.myorg.com/configuration.git/some-service-staging.yml","source":{"mongodb.uri":"mongodb://template:template@localhost:27017/template110","mongodb.database":"template110"}},{"name":"https://git.myorg.com/configuration.git/application-stag"[truncated 691 bytes]; line: 1, column: 2]
at io.micronaut.discovery.spring.config.SpringCloudConfigurationClient.lambda$getPropertySources$0(SpringCloudConfigurationClient.java:122)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:132)
at reactor.core.publisher.FluxSwitchMap$SwitchMapMain.checkTerminated(FluxSwitchMap.java:391)
at reactor.core.publisher.FluxSwitchMap$SwitchMapMain.drain(FluxSwitchMap.java:338)
at reactor.core.publisher.FluxSwitchMap$SwitchMapMain.innerError(FluxSwitchMap.java:424)
at reactor.core.publisher.FluxSwitchMap$SwitchMapInner.onError(FluxSwitchMap.java:517)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)
at reactor.core.publisher.Operators.error(Operators.java:198)
at reactor.core.publisher.FluxError.subscribe(FluxError.java:43)
at reactor.core.publisher.Flux.subscribe(Flux.java:8469)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onError(FluxTimeout.java:219)
at reactor.core.publisher.FluxCreate$BaseSink.error(FluxCreate.java:453)
at reactor.core.publisher.FluxCreate$SerializedFluxSink.drainLoop(FluxCreate.java:230)
at reactor.core.publisher.FluxCreate$SerializedFluxSink.drain(FluxCreate.java:206)
at reactor.core.publisher.FluxCreate$SerializedFluxSink.error(FluxCreate.java:182)
at io.micronaut.http.client.netty.DefaultHttpClient$11.channelReadInstrumented(DefaultHttpClient.java:2503)
at io.micronaut.http.client.netty.DefaultHttpClient$11.channelReadInstrumented(DefaultHttpClient.java:2334)
at io.micronaut.http.client.netty.DefaultHttpClient$SimpleChannelInboundHandlerInstrumented.channelRead0(DefaultHttpClient.java:3089)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:214)
at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:189)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:299)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:829)
at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:596)
at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
Suppressed: java.lang.Exception: #block terminated with an error
at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:99)
at reactor.core.publisher.Mono.block(Mono.java:1707)
at io.micronaut.discovery.client.config.DistributedPropertySourceLocator.findPropertySources(DistributedPropertySourceLocator.java:79)
at io.micronaut.context.DefaultApplicationContext$RuntimeConfiguredEnvironment.readPropertySourceList(DefaultApplicationContext.java:734)
at io.micronaut.context.env.DefaultEnvironment.readPropertySources(DefaultEnvironment.java:408)
at io.micronaut.context.env.DefaultEnvironment.start(DefaultEnvironment.java:270)
at io.micronaut.context.DefaultApplicationContext$RuntimeConfiguredEnvironment.start(DefaultApplicationContext.java:720)
at io.micronaut.context.DefaultApplicationContext$RuntimeConfiguredEnvironment.start(DefaultApplicationContext.java:689)
at io.micronaut.context.DefaultApplicationContext.startEnvironment(DefaultApplicationContext.java:230)
at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:182)
at io.micronaut.runtime.Micronaut.start(Micronaut.java:72)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:313)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:299)
at org.myorg.myapp.staging.Application.main(Application.java:10)
Caused by: io.micronaut.http.client.exceptions.HttpClientResponseException: Error decoding HTTP response body: Error decoding stream for type [class io.micronaut.discovery.spring.config.client.ConfigServerResponse]: Cannot construct instance of `io.micronaut.discovery.spring.config.client.ConfigServerResponse` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{"name":"some-service","profiles":["cloud,staging"],"label":null,"version":"649fa009bd06a9c69c2b5809f2a4bb0559017d6c","state":null,"propertySources":[{"name":"https://git.myorg.com/configuration.git/some-service-staging.yml","source":{"mongodb.uri":"mongodb://template:template@localhost:27017/template110","mongodb.database":"template110"}},{"name":"https://git.myorg.com/configuration.git/application-stag"[truncated 691 bytes]; line: 1, column: 2]
at io.micronaut.http.client.netty.DefaultHttpClient$11.channelReadInstrumented(DefaultHttpClient.java:2491)
... 45 common frames omitted
Caused by: io.micronaut.http.codec.CodecException: Error decoding stream for type [class io.micronaut.discovery.spring.config.client.ConfigServerResponse]: Cannot construct instance of `io.micronaut.discovery.spring.config.client.ConfigServerResponse` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{"name":"some-service","profiles":["cloud,staging"],"label":null,"version":"649fa009bd06a9c69c2b5809f2a4bb0559017d6c","state":null,"propertySources":[{"name":"https://git.myorg.com/configuration.git/some-service-staging.yml","source":{"mongodb.uri":"mongodb://template:template@localhost:27017/template110","mongodb.database":"template110"}},{"name":"https://git.myorg.com/configuration.git/application-stag"[truncated 691 bytes]; line: 1, column: 2]
at io.micronaut.json.codec.MapperMediaTypeCodec.decode(MapperMediaTypeCodec.java:192)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.convertByteBuf(FullNettyClientHttpResponse.java:279)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.lambda$getBody$1(FullNettyClientHttpResponse.java:217)
at java.util.HashMap.computeIfAbsent(HashMap.java:1134)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.getBody(FullNettyClientHttpResponse.java:191)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.<init>(FullNettyClientHttpResponse.java:110)
at io.micronaut.http.client.netty.DefaultHttpClient$11.channelReadInstrumented(DefaultHttpClient.java:2411)
... 45 common frames omitted
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `io.micronaut.discovery.spring.config.client.ConfigServerResponse` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (byte[])"{"name":"some-service","profiles":["cloud,staging"],"label":null,"version":"649fa009bd06a9c69c2b5809f2a4bb0559017d6c","state":null,"propertySources":[{"name":"https://git.myorg.com/configuration.git/some-service-staging.yml","source":{"mongodb.uri":"mongodb://template:template@localhost:27017/template110","mongodb.database":"template110"}},{"name":"https://git.myorg.com/configuration.git/application-stag"[truncated 691 bytes]; line: 1, column: 2]
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1764)
at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1209)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1415)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:362)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:195)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3643)
at io.micronaut.jackson.databind.JacksonDatabindMapper.readValue(JacksonDatabindMapper.java:119)
at io.micronaut.json.codec.MapperMediaTypeCodec.decode(MapperMediaTypeCodec.java:189)
... 51 common frames omitted
./gradlew clean dockerBuildNative
realbucksavage/mn-native-config-demo
3.4.1
Micronaut Version: 3.1.1
sdelamo@ig11 discovery-eureka % mn create-app example.micronaut.guidethreeoneone --features=discovery-eureka
| Application created at /Users/sdelamo/github/issues/discovery-eureka/guidethreeoneone
sdelamo@ig11 discovery-eureka % cd guidethreeoneone
sdelamo@ig11 guidethreeoneone % ./gradlew test
> Task :compileTestJava
Note: Creating bean classes for 1 type elements
> Task :test FAILED
GuidethreeoneoneTest > initializationError FAILED
io.micronaut.context.exceptions.BeanInstantiationException at DefaultBeanContext.java:2368
Caused by: java.lang.UnsupportedOperationException at NettyHttpServer.java:379
1 test completed, 1 failed
It seems like a regression. However, 3.0.3 does not behave correctly either.
Test never completes but it does not crashes.
% sdk use micronaut 3.0.3
Using micronaut version 3.0.3 in this shell.
sdelamo@ig11 discovery-eureka % mn --version
Micronaut Version: 3.0.3
sdelamo@ig11 discovery-eureka % mn create-app example.micronaut.guidethreezerothree --features=discovery-eureka
| Application created at /Users/sdelamo/github/issues/discovery-eureka/guidethreezerothree
sdelamo@ig11 discovery-eureka % cd guidethree
cd: no such file or directory: guidethree
sdelamo@ig11 discovery-eureka % cd guidethreezerothree
sdelamo@ig11 guidethreezerothree % ./gradlew test
> Task :compileTestJava
Note: Creating bean classes for 1 type elements
<===========--> 85% EXECUTING [57s]
> :test > 1 test completed
> :test > Executing test example.micronaut.GuidethreezerothreeTest
The app should register themself in the consul server
When i run the app , the app throw UnimplementedAdviceException
03:46:11.732 [main] ERROR i.m.d.registration.AutoRegistration - Error occurred during service registration with Consul: All possible Introduction advise exhausted and no implementation found for method: Publisher register(NewServiceEntry entry)
io.micronaut.aop.exceptions.UnimplementedAdviceException: All possible Introduction advise exhausted and no implementation found for method: Publisher register(NewServiceEntry entry)
at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:126)
at io.micronaut.aop.chain.AbstractInterceptorChain.proceed(AbstractInterceptorChain.java:171)
at io.micronaut.aop.chain.InterceptorChain.proceed(InterceptorChain.java:46)
at io.micronaut.aop.internal.intercepted.PublisherInterceptedMethod.interceptResultAsPublisher(PublisherInterceptedMethod.java:70)
at io.micronaut.aop.internal.intercepted.PublisherInterceptedMethod.interceptResult(PublisherInterceptedMethod.java:87)
at io.micronaut.aop.internal.intercepted.PublisherInterceptedMethod.interceptResult(PublisherInterceptedMethod.java:39)
at io.micronaut.retry.intercept.DefaultRetryInterceptor.retrySync(DefaultRetryInterceptor.java:228)
at io.micronaut.retry.intercept.DefaultRetryInterceptor.intercept(DefaultRetryInterceptor.java:129)
at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:137)
at io.micronaut.aop.internal.intercepted.PublisherInterceptedMethod.interceptResultAsPublisher(PublisherInterceptedMethod.java:65)
at io.micronaut.validation.ValidatingInterceptor.intercept(ValidatingInterceptor.java:129)
at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:137)
at io.micronaut.discovery.consul.client.v1.AbstractConsulClient$Intercepted.register(Unknown Source)
at io.micronaut.discovery.consul.registration.ConsulAutoRegistration.register(ConsulAutoRegistration.java:263)
at io.micronaut.discovery.registration.AutoRegistration.onApplicationEvent(AutoRegistration.java:58)
at io.micronaut.discovery.registration.AutoRegistration.onApplicationEvent(AutoRegistration.java:38)
at io.micronaut.context.event.ApplicationEventPublisherFactory.notifyEventListeners(ApplicationEventPublisherFactory.java:266)
at io.micronaut.context.event.ApplicationEventPublisherFactory$2.publishEvent(ApplicationEventPublisherFactory.java:226)
at io.micronaut.http.server.netty.discovery.NettyServiceDiscovery.onStart(NettyServiceDiscovery.java:51)
at io.micronaut.http.server.netty.discovery.$NettyServiceDiscovery$Definition$Exec.dispatch(Unknown Source)
at io.micronaut.context.AbstractExecutableMethodsDefinition$DispatchedExecutableMethod.invoke(AbstractExecutableMethodsDefinition.java:442)
at io.micronaut.context.DefaultBeanContext$BeanExecutionHandle.invoke(DefaultBeanContext.java:3858)
at io.micronaut.aop.chain.AdapterIntroduction.intercept(AdapterIntroduction.java:84)
at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:137)
at io.micronaut.http.server.netty.discovery.NettyServiceDiscovery$ApplicationEventListener$onStart1$Intercepted.onApplicationEvent(Unknown Source)
at io.micronaut.context.event.ApplicationEventPublisherFactory.notifyEventListeners(ApplicationEventPublisherFactory.java:266)
at io.micronaut.context.event.ApplicationEventPublisherFactory$2.publishEvent(ApplicationEventPublisherFactory.java:226)
at io.micronaut.http.server.netty.NettyHttpServer.fireStartupEvents(NettyHttpServer.java:603)
at io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:304)
at io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:104)
at io.micronaut.runtime.Micronaut.start(Micronaut.java:79)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:322)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:297)
This is my application.properties
micronaut.application.name=chatService
micronaut.application.instance.id=${random.shortuuid}
micronaut.server.port=8086
#consul
consul.client.defaultZone=${CONSUL_HOST:localhost}:${CONSUL_PORT:8500}
consul.client.registration.enabled=true
My dependencies
`
io.micronaut
micronaut-http-server-netty
compile
<dependency>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-websocket</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.kotlin</groupId>
<artifactId>micronaut-kotlin-runtime</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.serde</groupId>
<artifactId>micronaut-serde-jackson</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
<version>${kotlinVersion}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>${kotlinVersion}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-http-client</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.micronaut.test</groupId>
<artifactId>micronaut-test-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-reactor</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor.kotlin</groupId>
<artifactId>reactor-kotlin-extensions</artifactId>
</dependency>
<dependency>
<groupId>io.micronaut.redis</groupId>
<artifactId>micronaut-redis-lettuce</artifactId>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>${protoc.version}</version>
</dependency>
<dependency>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-mongodb</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-reactivestreams</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.micronaut.discovery</groupId>
<artifactId>micronaut-discovery-client</artifactId>
</dependency>
`
jdk : 17
kotlin version : 1.8.21
consul server version : 1.15.4
No response
4.0.1
Note : When i try to use spring boot with consul server with same configuration , is working fine .
Hi,
I tried to find information about HashiCorp Vault support and found:
https://docs.micronaut.io/latest/guide/index.html#distributedConfigurationVault
https://micronaut-projects.github.io/micronaut-discovery-client/latest/guide/configurationreference.html#io.micronaut.discovery.vault.config.VaultClientConfiguration
In configuration properties I do see that vault.client.secret-engine-name
is by default set to secret
so key value backend may be used. But what about dynamic database secrets described here? Are they supported? Does automatic rotation of database secret work in micronaut-discovery-client
? If yes can someone please share an example?
Thank you!
an active name like my-env
should result as a PropertySource
naming pattern is excluding it
No response
No response
No response
3.3.1
Migrate to new configuration ascidoc macro
Documentation on Retry states:
I see that ConsulOperations.readValues method has @retryable annotation:
@Get(uri = "/kv/{+key}?recurse=true{&dc}{&raw}{&seperator}", single = true)
@Retryable(
attempts = AbstractConsulClient.EXPR_CONSUL_CONFIG_RETRY_COUNT,
delay = AbstractConsulClient.EXPR_CONSUL_CONFIG_RETRY_DELAY
)
Publisher<List<KeyValue>> readValues(
String key,
@Nullable @QueryValue("dc") String datacenter,
@Nullable Boolean raw,
@Nullable String seperator);
This method is used in ConsulConfigurationClient to fetch configuration values from Consul so I assume that retry pattern should be used here (3 attempts by default). However if HTTP client error happened (for example, "Connection refused") retry is not invoked (and DefaultRetryInterceptor is not called). It doesn't happen either if I add explicit retry configuration in bootstrap.yml:
consul:
client:
config:
retry-count: 4
retry-delay: 10s
If an operation to fetch configuration values from Consul failed it should be retried
The operation to fetch configuration values from Consul is executed only once in any case.
Not failing
@SerdeImport(Inet4Address.class)
Java:
2022-12-07 22:44:12,338 [default-nioEventLoopGroup-1-2] WARN io.netty.channel.DefaultChannelPipeline:1152 - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.timeout.ReadTimeoutException: null
2022-12-07 22:44:18,369 [default-nioEventLoopGroup-1-3] WARN io.netty.channel.DefaultChannelPipeline:1152 - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.timeout.ReadTimeoutException: null
2022-12-07 22:44:27,373 [default-nioEventLoopGroup-1-4] WARN io.netty.channel.DefaultChannelPipeline:1152 - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.timeout.ReadTimeoutException: null
2022-12-07 22:44:29,368 [default-nioEventLoopGroup-1-5] ERROR io.micronaut.discovery.client.registration.DiscoveryServiceAutoRegistration$1:83 - Error occurred during service registration with Consul: Error encoding object [io.micronaut.discovery.consul.client.v1.NewServiceEntry@d3092a09] to JSON: No serializable introspection present for type Inet4Address. Consider adding Serdeable. Serializable annotate to type Inet4Address. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(Inet4Address.class) to enable serialization of this type.
io.micronaut.http.codec.CodecException: Error encoding object [io.micronaut.discovery.consul.client.v1.NewServiceEntry@d3092a09] to JSON: No serializable introspection present for type Inet4Address. Consider adding Serdeable. Serializable annotate to type Inet4Address. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(Inet4Address.class) to enable serialization of this type.
at io.micronaut.json.codec.MapperMediaTypeCodec.encode(MapperMediaTypeCodec.java:212)
at io.micronaut.json.codec.MapperMediaTypeCodec.encode(MapperMediaTypeCodec.java:258)
at io.micronaut.http.client.netty.DefaultHttpClient.lambda$buildNettyRequest$41(DefaultHttpClient.java:1340)
at java.base/java.util.Optional.map(Optional.java:260)
Consul:
2022-12-07T21:45:28.719Z [DEBUG] agent: Node info in sync
2022-12-07T21:45:44.485Z [ERROR] agent.http: Request error: method=PUT url="/v1/agent/service/deregister/users%3A773d43e0d4" from=10.0.2.100:54606 error="Unknown service ID \"users:773d43e0d4\". Ensure that the service ID is passed, not the service name."
2022-12-07T21:45:44.485Z [DEBUG] agent.http: Request finished: method=PUT url="/v1/agent/service/deregister/users%3A773d43e0d4" from=10.0.2.100:54606 latency="38.971µs"
@SerdeImport(Inet4Address.class)
Java:
2022-12-07 22:46:51,905 [default-nioEventLoopGroup-1-5] ERROR io.micronaut.discovery.client.registration.DiscoveryServiceAutoRegistration$1:83 - Error occurred during service registration with Consul: Request decode failed: json: cannot unmarshal object into Go struct field .Address of type string
io.micronaut.http.client.exceptions.HttpClientResponseException: Request decode failed: json: cannot unmarshal object into Go struct field .Address of type string
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.makeErrorFromRequestBody(DefaultHttpClient.java:2253)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.buildResponse(DefaultHttpClient.java:2215)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.buildResponse(DefaultHttpClient.java:2138)
at io.micronaut.http.client.netty.DefaultHttpClient$BaseHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2113)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2174)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2138)
at io.micronaut.http.client.netty.SimpleChannelInboundHandlerInstrumented.channelRead0(SimpleChannelInboundHandlerInstrumented.java:49)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:215)
at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:180)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:336)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:308)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:1589)
2022-12-07 22:46:51,915 [default-nioEventLoopGroup-1-5] INFO io.micronaut.discovery.client.registration.DiscoveryServiceAutoRegistration:136 - De-registered service [users] with Consul
Consul:
2022-12-07T21:46:12.221Z [DEBUG] agent.router.manager: Rebalanced servers, new active server: number_of_servers=1 active_server="9fb5babb1567.dc1 (Addr: tcp/127.0.0.1:8300) (DC: dc1)"
2022-12-07T21:46:24.874Z [ERROR] agent.http: Request error: method=PUT url=/v1/agent/service/register from=10.0.2.100:43834 error="Request decode failed: json: cannot unmarshal object into Go struct field .Address of type string"
2022-12-07T21:46:24.874Z [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/service/register from=10.0.2.100:43834 latency="118.011µs"
2022-12-07T21:46:30.888Z [ERROR] agent.http: Request error: method=PUT url=/v1/agent/service/register from=10.0.2.100:52772 error="Request decode failed: json: cannot unmarshal object into Go struct field .Address of type string"
2022-12-07T21:46:30.888Z [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/service/register from=10.0.2.100:52772 latency="136.531µs"
2022-12-07T21:46:39.893Z [ERROR] agent.http: Request error: method=PUT url=/v1/agent/service/register from=10.0.2.100:39200 error="Request decode failed: json: cannot unmarshal object into Go struct field .Address of type string"
2022-12-07T21:46:39.893Z [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/service/register from=10.0.2.100:39200 latency="140.581µs"
2022-12-07T21:46:51.900Z [ERROR] agent.http: Request error: method=PUT url=/v1/agent/service/register from=10.0.2.100:53236 error="Request decode failed: json: cannot unmarshal object into Go struct field .Address of type string"
2022-12-07T21:46:51.900Z [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/service/register from=10.0.2.100:53236 latency="108.231µs"
2022-12-07T21:46:51.914Z [ERROR] agent.http: Request error: method=PUT url="/v1/agent/service/deregister/users%3A79d3a09b97" from=10.0.2.100:53244 error="Unknown service ID \"users:79d3a09b97\". Ensure that the service ID is passed, not the service name."
2022-12-07T21:46:51.915Z [DEBUG] agent.http: Request finished: method=PUT url="/v1/agent/service/deregister/users%3A79d3a09b97" from=10.0.2.100:53244 latency="48.32µs"
Consul: 1.14.2 (Docker)
No response
3.7.4
After updating micronaut to the latest version 2.4.0. Getting an exception as CheckID does not have associated TTL
consul:
client:
defaultZone: ${CONSUL_HOST:localhost}:${CONSUL_PORT:8500}
registration:
enabled: true
Access any endpoint the error appears
Exeption
14:53:03.304 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 8865ms. Server Running: http://localhost:8080
14:53:03.947 [default-nioEventLoopGroup-1-2] INFO i.m.d.registration.AutoRegistration - Registered service [fete-bird-apigateway] with Consul
14:53:44.094 [default-nioEventLoopGroup-1-8] ERROR i.m.d.registration.AutoRegistration - Error reporting passing state to Consul: CheckID "service:fete-bird-apigateway:8080" does not have associated TTL
io.micronaut.http.client.exceptions.HttpClientResponseException: CheckID "service:fete-bird-apigateway:8080" does not have associated TTL
at io.micronaut.http.client.netty.DefaultHttpClient$12.channelReadInstrumented(DefaultHttpClient.java:2161)
at io.micronaut.http.client.netty.DefaultHttpClient$12.channelReadInstrumented(DefaultHttpClient.java:2076)
at io.micronaut.http.client.netty.DefaultHttpClient$SimpleChannelInboundHandlerInstrumented.channelRead0(DefaultHttpClient.java:2776)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:193)
at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:183)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:832)
I am trying to mount this example on a kubernetes cluster 'https://guides.micronaut.io/latest/micronaut-microservices-services-discover-consul-gradle-kotlin.html'. Try to mount the 'bookcatalogue' service on the cluster first, do the configuration with the consul server. Fortunately, the service registers correctly, but after a few seconds the health check fails. as seen in the following image:
The problem does not occur when I run the application locally or even when I use docker-compose.
The logs of the kubernetes cluster of the 'bookcatalogue' service are:
�[36m17:30:46.437�[0;39m �[1;30m[main]�[0;39m �[34mINFO �[0;39m �[35mi.m.context.env.DefaultEnvironment�[0;39m - Established active environments: [k8s, cloud]
�[36m17:30:46.447�[0;39m �[1;30m[main]�[0;39m �[34mINFO �[0;39m �[35mi.m.context.env.DefaultEnvironment�[0;39m - Established active environments: [k8s, cloud]
�[36m17:30:46.650�[0;39m �[1;30m[main]�[0;39m �[34mINFO �[0;39m �[35mi.m.context.DefaultBeanContext�[0;39m - Reading bootstrap environment configuration
�[36m17:30:55.257�[0;39m �[1;30m[main]�[0;39m �[34mINFO �[0;39m �[35mio.micronaut.runtime.Micronaut�[0;39m - Startup completed in 11295ms. Server Running: http://bookcatalogue-74f7958b5-5gp7d:8080
�[36m17:30:57.556�[0;39m �[1;30m[default-nioEventLoopGroup-1-2]�[0;39m �[34mINFO �[0;39m �[35mi.m.d.registration.AutoRegistration�[0;39m - Registered service [bookcatalogue] with Consul
In the consul-server logs I get the following:
2022-04-09T17:37:27.289Z [INFO] agent.http: Request cancelled: method=GET url=/v1/health/service/bookcatalogue?dc=dc1&index=3889 from=127.0.0.1:47192 error="context canceled"
2022-04-09T17:38:34.688Z [INFO] agent.http: Request cancelled: method=GET url=/v1/health/service/bookcatalogue?dc=dc1&index=3889 from=127.0.0.1:47262 error="context canceled"
I really don't know if I'm configuring consul wrong, this is my config file (I'm running consul with helm -> helm install -f config.yml consul hashicorp/consul --create-namespace -n consul
):
config.yml
global:
name: consul
datacenter: dc1
server:
replicas: 1
securityContext:
runAsNonRoot: false
runAsGroup: 0
runAsUser: 0
fsGroup: 0
ui:
enabled: true
service:
type: 'NodePort'
connectInject:
enabled: true
controller:
enabled: true
dns:
enabled: true
enableRedirection: true
And my deployment file for the 'bookcatalogue' service is:
deployment.yml
kind: Service
apiVersion: v1
metadata:
name: bookcatalogue
spec:
selector:
app: bookcatalogue
ports:
- name: bookcatalogue
port: 80
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: bookcatalogue
spec:
selector:
matchLabels:
app: bookcatalogue
template:
metadata:
labels:
app: bookcatalogue
spec:
containers:
- name: bookcatalogue
image: deworg/bookcatalogue
env:
- name: CONSUL_HOST
value: "consul-server.consul"
- name: CONSUL_PORT
value: "8500"
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 8080
I appreciate any help.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.