请在2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面获取更多关于此工作方式的详细信息。

0
Clojure

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

套接字
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连接到Compute Engine服务器,而无需使用HTTP客户端。

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

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

Google App Engine Java SDK
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一起使用(例如,调用Executors.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 报告)
...