2024 年 Clojure 状况调查! 中分享您的想法。

欢迎!有关此如何运作的更多信息,请参阅 关于 页面。

0
Clojure

由于 App Engine 现在支持套接字和线程,因此现在可以改进 App Engine 对 Clojure 的支持。

套接字
https://developers.google.com/appengine/docs/java/sockets/overview

线程
https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/ThreadManager

新的套接字 API 使用 java.net.Socket,因此它应该无需太多/任何修改就能正常工作。套接字 API 是一个重要的补充,因为它允许您从 App Engine 连接到计算引擎服务器,而不必使用 HTTP 客户端。

目前 Clojure 的代理和 future 在 App Engine 上不能工作,但新的 ThreadManager API 现在允许您执行短暂的生命周期线程;然而,您必须使用 ThreadManger API 来创建线程 - "您不能自己调用 new Thread() 或使用默认的线程工厂" 以及 "每个请求的限制是 50 个并发请求线程" - 因此,添加线程支持将需要构建选项和一些修改。

通过添加一个 Clojure 构建 App Engine 选项来实现 App Engine 上的代理支持,该选项包括 App Engine JDK 依赖项并将 App Engine ThreadManager 工厂注入到 jvm/clojure/lang/Agent.java 中。

Google App Engine SDK for Java
https://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Java

另请参阅 https://developers.google.com/appengine/docs/java/runtime#The_Sandbox ...

Java 应用可以创建一个新线程,但在创建该线程的方式上有一些限制。这些线程不能“生存”于创建它们的请求。(在后端服务器上,一个应用可以启动一个后台线程,可以“生存”于创建它的请求。)

应用可以...

实现 java.lang.Runnable;
通过调用 com.google.appengine.api.ThreadManager.currentRequestThreadFactory() 创建一个线程工厂;
调用工厂的 newRequestThread 方法,传入 Runnable,newRequestThread(runnable)
或使用由 com.google.appengine.api.ThreadManager.currentRequestThreadFactory() 返回的工厂对象与 ExecutorService(例如,callExecutors.newCachedThreadPool(factory))。

但是,您必须使用 ThreadManager 上的其中一个方法来创建线程。您不能自己调用 new Thread() 或使用默认的线程工厂。

应用可以对当前线程进行操作,例如 thread.interrupt()。

每个请求限制为 50 个并发请求线程。

App Engine JRE 白名单
https://developers.google.com/appengine/docs/java/jrewhitelist

有关当前 App Engine Magic README (https://github.com/gcv/appengine-magic)...

Google App Engine 维护一个允许的 Java 标准库类白名单。其他类会导致您的应用程序无法部署。例如包括线程和套接字。如果您在应用程序中使用这些类,它将无法运行。这意味着您不能使用 Clojure 的代理或未来。此外,如果您的依赖之一使用这些类,则您的应用程序也无法运行。例如,clojure.java.io(及其前身 clojure-contrib 中的 duck-streams)使用了被禁止的类 java.net.Socket。

1 答案

0
by
参考:https://clojure.atlassian.net/browse/CLJ-1223(由 alex+import 报告)
...