2012-06-21 24 views
5

tại thời điểm này, tôi đang cố gắng bật bộ nhớ đệm cho dịch vụ lưu trữ của mình.EntityTag - Giá trị, Bộ nhớ đệm, So sánh - cách thực hiện trong Jersey

Vì vậy, có một số câu hỏi xảy ra.

  1. Giá trị của thực thểTag là bao nhiêu? Nó có thể chỉ là một chuỗi ngẫu nhiên được tạo duy nhất không?

  2. Khi tôi thực hiện yêu cầu đăng bài từ khách hàng của mình lên máy chủ, tôi lấy lại phản hồi bằng thẻ tổ chức. Câu hỏi: làm thế nào để bộ nhớ cache này và làm thế nào để tôi biết được thực thể lưu trữ mà tôi phải gửi cho các yêu cầu nhận được tiếp theo?

  3. Ở phía máy chủ, tôi nhận được thực thể được gắn thẻTag. Làm cách nào để tôi so sánh điều này với tài nguyên? Bởi vì tôi không đính kèm entityTag vào ressource.

  4. Chỉ cần so sánh thẻ thực thểTags. Vậy khi nào tôi cần giá trị tiêu đề được sửa đổi lần cuối?

Rất tiếc, sẽ rất hữu ích khi lấy ví dụ cho máy chủ và phía máy khách. Tôi không thể tìm thấy bất cứ điều gì cho vấn đề này. Cách gửi entityTags theo yêu cầu, cách so sánh chúng trên phía máy chủ và những gì abouts được sửa đổi lần cuối.

Trả lời

7

ETags cung cấp cơ chế cho bộ nhớ cache của khách hàng để xác thực nếu nội dung được lưu trong bộ nhớ cache vẫn được cập nhật. Về câu hỏi của bạn:

  1. Đến máy chủ để quyết định - nó phải xác định duy nhất phiên bản tài nguyên tại một thời điểm nhất định (có thể là số sửa đổi của tài nguyên hoặc CRC32 băm của đại diện tài nguyên hoặc bất kỳ thứ gì khác có thể được sử dụng để xác định xem tài nguyên có thay đổi hay không)
  2. Jersey không cung cấp bất kỳ hỗ trợ nào cho bộ nhớ đệm phía máy khách tại thời điểm này. Bạn có thể tạo bộ nhớ cache của riêng bạn bằng cách thực hiện một ClientFilter chặn một yêu cầu của khách hàng, xem xét nó là HashMap nội bộ (ví dụ) ánh xạ URI, kiểu phương tiện và phương thức yêu cầu tới một phản hồi được lưu trữ. Đưa ETag từ phản hồi được lưu trong bộ nhớ cache đó và đính kèm nó vào yêu cầu của khách hàng. Khi máy chủ phản hồi, bộ lọc sẽ kiểm tra xem máy chủ có phản hồi với mã trạng thái 304 (Không được sửa đổi) hay không, nếu vậy, bộ lọc trả về phản hồi đã lưu vào bộ đệm trước đó cho máy khách, nếu không, nó sẽ lưu trữ phản hồi được trả về từ máy chủ và trả về khách hàng.
  3. Bằng cách gửi thẻ thực thể trong yêu cầu, khách hàng về cơ bản nói: "Tôi có phiên bản của thực thể tương ứng với thẻ thực thể này - thực thể vẫn giống hoặc đã thay đổi? Nếu nó đã thay đổi, hãy gửi cho tôi phiên bản mới của thực thể cùng với thẻ! ". Nếu máy chủ không gửi bất kỳ thẻ thực thể nào trong phản hồi ban đầu, máy khách không biết thẻ tương ứng với thực thể được lưu trong bộ nhớ cache và do đó, máy chủ không thể gửi thẻ trong yêu cầu của nó. Máy chủ biết ý nghĩa của thẻ - cho khách hàng, giá trị thẻ là mờ.
  4. Bạn có thể là một trong hai hoặc cả hai.

Ở phía máy chủ, Jersey cung cấp hỗ trợ để đánh giá ETags và tạo phản hồi. Ví dụ. phương pháp tài nguyên của bạn có thể trông giống như sau:

@GET 
public Response doGet() { 
    EntityTag et = yourMethodForCalculatingEntityTagForThisResource(); 

    // the following method call will result in Jersey checking the headers of the 
    // incoming request, comparing them with the entity tag generated for 
    // the current version of the resource generates "304 Not Modified" response 
    // if the same. Otherwise returns null. 
    ResponseBuilder rb = request.evaluatePreconditions(new EntityTag("1")); 
    if (rb != null) { 
     // Jersey generated 304 response - return it 
     return rb.build(); 
    } 
    // return the current version of the resource with the corresponding tag 
    return Response.ok(getCurrentVersion(), "text/plain").tag(et).build(); 
} 

Cùng một loại hỗ trợ được cung cấp cho tiêu đề sửa đổi lần cuối và cả etag và sửa đổi lần cuối.

bài viết wikipedia này cung cấp một cái nhìn tổng quan tốt đẹp của ETags: http://en.wikipedia.org/wiki/HTTP_ETag

+1

nên ví dụ này không có request.evaluatePreconditions (et); ? – Alb

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