欢迎!有关此如何运作的更多信息,请参阅 关于 页面。
由于 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。