Использование Java Executor на AppEngine вызывает AccessControlException - PullRequest
4 голосов
/ 19 апреля 2010

Как вы получаете java.util.concurrent.Executor или CompletionService для работы в Google AppEngine? Все классы официально занесены в белый список , но я получаю ошибку безопасности во время выполнения при попытке отправить асинхронные задачи.

Код:

    // 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.AccessControlException: доступ закрыт (java.lang.RuntimePermission modifyThreadGroup) в java.security.AccessControlContext.checkPermission (AccessControlContext.java:323) в java.security.AccessController.checkPermission (AccessController.java:546) в java.lang.SecurityManager.checkPermission (SecurityManager.java:532) в com.google.appengine.tools.development.DevAppServerFactory $ CustomSecurityManager.checkPermission (DevAppServerFactory.java:166) в com.google.appengine.tools.development.DevAppServerFactory $ CustomSecurityManager.checkAccess (DevAppServerFactory.java:191) в java.lang.ThreadGroup.checkAccess (ThreadGroup.java:288) в java.lang.Thread.init (Thread.java:332) в java.lang.Thread. (Thread.java:565) в java.util.concurrent.Executors $ DefaultThreadFactory.newThread (Executors.java:542) в java.util.concurrent.ThreadPoolExecutor.addThread (ThreadPoolExecutor.java:672) в java.util.concurrent.ThreadPoolExecutor.addIfUnderCorePoolSize (ThreadPoolExecutor.java:697) в java.util.concurrent.ThreadPoolExecutor.execute (ThreadPoolExecutor.java:652) в java.util.concurrent.Executors $ DelegatedExecutorService.execute (Executors.java:590) в java.util.concurrent.ExecutorCompletionService.submit (ExecutorCompletionService.java:152)

Этот код отлично работает при запуске на Tomcat или через командную строку JVM. Однако он забивается в контейнере AppEngine SDK Jetty (пробовал с плагином Eclipse и плагином maven-gae-plugin).

AppEngine, скорее всего, спроектирован так, что не позволяет запускать потенциально опасные программы, поэтому я мог видеть, что они полностью отключают создание потоков. Однако, почему Google позволяет вам создавать класс, но не позволяет вызывать методы для него? Белый список java.util.concurrent вводит в заблуждение.

Есть ли какой-либо другой способ выполнять параллельные / одновременные / параллельные задачи в GAE?

Ответы [ 2 ]

11 голосов
/ 19 апреля 2010

Обзор Java App Engine 1002 * состояния

приложение не может порождать темы

Это еще более четко указано в их документах по Среда Java Servlet

Тема

Приложение Java не может создать ни новый java.lang.ThreadGroup, ни новый java.lang.Thread. Эти ограничения также применяются к классам JRE, использующим потоки. Например, приложение не может создать новый java.util.concurrent.ThreadPoolExecutor или java.util.Timer. Приложение может выполнять операции с текущим потоком, такие как Thread.currentThread().dumpStack().

Возможно, белый список таков, что вы можете работать с библиотеками, которые принимают Executors, и вы можете указать свой собственный Executor, который выполняет работу в текущем потоке.

Вы можете попробовать экспериментальную Task Queues

1 голос
/ 26 октября 2013

Вы можете запустить поток в контексте запроса

https://developers.google.com/appengine/docs/java/?csw=1#Java_The_sandbox

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...