【问题标题】:Native Quarkus with AWS lambda does not build使用 AWS lambda 的本机 Quarkus 无法构建
【发布时间】:2020-04-19 05:12:30
【问题描述】:

我正在尝试使用 Quarkus 本机来构建我的 AWS Lambda。

我的设置是:

  • GraalVM 19.3.0
  • Java 11
  • Ubuntu

当我跑步时

docker run -v /home/mypc/dev/java/quarkus/alexa_swear/target/<my project>-1.0-SNAPSHOT-native-image-source-jar:/project:z --user 1000:1000 --rm quay.io/quarkus/ubi-quarkus-native-image:19.2.1 -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager --initialize-at-build-time= -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy\$BySpaceAndTime -jar <my project>-1.0-SNAPSHOT-runner.jar -J-Djava.util.concurrent.ForkJoinPool.common.parallelism=1 -H:FallbackThreshold=0 -H:+ReportExceptionStackTraces -H:+AddAllCharsets -H:EnableURLProtocols=http -H:-JNI --no-server -H:-UseServiceLoaderFeature -H:+StackTrace <my project>-1.0-SNAPSHOT-runner

我收到以下错误:

[alexa_swear-1.0-SNAPSHOT-runner:23]   (typeflow):  52,070.99 ms
[alexa_swear-1.0-SNAPSHOT-runner:23]    (objects):  25,961.57 ms
[alexa_swear-1.0-SNAPSHOT-runner:23]   (features):     803.41 ms
[alexa_swear-1.0-SNAPSHOT-runner:23]     analysis:  81,015.48 ms
[alexa_swear-1.0-SNAPSHOT-runner:23]     (clinit):   1,277.52 ms
[alexa_swear-1.0-SNAPSHOT-runner:23]     universe:   4,416.32 ms
Error: Unsupported features in 5 methods
Detailed message:
Call path from entry point to java.lang.Runtime.traceInstructions(boolean): 
    at java.lang.Runtime.traceInstructions(Runtime.java)
    at com.oracle.svm.reflect.Runtime_traceInstructions_91eaacf084b9d7e2af6dcc0028ee87fea9223b51_77.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.net.www.protocol.http.NTLMAuthenticationProxy.isTrustedSite(NTLMAuthenticationProxy.java:102)
    at sun.net.www.protocol.http.HttpURLConnection.getServerAuthentication(HttpURLConnection.java:2481)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1743)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1498)
    at io.quarkus.amazon.lambda.runtime.AmazonLambdaRecorder$2.run(AmazonLambdaRecorder.java:171)
    at java.lang.Thread.run(Thread.java:748)
    at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:460)
    at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193)
    at com.oracle.svm.core.code.IsolateEnterStub.PosixJavaThreads_pthreadStartRoutine_e1f4a8c0039f8337338252cd8734f63a79b5e3df(generated:0) ... 6 more
Error: Image build request failed with exit status 1

上面的错误被截断:同一个调用栈指向不同的不支持的方法,比如java.lang.Thread.stop

我的基本理解是io.quarkus.amazon.lambda.runtime.AmazonLambdaRecorder$2.run(AmazonLambdaRecorder.java是指一些不支持的方法,比如java.lang.Thread.resume()。 我也尝试过使用 Quarkus 19.2.1 失败。

以上命令由mvn clean install -Pnative -Dnative-image.docker-build=true -e执行。

【问题讨论】:

  • 我不确定这是一个 quarkus 问题。我认为这是一个 graalvm 问题。 graalvm 的The LIMITATIONS-page 将 JNI 列为“大部分支持”并且还引用了configuration page for JNI on substrateVM。也许你想看看。
  • 谢谢@Turing85,我去看看。附:看了一下,似乎完全支持线程,但是:We have nearly full support for java.lang.Thread. Only deprecated methods, such as Thread.stop(), are not supported.。所以现在我必须了解哪些引用了不推荐使用的线程方法。我不知何故走得更远。谢谢!
  • 你在使用 Quarkus lambda 扩展吗?
  • @geoand 谢谢,是的,我正在使用它。空白项目不会发生这种情况。此外,如果我在空白项目上添加相同的依赖项,它不会发生。现在,我正在逐步删除部分代码,以查看导致问题的原因。这非常耗时,所以任何建议都会有很大帮助。

标签: java aws-lambda java-native-interface alexa quarkus


【解决方案1】:

我终于找到了问题的原因。

在我的代码的非工作版本中,我使用了com.amazon.ask.AlexaSkill 的工厂,它以某种方式注入到入口点中,如下所示:

package io.mirko.lambda;

import com.amazon.ask.AlexaSkill;
import com.amazon.ask.Skills;
import com.amazon.ask.dispatcher.request.handler.HandlerInput;
import com.amazon.ask.dispatcher.request.handler.RequestHandler;
import com.amazon.ask.model.RequestEnvelope;
import com.amazon.ask.model.ResponseEnvelope;
import com.amazon.ask.request.interceptor.GenericRequestInterceptor;
import io.mirko.lambda.handlers.*;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.inject.Named;
import java.util.*;
import java.util.stream.StreamSupport;


public class SkillFactory {
    @Inject
    Instance<RequestHandler> handlers;

    @Produces
    @ApplicationScoped
    @Named
    public AlexaSkill<RequestEnvelope, ResponseEnvelope> createSkill() {
        return Skills.standard()
                .addRequestHandlers(handlers.stream().toArray(RequestHandler[]::new))
                .addRequestInterceptor(new GenericRequestInterceptor<HandlerInput>() {
                    @Override
                    public void process(HandlerInput handlerInput) {
                        System.out.format("Processing %s\n", handlerInput.getRequest());
                    }
                })
                // Add your skill id below
                //.withSkillId("")
                .build();
    }
}

...

public class SwearStreamLambda extends SkillStreamHandler {
    @Named("swearStream")
        public SwearStreamLambda() {
            //noinspection unchecked
            super((AlexaSkill<RequestEnvelope, ResponseEnvelope>)
                getBean(new ParameterizedTypeImpl(AlexaSkill.class, RequestEnvelope.class, ResponseEnvelope.class)));

通过删除 SkillFactory 类并将其逻辑移到 SwearStreamLambda 类中,编译顺利进行。

一些注意事项:

  1. 此问题与 CDI 无关,因为它在整个项目中大量使用
  2. 该问题与项目其他部分中存在的@Produces 注释无关
  3. 该问题与javax.enterprise.inject.Instance 无关,因为删除它并不能解决问题

总而言之,我找不到问题的根本原因,但我认为我的问题已解决

附:通过构建以下内容可以消除原始问题:

mvn clean install -Pnative -Dnative-image.docker-build=true -Dquarkus.native.enable-jni=true

请参阅https://github.com/quarkusio/quarkus/issues/6395#issuecomment-570755587

这并不能解决所有问题,因为必须配置 Quarkus 反射,但它解决了具体问题。

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多