调用Google Cloud Endpoints API时,Google App Engine任务队列获取404 - java

以下代码在开发环境中可以正常工作。 GET到“/ _ah / api / worker / v1 / tasks”会调用refresh()方法,该方法会将任务添加到默认任务队列中,该默认任务队列POST到“/ _ah / api / worker / v1 / tasks”,由handle()方法。

@Api(name = "worker", version = "v1", scopes = { Constants.EMAIL_SCOPE }, clientIds = { Constants.API_EXPLORER_CLIENT_ID, Constants.WEB_CLIENT_ID })
public class WorkerApi
{
    @ApiMethod( name="refresh", path = "tasks", httpMethod = HttpMethod.GET)
    public void refresh()
    {
        MyObject myObject = new MyObject()
        Queue queue = QueueFactory.getDefaultQueue();
        TaskOptions o = TaskOptions.Builder.withUrl("/_ah/api/worker/v1/tasks");
        o.payload(ApiHelper.ObjectToJson(myObject ));               
        queue.add(o);                           
    }

    @ApiMethod( name="handle", path = "tasks", httpMethod = HttpMethod.POST)
    public void handle(HttpServletRequest req, MyObject myObject) 
    {
        // This handler is called if running in dev in environment

        // If running on GAE this handler is never called.
    }
}

遗憾的是,当部署到实际的Google App Engine中时,任务队列从不会调用处理方法。

有趣的是,我可以使用API​​资源管理器成功手动调用处理程序,该资源管理器会在GAE控制台中生成以下日志:

2014-11-24 12:01:30.914 /_ah/spi/my.test.application.WorkerApi.handle 200 1394ms 0kb Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36 module=default version=1
198.66.21.14 - - [24/Nov/2014:12:01:30 -0800] "POST /_ah/spi/my.test.application.WorkerApi.handle HTTP/1.1" 200 116 - "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36" "my-test-application.appspot.com" ms=1394 cpu_ms=1003 cpm_usd=0.000013 app_engine_release=1.9.16 instance=00c61b117c39338c333cff447edea78fa0f90d

但是,当由任务队列调用时,总是会返回404并在GAE控制台中生成以下日志:

2014-11-24 12:07:54.727 /_ah/api/worker/v1/tasks 404 147ms 0kb AppEngine-Google; (+http://code.google.com/appengine) module=default version=1
0.1.0.2 - - [24/Nov/2014:12:07:54 -0800] "POST /_ah/api/worker/v1/tasks HTTP/1.1" 404 234 "https://my-test-application.appspot.com/_ah/spi/my.test.application.WorkerApi.refresh" "AppEngine-Google; (+http://code.google.com/appengine)" "my-test-application.appspot.com" ms=148 cpu_ms=23 cpm_usd=0.000026 queue_name=default task_name=9271899958322278984 pending_ms=61 app_engine_release=1.9.16 instance=00c61b117c7544e23aeb8d8b0c996da6d286d539

同样,一切都在开发环境中按预期工作。部署到GAE时损坏。我究竟做错了什么?

比较日志条目,我认为我找到了问题,并将代码更改为:

TaskOptions o = TaskOptions.Builder.withUrl("/_ah/spi/my.test.application.WorkerApi.handle");

不。这行不通。现在,它在开发环境和GAE部署中已被破坏。

从开发环境登录:

[INFO] INFO: Web hook at http://127.0.0.1:8080/_ah/spi/my.test.application.WorkerApi.handle returned status code 404.  Rescheduling..

从GAE控制台登录:

2014-11-24 12:24:10.872 /_ah/spi/my.test.application.WorkerApi.handle 404 396ms 0kb AppEngine-Google; (+http://code.google.com/appengine) module=default version=1
0.1.0.2 - - [24/Nov/2014:12:24:10 -0800] "POST /_ah/spi/my.test.application.WorkerApi.handle HTTP/1.1" 404 96 "https://my-test-application.appspot.com/_ah/spi/my.test.application.WorkerApi.refresh" "AppEngine-Google; (+http://code.google.com/appengine)" "my-test-application.appspot.com" ms=397 cpu_ms=23 cpm_usd=0.000011 queue_name=default task_name=7132899958322278984 app_engine_release=1.9.16 instance=00c61b117c565c0a8aa81e1b86e50d78f0346330

顺便说一句,我正在使用GAE SDK 1.9.16。

参考方案

我有同样的问题。
在本地PC上,这很好用。

也许,GAE服务器找不到未明确写入web.xml的url(端点)。

要解决此问题,请为工作人员创建另一个servlet。

例如,端点方法是

    Queue queue = QueueFactory.getDefaultQueue();
    TaskOptions o = TaskOptions.Builder.withUrl("/work");
    o.param( "target" , target) ; // target is String in this case
    queue.add(o);

war / WEB-INF / web.xml是

<web-app ...>
 ... default servet (SystemServiceServlet) ...
 <servlet>
  <servlet-name>WorkerServlet</servlet-name>
  <servlet-class>com.example.your.package.WorkerServlet</servlet-class>
 </servlet>
 .... default mapping file ...
 <servlet-mapping>
   <servlet-name>WorkerServlet</servlet-name>
   <url-pattern>/work</url-pattern>
 </servlet-mapping>

并创建WorkerServlet.java文件为

public class WorkerServlet extends HttpServlet {

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    String target = req.getParameter("target");

    // do something

    resp.setStatus( resp.SC_OK );

  }

}

在这种情况下,URL / work可以由GAE服务器找到,并且Queue可以正常工作。

如何在Google App Engine(Java)中创建Excel文件? - java

谷歌搜索了两天后,这个问题似乎对Python有很多选择,但对Java没有任何选择。到目前为止,我真的真的可以使用一些帮助,推荐使用gaeVFS从xml组件中构建一个excel文件,然后将其全部压缩在一起,听起来像是一巴掌。哦,是的,如果您想知道我是在问我使用Java而不是python的问题,但是在5,000行代码的情况下,现在就回头吧……您可能会发现有用的其…

使用Appengine开发服务器测试邮件(java) - java

我正在使用javamail从我的appengine应用程序发送邮件。它在部署中可以完美地工作,但是我不知道如何使用开发服务器来做到这一点。每当我需要测试sendmail时,就必须部署非常烦人的应用程序。 背景信息(为什么日志不起作用):我们知道电子邮件会转到appengine开发服务器上的日志。但是,想要从开发服务器发送电子邮件的主要原因是能够测试电子邮件的…

适用于多个API类的Google Endpoints Android客户端库 - java

我使用@ endpoints.api装饰器将端点api的代码分成几个类。这是Google(source)推荐的方法。现在,我正在尝试使用命令行工具生成Android客户端库。我可以使用以下命令为一个类生成库endpointscfg.py get_client_lib java -bs gradle api.HelloWorldApi这可行。但是我还有其他一些…

用于本地开发服务器重定向到登录页面的Google App Engine远程api - java

尝试使用appcfg.py将数据上传到本地开发服务器时,出现302重定向错误。如果我使用浏览器访问相关页面(_ah / remote_api),则会得到一个登录页面,test @ example.com中的预填写有效,但cmd行中没有提示输入。我正在使用GAE的Java变体,并且之前使用过appcfg.py的upload_data命令,我认为这里的区别在于,…

使用对象化进行多对多关系? - java

我正在将我的应用程序从关系数据库移到对象化/谷歌应用程序引擎。该应用程序具有如下所示的关系:一个Message可以发送给许多Users。每个User可以有多个Message寻址到它们。我需要能够扫描寻址到特定Message的所有User。我该如何使用Objectify? 参考方案 有很多方法可以做到这一点。您可以在用户对象中保存消息列表。由于不需要进行查询,…