简体   繁体   中英

Weird behaviour with Quarkus + GraalVM + URLConnection

I am testing the Quarkus capabilities for Travel Applications and I found a weird behaviour when I try to establish an URLConnection running in a GraalVM application based on Quarkus. If I run a Native application:

./target/getting-started-1.0.0-SNAPSHOT-runner

and I Call the REST endpoint:

curl 'http://localhost:8080/api/v1/covid-restrictions'

then I receive the following error:

2022-06-01 17:38:43,844 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-0) HTTP Request to /api/v1/covid-restrictions failed, error id: f6130b71-c9fb-4a67-a996-c58fba695117-1: com.amadeus.exceptions.NetworkException: [---]

But when I run the same application as a Jar, everything is fine.

java -jar target/quarkus-app/quarkus-run.jar

One example to see the error here:

Do I need to configure the Quarkus app in some way for GraalVM?

I share the whole StackTrace if it could help:

2022-06-01 17:38:43,844 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-0) HTTP Request to /api/v1/covid-restrictions failed, error id: f6130b71-c9fb-4a67-a996-c58fba695117-1: com.amadeus.exceptions.NetworkException: [---]
        at com.amadeus.HTTPClient.fetch(HTTPClient.java:372)
        at com.amadeus.HTTPClient.execute(HTTPClient.java:358)
        at com.amadeus.HTTPClient.unauthenticatedRequest(HTTPClient.java:253)
        at com.amadeus.client.AccessToken.fetchAccessToken(AccessToken.java:67)
        at com.amadeus.client.AccessToken.updateAccessToken(AccessToken.java:53)
        at com.amadeus.client.AccessToken.lazyUpdateAccessToken(AccessToken.java:47)
        at com.amadeus.client.AccessToken.getBearerToken(AccessToken.java:39)
        at com.amadeus.HTTPClient.request(HTTPClient.java:339)
        at com.amadeus.HTTPClient.get(HTTPClient.java:67)
        at com.amadeus.dutyOfCare.diseases.Covid19AreaReport.get(Covid19AreaReport.java:51)
        at org.acme.CovidResource.hello(CovidResource.java:27)
        at org.acme.CovidResource$quarkusrestinvoker$hello_a2fbfead069e804ef1bb0315d16c4dc5e7951978.invoke(Unknown Source)
        at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
        at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:7)
        at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:141)
        at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:548)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
        at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
        at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.lang.Thread.run(Thread.java:833)
        at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:704)
        at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)

Many thanks in advance.

Juan Antonio

As most APIs nowadays are, the Amadeus library is HTTPS only.
For Quarkus in native mode, you need to explicitly enable SSL in src/main/resources/application.properties (except for certain extensions, see the link below).

quarkus.ssl.native=true

See https://quarkus.io/guides/native-and-ssl

After adding this property you will get a different runtime error:

2022-06-02 00:45:25,381 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-0) HTTP Request to /api/v1/covid-restrictions failed, error id: 6d821ce1-23fd-4d88-8f63-992b6453830a-1: com.oracle.svm.core.jdk.UnsupportedFeatureError: Code that was considered unreachable by closed-world analysis was reached.

Try to register the following reflection classes ( DiseaseAreaReport and all inner classes ) as Amadeus will use GSON and therefore also Java reflection to apply the JSON String data to the DiseaseAreaReport POJO. https://quarkus.io/guides/writing-native-applications-tips#registering-for-reflection

package org.acme;

import io.quarkus.runtime.annotations.RegisterForReflection;

@RegisterForReflection(targets = {
        com.amadeus.Amadeus.class,
        com.amadeus.HTTPClient.class,
        com.amadeus.Params.class,
        com.amadeus.Response.class,
        com.amadeus.client.AccessToken.class,
        com.amadeus.dutyOfCare.diseases.Covid19AreaReport.class,
        com.amadeus.exceptions.ResponseException.class,
        // com.amadeus.resources.DiseaseAreaReport and all inner classes
        com.amadeus.resources.DiseaseAreaReport.class,
        com.amadeus.resources.DiseaseAreaReport.Area.class,
        com.amadeus.resources.DiseaseAreaReport.AreaAccessRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.AreaPolicy.class,
        com.amadeus.resources.DiseaseAreaReport.AreaRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.AreaVaccinated.class,
        com.amadeus.resources.DiseaseAreaReport.Border.class,
        com.amadeus.resources.DiseaseAreaReport.DatedInformation.class,
        com.amadeus.resources.DiseaseAreaReport.DatedQuarantineRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.DatedTracingApplicationRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.DeclarationDocuments.class,
        com.amadeus.resources.DiseaseAreaReport.DiseaseCase.class,
        com.amadeus.resources.DiseaseAreaReport.DiseaseInfection.class,
        com.amadeus.resources.DiseaseAreaReport.DiseaseTestingRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.DiseaseVaccination.class,
        com.amadeus.resources.DiseaseAreaReport.EntryRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.ExitRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.GeoCode.class,
        com.amadeus.resources.DiseaseAreaReport.Link.class,
        com.amadeus.resources.DiseaseAreaReport.MaskRestriction.class,
        com.amadeus.resources.DiseaseAreaReport.Sources.class,
        com.amadeus.resources.DiseaseAreaReport.Transportation.class,
        com.amadeus.resources.DiseaseAreaReport.ValidityPeriod.class,
        com.amadeus.resources.Resource.class
})
public class AmadeusReflection {

}

I hope this fixes this issue, if not dig deeper which classes or inner classes are missing to be registered for reflection with a debugger or following the stack trace.

PS your test shows the following warnings:

[WARNING] [io.quarkus.resteasy.reactive.server.deployment.QuarkusServerEndpointIndexer] Quarkus detected the use of JSON in JAX-RS method 'org.acme.CovidResource#hello' but no JSON extension has been added. Consider adding 'quarkus-resteasy-reactive-jackson' or 'quarkus-resteasy-reactive-jsonb'.
[WARNING] [io.quarkus.resteasy.reactive.server.deployment.QuarkusServerEndpointIndexer] Quarkus detected the use of JSON in JAX-RS method 'org.acme.ConfigResource#hello' but no JSON extension has been added. Consider adding 'quarkus-resteasy-reactive-jackson' or 'quarkus-resteasy-reactive-jsonb'.

Consider to add the RESTEasy Reactive Jackson extension in the pom.xml :

<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
</dependency>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM