4

既然 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()

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

上面的代码是如何使用任务队列实现的?例如getNewNotifications()每五秒调用一次。

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

4

4 回答 4

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));

于 2012-04-29T17:59:44.063 回答
2

您可能还对后端感兴趣。后端可以作为后台线程(实验性功能)运行,因此它们可以像您以前那样用于轮询。但是,如果可能的话,使用任务可能更有效。如果通知来自应用程序的其他部分,您可以直接创建任务而不是创建通知。

于 2012-04-29T16:16:00.903 回答
1

由于您需要定期执行代码,我建议您cron

只需将您的代码放入 servlet 的get(..)方法中,将其映射到 Url(通过web.xml)并设置 cron 以定期调用此 Url。

于 2012-04-29T17:46:44.663 回答
1

根据您的预算(检查后端计费),您也可以通过使用Scheduled Tasks来实现这一点。

您将在cron.xml文件中指定任务:

<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
  <cron>
    <url>/getNewNotifications</url>
    <description>Get new notifications every 5 minutes</description>
    <schedule>every 5 minutes</schedule>
  </cron>
</cronentries>

当然,您需要有一个映射到 URL 的 servlet(或您正在使用的任何框架)/getNewNotifications

您还应该确保该URL 是安全的(通常您不希望您的用户调用该 URL)。

于 2012-04-29T17:48:48.380 回答