【发布时间】:2021-07-17 01:38:46
【问题描述】:
默认情况下,Micronaut 的处理程序是类 MicronautLambdaHandler。但是在 Micronaut 指南上它说
您将与之交互的主要 API 是 AbstractMicronautLambdaRuntime。一个抽象类,您可以扩展它来创建您的自定义运行时 mainClass。
所以我尝试创建自定义处理程序和运行时,基本上复制现有的MicronautLambdaHandler 和MicronautLambdaRuntime
自定义我的运行时
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?
【问题讨论】:
标签: micronaut graalvm-native-image micronaut-aws