【问题标题】:Multithreading with Appengine使用 Appengine 进行多线程
【发布时间】:2012-04-29 15:43:11
【问题描述】:

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

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

【问题讨论】:

  • Eelke 的后端建议是合理的,但请考虑是否有一种方法可以使此事件驱动,而不是轮询。只在有工作要做时才做事会节省大量资源。

标签: java google-app-engine


【解决方案1】:

您可以在 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));

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      根据您的预算(检查后端计费),您也可以使用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>
      

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

      您还应该确保 URL is secure(通常您不希望您的用户调用该 URL)。

      【讨论】:

      • 我听说 cron 最多只能工作 1 分钟?如果我说“每 5 秒”会起作用吗?
      • 是的。我的错。您只能使用几小时或几分钟。
      【解决方案4】:

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

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

      【讨论】:

      • 但是,cron 作业仅限于以 1 分钟的间隔最大运行,对吗?我需要 5 秒的间隔。
      猜你喜欢
      • 2023-03-12
      • 2015-09-26
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多