没有可用于 quarkus 测试 amazon lambda 的虚拟通道
No virtual channel available for quarkus test amazon lambda
我创建了一个简单的 quarkus lambda rest 项目,如 documentation
中所述
mvn archetype:generate \
-DarchetypeGroupId=io.quarkus \
-DarchetypeArtifactId=quarkus-amazon-lambda-rest-archetype \
-DarchetypeVersion=2.2.1.Final
我只保留了以下资源的 JAXRS 内容:
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello jaxrs";
}
}
然后我尝试通过首先添加 lambda 测试依赖项来添加 here 所述的集成测试:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-test-amazon-lambda</artifactId>
<scope>test</scope>
</dependency>
然后我按照描述添加了 application.properties
,其中包含 quarkus.lambda.enable-polling-jvm-mode=true
。
最后,我添加了一个简单的测试用例:
@QuarkusTest
public class GreetingTest
{
@Test
public void testSimpleLambdaSuccess() {
InputStream inputStream = Objects.requireNonNull(
GreetingTest.class.getResourceAsStream("/request.json")
);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
LambdaClient.invoke(inputStream, outputStream);
}
}
request.json
文件是我使用 sam local generate-event apigateway aws-proxy
生成的事件,只是修复了路径以匹配我的资源(尽管这对以下问题没有影响)。
但是当我运行测试时,我总是得到以下错误:
2021-08-31 17:09:10,108 WARN [io.net.res.dns.DnsServerAddressStreamProviders] (vert.x-eventloop-thread-5) Can not find io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider in the classpath, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS.
2021-08-31 17:09:10,604 INFO [io.quarkus] (main) Quarkus 2.2.1.Final on JVM started in 1.867s. Listening on: http://localhost:8081
2021-08-31 17:09:10,604 INFO [io.quarkus] (main) Profile test activated.
2021-08-31 17:09:10,604 INFO [io.quarkus] (main) Installed features: [amazon-lambda, cdi, resteasy, security, smallrye-context-propagation]
2021-08-31 17:09:10,960 ERROR [qua.ama.lam.http] (Lambda Thread) Request Failure: java.lang.RuntimeException: No virtual channel available
at io.quarkus.netty.runtime.virtual.VirtualClientConnection.connect(VirtualClientConnection.java:113)
at io.quarkus.amazon.lambda.http.LambdaHttpHandler.nettyDispatch(LambdaHttpHandler.java:204)
at io.quarkus.amazon.lambda.http.LambdaHttpHandler.handleRequest(LambdaHttpHandler.java:61)
at io.quarkus.amazon.lambda.http.LambdaHttpHandler.handleRequest(LambdaHttpHandler.java:41)
at io.quarkus.amazon.lambda.runtime.AmazonLambdaRecorder.processRequest(AmazonLambdaRecorder.java:155)
at io.quarkus.amazon.lambda.runtime.AbstractLambdaPollLoop.run(AbstractLambdaPollLoop.java:80)
at java.base/java.lang.Thread.run(Thread.java:832)
{"statusCode":500,"multiValueHeaders":{"Content-Type":["application/json"]},"body":"{ \"message\": \"Internal Server Error\" }","isBase64Encoded":false}
我尝试通过堆栈跟踪进行一些调试,看起来实际上没有注册 netty 虚拟通道。
我是不是遗漏了初始化 netty 虚拟频道的东西,还是我做错了什么?任何帮助表示赞赏!
在挖掘 quarkus 资源后,我发现了一个类似的集成测试示例。将其与我的代码进行比较后,我发现 application.properties
:
有一处不同
quarkus.http.virtual=true
这个flag上还有一个documentation:
quarkus.http.virtual
If this is true then only a virtual channel will be set up for vertx web. We have this switch for testing purposes.
启用此标志后,一切开始按预期工作!从 quarkus 测试文档中引用此标志可能会有所帮助。
我创建了一个简单的 quarkus lambda rest 项目,如 documentation
中所述mvn archetype:generate \
-DarchetypeGroupId=io.quarkus \
-DarchetypeArtifactId=quarkus-amazon-lambda-rest-archetype \
-DarchetypeVersion=2.2.1.Final
我只保留了以下资源的 JAXRS 内容:
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello jaxrs";
}
}
然后我尝试通过首先添加 lambda 测试依赖项来添加 here 所述的集成测试:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-test-amazon-lambda</artifactId>
<scope>test</scope>
</dependency>
然后我按照描述添加了 application.properties
,其中包含 quarkus.lambda.enable-polling-jvm-mode=true
。
最后,我添加了一个简单的测试用例:
@QuarkusTest
public class GreetingTest
{
@Test
public void testSimpleLambdaSuccess() {
InputStream inputStream = Objects.requireNonNull(
GreetingTest.class.getResourceAsStream("/request.json")
);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
LambdaClient.invoke(inputStream, outputStream);
}
}
request.json
文件是我使用 sam local generate-event apigateway aws-proxy
生成的事件,只是修复了路径以匹配我的资源(尽管这对以下问题没有影响)。
但是当我运行测试时,我总是得到以下错误:
2021-08-31 17:09:10,108 WARN [io.net.res.dns.DnsServerAddressStreamProviders] (vert.x-eventloop-thread-5) Can not find io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider in the classpath, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS.
2021-08-31 17:09:10,604 INFO [io.quarkus] (main) Quarkus 2.2.1.Final on JVM started in 1.867s. Listening on: http://localhost:8081
2021-08-31 17:09:10,604 INFO [io.quarkus] (main) Profile test activated.
2021-08-31 17:09:10,604 INFO [io.quarkus] (main) Installed features: [amazon-lambda, cdi, resteasy, security, smallrye-context-propagation]
2021-08-31 17:09:10,960 ERROR [qua.ama.lam.http] (Lambda Thread) Request Failure: java.lang.RuntimeException: No virtual channel available
at io.quarkus.netty.runtime.virtual.VirtualClientConnection.connect(VirtualClientConnection.java:113)
at io.quarkus.amazon.lambda.http.LambdaHttpHandler.nettyDispatch(LambdaHttpHandler.java:204)
at io.quarkus.amazon.lambda.http.LambdaHttpHandler.handleRequest(LambdaHttpHandler.java:61)
at io.quarkus.amazon.lambda.http.LambdaHttpHandler.handleRequest(LambdaHttpHandler.java:41)
at io.quarkus.amazon.lambda.runtime.AmazonLambdaRecorder.processRequest(AmazonLambdaRecorder.java:155)
at io.quarkus.amazon.lambda.runtime.AbstractLambdaPollLoop.run(AbstractLambdaPollLoop.java:80)
at java.base/java.lang.Thread.run(Thread.java:832)
{"statusCode":500,"multiValueHeaders":{"Content-Type":["application/json"]},"body":"{ \"message\": \"Internal Server Error\" }","isBase64Encoded":false}
我尝试通过堆栈跟踪进行一些调试,看起来实际上没有注册 netty 虚拟通道。
我是不是遗漏了初始化 netty 虚拟频道的东西,还是我做错了什么?任何帮助表示赞赏!
在挖掘 quarkus 资源后,我发现了一个类似的集成测试示例。将其与我的代码进行比较后,我发现 application.properties
:
quarkus.http.virtual=true
这个flag上还有一个documentation:
quarkus.http.virtual
If this is true then only a virtual channel will be set up for vertx web. We have this switch for testing purposes.
启用此标志后,一切开始按预期工作!从 quarkus 测试文档中引用此标志可能会有所帮助。