请参与2024年Clojure状态调查,分享您的看法!调查链接

欢迎!请参阅关于页面了解更多关于如何使用本网站的信息。

0

我尝试在AWS Lambda中,使用Congitect的aws-api库和Java 8运行时检索S3中的一个文件,但一直不断出现问题

(def s3 (aws/client {:api :s3}))

(defn open-file []
  (aws/invoke s3 {:op :GetObject :request {:Bucket "test-bucket" :Key "filename.txt"}}))

当调用open-file时,我得到了以下错误

{
  ":cognitect.anomalies/category": {
    "sym": {
      "name": "fault",
      "namespace": "cognitect.anomalies"
    },
    "name": "fault",
    "namespace": "cognitect.anomalies"
  },
  ":cognitect.anomalies/message": "java.nio.ByteBuffer.flip()Ljava/nio/ByteBuffer;",
  ":cognitect.http-client/throwable": {
    "stackTrace": [
      {
        "methodName": "invokeStatic",
        "fileName": "http_client.clj",
        "lineNumber": 37,
        "className": "cognitect.http_client$empty_bbuf",
        "nativeMethod": false
      }
   ...

这是我的代码的问题吗?似乎在没有Lambda时可以正常工作。

1 答案

+1

被选中
 
最佳答案

我之前见过这个错误(不是在这个上下文中),并有模糊的记忆这可能是因为JDK的变化导致某些反射操作出现问题。Lambda使用的是哪个JDK版本?

 
我找到了一条关于此事的笔记——发生在使用Java 11进行AOT编译某物,然后运行在Java 8上时。这样的话听起来适用吗?
 
AWS仅支持Java 8,而我使用JDK 8编译了代码。
 
现在它正在工作。结果是代码本身没有问题,但是我使用了`fish`壳中的`jenv`,它并没有完全设置,所以我以为我正在用JRE 8编译,但实际上我使用的是JRE 11。
 
你能检查一下其中一个类文件吗?

    javap -verbose <path/to/the.class> | grep major

主要版本 52 是 Java 8,55 是 Java 11
...