请在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` shell中的`jenv`,它没有完全配置好,所以我觉得我是用JRE 8编译的,但实际上我用的是JRE 11。
你能检查一下某个类文件吗?

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

主版本号52代表Java 8,55代表Java 11
...