2011-09-21 39 views

Trả lời

13

Để sử dụng trì hoãn, trước tiên bạn phải xác định một lớp có chứa mã bạn muốn chạy:

class MyDeferred implements DeferredTask { 
    @Override 
    public void run() { 
     // Do something interesting 
    } 
}; 

Cũng giống như bất kỳ lớp serializable khác, bạn có thể có người dân địa phương mà lưu trữ thông tin liên quan về nhiệm vụ. Sau đó, để chạy các nhiệm vụ, nhanh chóng một thể hiện của lớp học của bạn và vượt qua nó để API nhiệm vụ hàng đợi:

MyDeferred task = new MyDeferred(); 
// Set instance variables etc as you wish 
Queue queue = QueueFactory.getDefaultQueue(); 
queue.add(withPayload(task)); 

Bạn thậm chí có thể sử dụng các lớp bên trong vô danh cho các nhiệm vụ của bạn, nhưng hãy cẩn thận của những hãy cẩn thận mô tả trong tờ giấy here .

+5

Các nội dung như thế này có thể được thêm vào tài liệu để ít gây nhầm lẫn hơn không? Tôi đã bỏ lỡ phần mà tôi đã thêm nhiệm vụ vào hàng đợi. Phần cho DeferredTaskQueue trong tài liệu chỉ là một đoạn nhỏ. Hy vọng điều này sẽ giúp, và cảm ơn bạn đã dành thời gian để đăng bài này! +1 :) – jmort253

+0

phương pháp withPaylod là gì? không thể tìm thấy ở bất cứ đâu :( –

+1

'withPayload' là com.google.appengine.api.taskqueue.TaskOptions.Builder.withPayload (DeferredTask) –

1

Thư viện hoãn lại Java vẫn không nằm trong SDK GAE và đó là lý do bạn không thể tìm thấy bất kỳ tài liệu chính thức nào. yêu cầu tính năng này được cố định kể từ tháng 3 năm 2011 và bây giờ bạn có thể sử dụng thư viện chậm straight from the Sdk

Bạn có thể sử dụng thư viện chậm Vince Bonfanti có sẵn here.

Việc sử dụng thư viện là khá đơn giản và nó được giải thích trong các doc:

1) Việc xử lý công việc chậm (servlet) cần phải được cấu hình trong web.xml.
Lưu ý rằng init-param phải phù hợp với thực tế url-pattern:

<servlet> 
    <servlet-name>Deferred</servlet-name> 
    <servlet-class>com.newatlanta.appengine.taskqueue.Deferred</servlet-class> 
     <init-param> 
      <param-name>url-pattern</param-name> 
      <param-value>/worker/deferred</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Deferred</servlet-name> 
     <url-pattern>/worker/deferred</url-pattern> 
    </servlet-mapping> 

2) Các "trì hoãn" hàng đợi cần phải được cấu hình trong queue.xml (sử dụng bất cứ tỷ lệ bạn muốn).
Nếu bạn sử dụng tên hàng đợi tùy chọn theo phương pháp defer(), hãy tạo hàng đợi với tên thích hợp.

<queue> 
     <name>deferred</name> 
     <rate>10/s</rate> 
    </queue> 

3) Tạo một lớp mà thực hiện các com.newatlanta.appengine.taskqueue.Deferred.Deferrable interface;
phương thức doTask của lớp này là nơi bạn thực hiện nhiệm vụ của mình là logic .

4) Gọi phương pháp Deferred.defer phải xếp hàng lên nhiệm vụ của bạn:

DeferredTask task = new DeferredTask(); // implements Deferrable 
    Deferred.defer(task); 

Nếu kích thước nhiệm vụ vượt quá 10KB, các tùy chọn công việc được lưu trữ trong một thực thể kho dữ liệu, trong đó sẽ bị xóa khi tác vụ được thực hiện.

Phương thức doTask của bạn có thể ném một ngoại lệ PermanentTaskFailure để tạm dừng thử lại; bất kỳ ngoại lệ nào khác khiến nhiệm vụ được thử lại.

Couple các liên kết tiền thưởng:

  • Tính năng yêu cầu here.
  • Chủ đề của nhóm Google here.
  • Github Fork
+0

Trì hoãn [là] (http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/taskqueue/DeferredTask.html) một phần của SDK Java. –

+0

@Nick Cảm ơn bạn đã chỉ ra điều đó; Tôi đã hoàn toàn bỏ lỡ trạng thái FIXED của yêu cầu tính năng. Thành thật mà nói tôi chưa đọc bất kỳ thông báo nào về điều này, bắt đầu từ blog chính thức của GAE. – systempuntoout