首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在AppEngine上使用Java执行器导致AccessControlException

在AppEngine上使用Java执行器导致AccessControlException
EN

Stack Overflow用户
提问于 2010-04-19 01:23:29
回答 2查看 2.9K关注 0票数 4

如何让java.util.concurrent.Executor或CompletionService在谷歌AppEngine上工作?类都是正式白名单,但是在尝试提交异步任务时,我会得到一个运行时安全错误。

代码:

代码语言:javascript
运行
复制
    // uses the async API but this factory makes it so that tasks really
    // happen sequentially
    Executor executor = java.util.concurrent.Executors.newSingleThreadExecutor();
    // wrap Executor in CompletionService
    CompletionService<String> completionService = 
        new ExecutorCompletionService<String>(executor);
    final SomeTask someTask = new SomeTask();
    // this line throws exception
    completionService.submit(new Callable<String>(){
        public String call() {
            return someTask.doNothing("blah");
        }
    });
    // alternately, send Runnable task directly to Executor,
    // which also throws an exception
    executor.execute(new Runnable(){
        public void run() {
            someTask.doNothing("blah");
        }
    });
}

private class SomeTask{
    public String doNothing(String message){
        return message;
    }
}

例外:

java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) at java.security.AccessController.checkPermission(AccessController.java:546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:166) at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkAccess(DevAppServerFactory.java:191在java.lang.ThreadGroup.checkAccess(ThreadGroup.java:288) at java.lang.Thread.init(Thread.java:332) at java.lang.Thread.(Thread.java:565) at java.util.concurrent.Executors$DefaultThreadFactory.newThread(Executors.java:542) at java.util.concurrent.ThreadPoolExecutor.addThread(ThreadPoolExecutor.java:672) at java.util.concurrent.ThreadPoolExecutor.addIfUnderCorePoolSize(ThreadPoolExecutor.java:697) at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:652) at java.util.concurrent.Executors$DelegatedExecutorService.execute(Executors.java:590) at java.util.concurrent.ExecutorCompletionService.submit(ExecutorCompletionService.java:152)

这段代码在Tomcat上或通过命令行JVM运行时运行良好。但是,它在Eclipse容器(尝试使用AppEngine插件和maven-gae)中会产生瓶颈。

AppEngine很可能是为了不允许运行潜在危险的程序而设计的,因此我可以看到它们完全禁用线程创建。然而,为什么Google允许您创建一个类,而不允许您调用它的方法呢?白名单的java.util.concurrent是误导性的。

在GAE上是否有其他方法来执行并行/同时/并发任务?

EN

Stack Overflow用户

发布于 2010-04-19 01:53:01

App引擎Java概述

应用程序不能生成线程

这一点在他们在Java环境上的文档中更清楚地说明了。

线程 Java应用程序不能创建新的java.lang.ThreadGroup,也不能创建新的java.lang.Thread。这些限制也适用于使用线程的JRE类。例如,应用程序不能创建新的java.util.concurrent.ThreadPoolExecutorjava.util.Timer。应用程序可以对当前线程(如Thread.currentThread().dumpStack() )执行操作。

也许白名单是为了让您可以使用接受Executors的库,并且您可以提供自己的Executor来执行当前线程中的工作。

你可以试试实验性的任务队列

票数 11
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2664738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档