小编sbi*_*biz的帖子

App Engine Java 8标准环境中的Servlet异步处理支持

我正在尝试使用GAE J8标准环境(无可扩展环境)的servlet 3.1中的异步处理支持.

基本上我有一个带有注释的servlet

@WebServlet(name = "MyServletName", urlPatterns = {"/dosomething"}, asyncSupported = true)

并获取AsyncContext的实例我调用(在doPost方法中)

final AsyncContext asyncContext = httpServletRequest.startAsync(httpServletRequest, httpServletResponse);

但异步处理支持似乎在GAE中存在一些问题

本地开发服务器说:

[INFO] GCLOUD: java.lang.IllegalStateException: !asyncSupported: _ah_DevAppServerModulesFilter
[INFO] GCLOUD:  at org.eclipse.jetty.server.Request.startAsync(Request.java:2262)
[INFO] GCLOUD:  at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:464)
[INFO] GCLOUD:  at <my-servlet>.doPost
[INFO] GCLOUD:  at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
[INFO] GCLOUD:  at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
[INFO] GCLOUD:  at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848)
[INFO] GCLOUD:  at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1772)
[INFO] GCLOUD:  at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
[INFO] GCLOUD:  at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
[INFO] GCLOUD:  at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:134)
[INFO] GCLOUD:  at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
[INFO] GCLOUD:  at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
[INFO] GCLOUD:  at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
[INFO] …
Run Code Online (Sandbox Code Playgroud)

google-app-engine asynchronous servlet-3.1

6
推荐指数
1
解决办法
579
查看次数

在App Maker中运行google.script.run:TypeError:无法读取未定义的属性'withLogger'

我正在开发App Maker应用程序,并从客户端脚本中调用服务器端函数(假设函数a和函数b),它们相互依赖。

客户端脚本中的第一个(本机)解决方案如下,该解决方案使用回调:

function doB(s) {
    google.script.run.withSuccessHandler(function(result) { // async workload
        console.log(result);
    }).withFailureHandler(function(error) {
        console.log(error);
    }).b(s);
}

function aThenB(s) {
    google.script.run.withSuccessHandler(function(result) { // async workload
        console.log(result);
        doB(result); // call b
    }).withFailureHandler(function(error) {
        console.log(error);
    }).a(s);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您必须先调用function c,然后再调用d等等,并获得这些相关函数的执行结果,这将变得非常笨拙。我阅读了这篇文章,其中描述了从回调到Promise的转换,例如:

function runnerToPromise(f) {
    var runArgs = Array.prototype.slice.call(arguments).slice(1);
    return new Promise(function(resolve, reject) { // executor
        google.script.run.withSuccessHandler(function(result) {
            resolve(result); // resolve promise
        }).withFailureHandler(function(error) {
            reject(error); // reject promise
        })[f].apply(this, runArgs); // async
    });
} …
Run Code Online (Sandbox Code Playgroud)

google-apps-script google-app-maker

5
推荐指数
1
解决办法
445
查看次数