2014-11-24 28 views
5

Mã sau hoạt động hoàn hảo trong môi trường dev. Một GET đến "/ _ah/api/worker/v1/tasks" gọi phương thức refresh() để thêm nhiệm vụ vào hàng đợi tác vụ mặc định POST tới "/ _ah/api/worker/v1/tasks" được xử lý bởi phương thức handle().Hàng đợi công việc của Máy ứng dụng của Google nhận được 404 khi gọi API Google Cloud Endpoints

@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. 
    } 
} 

Đáng buồn thay, khi được triển khai đến Google App Engine thực tế, phương thức xử lý không bao giờ được gọi bởi Hàng đợi công việc.

Điều thú vị là, tôi thành công có thể gọi xử lý bằng tay bằng cách sử dụng API Explorer trong đó sản xuất các bản ghi sau trong GAE console:

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 

Nhưng khi gọi bằng Queue Task, 404 luôn được trả về sản xuất như sau đăng nhập vào bảng điều khiển GAE:

Một lần nữa, mọi thứ hoạt động như mong đợi trong môi trường dev. Bị hỏng khi được triển khai sang GAE. Tôi đang làm gì sai?

So sánh các mục nhật ký, tôi nghĩ rằng tôi thấy vấn đề và thay đổi mã để:

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

Nope. Điều này không hoạt động. Bây giờ nó bị hỏng trong môi trường dev và trong triển khai GAE.

Đăng nhập từ môi trường dev:

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

Log từ GAE console:

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 

BTW, tôi đang sử dụng GAE SDK 1.9.16.

+0

chúng tôi có cùng một vấn đề - ngạc nhiên điều này làm cho nó thành sản xuất ... – DaBeeeenster

+0

@DaBeeeenster Chúng tôi có cùng một vấn đề ... Bạn có tìm thấy giải pháp nào khác ngoài việc tạo một servlet khác không? – bogumil

Trả lời

5

Tôi gặp vấn đề tương tự. Trong PC cục bộ, tính năng này hoạt động tốt.

Có thể, máy chủ GAE không thể tìm thấy url (điểm cuối) mà không được viết trong web.xml một cách rõ ràng.

Để khắc phục sự cố này, hãy tạo một servlet khác cho một nhân viên.

Ví dụ, phương pháp thiết bị đầu cuối là

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

chiến tranh/WEB-INF/web.xml là

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

và tạo WorkerServlet.java tập tin như

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

    } 

} 

Trong trường hợp này, url/công việc có thể được tìm thấy bởi máy chủ GAE và Hàng đợi hoạt động tốt.

+1

Cuối cùng, đây là những gì tôi đã làm. Vì vậy, yeah, giải pháp dường như là: Tạo một servlet riêng biệt. –

+0

Tôi chắc chắn rằng một Endpoint nên đã làm việc một cách nào đó! Tôi đoán Guice Config của tôi đã cản đường. Dù sao thì cuối cùng cũng tạo ra một servlet. – Manu

+0

@Manu it wont: (Thật không may là không có cách nào gọi trực tiếp điểm cuối tại thời điểm này. Thật sự rất buồn, hy vọng chúng tôi sẽ nhận được một số tin tốt về I/O năm nay – jirungaray

0

Chỉ cần để thêm vào câu trả lời KNaito

RequestDispatcher dispatcher = req.getRequestDispatcher(target); 
dispatcher.forward(req, resp); 

Để cuối cùng chuyển hướng yêu cầu đến vị trí mong muốn với cả hai tham số.

Các vấn đề liên quan