多线程与Appengine

xyb*_*rek 4 java google-app-engine

由于Appengine不允许java多线程,我们如何才能将现有的多线程代码迁移到平台?

例如,我有以下代码:

    Thread t = new Thread() {
        public boolean alive = true;
        public void run() {
            while (alive) {
                try {
                    Thread.sleep(5000);    
                    getNewNotifications();
                } catch (InterruptedException e) {
                    //  Do nothing
                } catch (IOException e) {
                } 
            }
        }
    };
    t.start()
Run Code Online (Sandbox Code Playgroud)

函数getNewNotification()执行一些Rest/HTTP调用,可能包括一些可能无限期返回的其他进程.我已经阅读了Task Queue解决方案,但是我们如何将这个简单的代码转换为App引擎友好的代码?

如何使用任务队列实现上面的代码?例如getNewNotifications(),每五秒呼叫一次.

该函数将从服务器获得一些结果,解析结果,然后根据结果执行它需要执行的活动/工作.

Aja*_*jax 6

您可以在java appengine中创建线程.

ThreadManager.createThreadForCurrentRequest(new Runnable(){...});

请参阅https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/ThreadManager

当请求完成时,前端线程将被中断并终止,但是生成的后端线程可以运行很长时间.此外,当您捕获InterruptedException时,尝试做的不仅仅是什么; 吞下这个例外会导致实例保持在线并且会花费更多的钱.

如果要使代码与Runnable和任务队列一起工作,只需实现Runnable和DeferredTask; 两个接口都具有相同的方法签名.要调度延迟任务,只需执行QueueFactory.getQueue("queueName").add(TaskOptions.Builder.withPayload(YourDeferredTask));