Micronaut Lambda 本机图像未读取自定义处理程序

时间:2021-07-17 01:38:46

标签: micronaut graalvm-native-image micronaut-aws

默认情况下,Micronaut 的处理程序是类 MicronautLambdaHandler。但是在 Micronaut 指南上它说

<块引用>

您将与之交互的主要 API 是 AbstractMicronautLambdaRuntime。一个抽象类,您可以对其进行扩展以创建自定义运行时 mainClass。

所以我尝试创建自定义处理程序和运行时,基本上是复制现有的 MicronautLambdaHandlerMicronautLambdaRuntime

自定义 MyRuntime

public class MyRuntime extends AbstractMicronautLambdaRuntime<AwsProxyRequest, AwsProxyResponse, AwsProxyRequest, AwsProxyResponse> {

    @Override
    protected RequestHandler<AwsProxyRequest, AwsProxyResponse> createRequestHandler(String... args) {
        try {
            return new MyHandler(createApplicationContextBuilderWithArgs(args));
        } catch (ContainerInitializationException e) {
            throw new ConfigurationException("Exception thrown instantiating MyHandler", e);
        }
    }

    public static void main(String[] args) {
        try {
            new MyRuntime().run(args);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

只返回 null 的自定义 MyHandler

@Introspected
public class MyHandler implements RequestHandler<AwsProxyRequest, AwsProxyResponse>,
        ApplicationContextProvider, Closeable {

    protected final MicronautLambdaContainerHandler handler;

    public MyHandler() throws ContainerInitializationException {
        this.handler = new MicronautLambdaContainerHandler();
    }

    public MyHandler(ApplicationContextBuilder applicationContextBuilder) throws ContainerInitializationException {
        this.handler = new MicronautLambdaContainerHandler(applicationContextBuilder);
    }

    public MyHandler(ApplicationContext applicationContext) throws ContainerInitializationException {
        this.handler = new MicronautLambdaContainerHandler(applicationContext);
    }

    @Override
    public AwsProxyResponse handleRequest(AwsProxyRequest input, Context context) {
        System.out.println("hello custom handler");
        System.out.println(context.getAwsRequestId());
        return null;
    }

    @Override
    public ApplicationContext getApplicationContext() {
        return this.handler.getApplicationContext();
    }

    @Override
    public void close() {
        this.getApplicationContext().close();
    }
}

然后在我的 Lambda 函数上,我将方法处理程序设置为 example.micronaut.MyHandler,将运行时设置为 Custom Runtime on Amazon Linux 2

在测试我的 Lambda 时,它不会读取我的自定义处理程序。它始终运行默认的 MicronautLambdaHandler

另外,奇怪的是,即使我将方法处理程序设置为诸如 this.is.not.a.handler 之类的随机词,它仍然默认运行 MicronautLambdaHandler

有没有办法按照指南的建议为 Micronaut Lambda 创建我的自定义处理程序作为本机映像?或者我真的仅限于使用默认的 MicronautLambdaHandler

1 个答案:

答案 0 :(得分:0)

能够让它发挥作用。 我需要明确地放置依赖项 implementation("io.micronaut.aws:micronaut-function-aws") implementation("io.micronaut.aws:micronaut-function-aws-custom-runtime")

我不明白的是,即使没有在 build.gradle 上指定,这些工件也已经存在于类路径中,这就是我从未放置它们的原因。