Xử lý hàng loạt trong Giao thức dữ liệu của Google

Tính năng xử lý hàng loạt cho phép bạn thực hiện nhiều thao tác trong một yêu cầu thay vì phải gửi từng thao tác.

Lưu ý: Để thực hiện các thao tác hàng loạt, bạn cần sử dụng phiên bản gần đây của thư viện ứng dụng Google Data API. Thư viện ứng dụng JavaScript không hỗ trợ thao tác hàng loạt.

Đối tượng người xem

Tài liệu này dành cho những lập trình viên muốn gửi nhiều thao tác trong một yêu cầu bằng cách xử lý hàng loạt.

Tài liệu này giả định rằng bạn đã quen thuộc với việc sử dụng Thư viện ứng dụng Java GData. Các ví dụ trong tài liệu này cho thấy cách sử dụng thư viện ứng dụng Java để chạy các thao tác hàng loạt.

Các ví dụ trong tài liệu này dành riêng cho Google Base Data API. Tuy nhiên, các dịch vụ khác cũng có thể cung cấp tính năng theo lô.

Lưu ý: Các quy trình và quy trình chung sẽ giống nhau đối với các thư viện ứng dụng khác, nhưng các phương thức cụ thể để thực hiện yêu cầu hàng loạt có thể khác nhau. Vui lòng tham khảo tài liệu cụ thể về thư viện ứng dụng.

Giới thiệu

Khi sử dụng nguồn cấp dữ liệu hàng loạt GData, bạn có thể thu thập nhiều hoạt động chèn, cập nhật, xóa và truy vấn, sau đó gửi và thực thi tất cả hoạt động đó cùng một lúc.

Ví dụ: nguồn cấp dữ liệu sau đây bao gồm 4 hoạt động:

<feed>
  <entry>
    <batch:operation type="insert"/>
    ... what to insert ...
  </entry> 
  <entry>
    <batch:operation type="update"/>
    ... what to update ...
  </entry>
  <entry>
    <batch:operation type="delete"/>
    ... what to delete ...
  </entry>
  <entry>
    <batch:operation type="query"/>
    ... what to query ...
  </entry>
</feed>

Dịch vụ này sẽ thực hiện nhiều thay đổi đã yêu cầu nhất có thể và trả về thông tin trạng thái mà bạn có thể sử dụng để đánh giá mức độ thành công hoặc thất bại của mỗi hoạt động.

Dịch vụ này cố gắng thực thi từng thao tác trong một lô, ngay cả khi một số thao tác trong lô không thành công.

Gửi yêu cầu hàng loạt

Yêu cầu hàng loạt sẽ được gửi dưới dạng yêu cầu POST qua HTTP đến URL theo nhóm. Các nguồn cấp dữ liệu khác nhau hỗ trợ thao tác hàng loạt. Nguồn cấp dữ liệu chỉ có thể đọc chỉ hỗ trợ các truy vấn.

Để tìm hiểu xem một nguồn cấp dữ liệu nhất định có hỗ trợ thao tác hàng loạt hay không, bạn có thể truy vấn nguồn cấp dữ liệu đó. Nếu nguồn cấp dữ liệu chứa một mối quan hệ "lô sản phẩm" ở cấp nguồn cấp dữ liệu, thì tức là nguồn cấp dữ liệu này hỗ trợ các hoạt động hàng loạt.

Mối quan hệ liên kết "theo lô" là phần tử <link>rel="http://schemas.google.com/g/2005#batch". Thuộc tính href của mối quan hệ liên kết xác định URL nơi có thể đăng tài liệu nguồn cấp dữ liệu cho hoạt động hàng loạt.

Ví dụ: nếu thực thi: GET http://www.google.com/base/feeds/items (nguồn cấp dữ liệu "items" thông thường của Google Base), bạn có thể nhận được phản hồi sau:

<feed xmlns=...
  <id>http://www.google.com/base/feeds/items</id>
  <link rel="http://schemas.google.com/g/2005#feed"
    type="application/atom+xml"
    href="http://www.google.com/base/feeds/items"/>
  <link rel="http://schemas.google.com/g/2005#post"
    type="application/atom+xml"
    href="http://www.google.com/base/feeds/items"/>
  <link rel="http://schemas.google.com/g/2005#batch"
    type="application/atom+xml"
    href="http://www.google.com/base/feeds/items/batch"/>
  ...
</feed> 

Trong ví dụ này, URL hàng loạt là http://www.google.com/base/feeds/items/batch.

Viết nguồn cấp dữ liệu hoạt động hàng loạt

Nguồn cấp dữ liệu hoạt động chứa danh sách mục nhập để chèn, cập nhật, xoá hoặc truy vấn. Mỗi toán tử được xác định bằng một phần tử <batch:operation type="insert|update|delete|query"/>.

Phần tử này có thể là phần tử con trực tiếp của phần tử <feed>, phần tử con trực tiếp của mục bất kỳ trong nguồn cấp dữ liệu hoặc cả hai. Khi được đưa vào một mục nhập, mục đó chỉ định thao tác thực thi cho mục cụ thể đó. Khi được đưa vào nguồn cấp dữ liệu, phần tử này chỉ định thao tác mặc định để thực thi trên mọi mục không có phần tử <batch:operation/>.

Khi cả mục nhập và nguồn cấp dữ liệu đều không chỉ định một thao tác, thì thao tác mặc định sẽ là insert.

Các ứng dụng không được áp dụng nhiều thao tác cho cùng một mục nhập trong một nguồn cấp dữ liệu hàng loạt. Kết quả là không xác định nếu bạn chỉ định nhiều thao tác cho cùng một mục.

Để cải thiện hiệu suất, các thao tác có thể không được xử lý theo thứ tự yêu cầu. Tuy nhiên, kết quả cuối cùng luôn giống như khi hệ thống đã xử lý các mục theo thứ tự.

Số byte trong XML mà bạn gửi tới máy chủ không được vượt quá 1 MB (1.048.576 byte). Nhìn chung, không có giới hạn về số lượng thao tác bạn có thể yêu cầu, miễn là tổng kích thước byte không vượt quá 1 MB. Tuy nhiên, một số dịch vụ có thể áp dụng các hạn chế khác.

Để sử dụng các thao tác theo lô, bạn phải thêm khai báo vùng chứa tên hàng loạt dưới dạng thuộc tính cho phần tử <feed>:

<feed 
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"
  ...
  xmlns:batch="http://schemas.google.com/gdata/batch">

Chèn toán tử

Toán tử chèn được biểu thị như sau:

<batch:operation type="insert">

Toán tử chèn tương đương với thao tác POST mục nhập. Khi thao tác thành công, toàn bộ nội dung của mục sẽ được trả về, trong đó có phần tử <id> của tài liệu được cập nhật và phần tử <batch:status code="201"/>.

Sau đây là ví dụ về một yêu cầu chèn thành công:

<entry>
  <title type="text">...</title>
  <content type="html">...</content>
  <batch:id>itemA</batch:id>
  <batch:operation type="insert"/>
  <g:item_type>recipes</g:item_type>
  ... 
</entry>

Dưới đây là ví dụ về phản hồi cho một yêu cầu chèn thành công:

<entry>
  <batch:status code="201"/>
  <batch:id>itemA</batch:id>
  <batch:operation type="insert"/>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
  <link rel="self" type="application/atom+xml"
    href="http://www.google.com/base/feeds/items/17437536661927313949"/>
  <title type="text">...</title>
  <content type="html">...</content>
  <g:item_type>recipes</g:item_type>
  ... 
</entry>

Thao tác cập nhật

<batch:operation type="update">

Thao tác cập nhật tương đương với việc thực thi một PUT trên URL mà phần tử <id> của mục nhập tham chiếu đến. Khi thao tác thành công, toàn bộ nội dung mục nhập sẽ được trả về kèm theo phần tử <batch:status code="200"/>.

Lưu ý: Với một số nguồn cấp dữ liệu, bạn cũng cần chỉ định đường liên kết rel="edit" của mục nhập có yêu cầu cập nhật theo lô. Những nguồn cấp dữ liệu này hỗ trợ kiểu phiên bản đồng thời tối ưu của Giao thức dữ liệu trên Google và những nguồn cấp dữ liệu không có mã nhận dạng là URL.

Sau đây là ví dụ về yêu cầu cập nhật:

<entry>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
  <batch:operation type="update"/>
  ...
</entry>

Dưới đây là ví dụ về một phản hồi thành công:

<entry>
  <batch:status code="200"/>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
  <batch:operation type="update"/>
  ... 
</entry>

Lưu ý: Một số nguồn cấp dữ liệu sử dụng ETag mạnh để ngăn bạn vô tình sửa đổi các thay đổi của người khác. Khi yêu cầu cập nhật hàng loạt cho một mục nhập trong một trong những nguồn cấp dữ liệu này, bạn phải cung cấp giá trị ETag trong thuộc tính gd:etag của mục nhập. Ví dụ: <entry gd:etag="'F08NQAxFdip7IWA6WhVR'">...<batch:operation type="update"/>...

Thao tác cập nhật một phần

Đối với nguồn cấp dữ liệu hỗ trợ tính năng cập nhật một phần, bạn cũng có thể sử dụng nguồn cấp dữ liệu đó trong yêu cầu hàng loạt. Thao tác cập nhật một phần tương đương với việc thực thi một PATCH trên URL mà phần tử <id> của mục tham chiếu. Khi thao tác thành công, toàn bộ nội dung mục nhập sẽ được trả về kèm theo phần tử <batch:status code="200"/>.

Lưu ý: Với một số nguồn cấp dữ liệu, bạn cũng cần chỉ định đường liên kết rel="edit" của mục nhập có yêu cầu cập nhật theo lô. Những nguồn cấp dữ liệu này hỗ trợ kiểu phiên bản đồng thời tối ưu của Giao thức dữ liệu trên Google và những nguồn cấp dữ liệu không có mã nhận dạng là URL.

<batch:operation type="patch"/>

Sau đây là ví dụ về yêu cầu cập nhật một phần:

<entry gd:fields="content" gd:etag="FE8LQQJJeSp7IWA6WhVa">
  <id>http://www.google.com/calendar/feeds/jo@gmail.com/private/full/entryID</id>
  <batch:operation type="patch"/>
  <title>New title</title>
</entry>

Dưới đây là ví dụ minh hoạ về một phản hồi thành công:

<entry gd:etag="FE8LQQJJeSp7IWA6WhVa">
  <batch:status code="200"/>
  <id>http://www.google.com/calendar/feeds/jo@gmail.com/private/full/entryID</id>
  <batch:operation type="patch"/>
  <title>New title</title>
  <content></content>
  ...rest of the entry...
</entry>

Xóa thao tác

<batch:operation type="delete">

Thao tác xoá tương đương với việc thực thi một DELETE trên URL mà phần tử <id> của mục tham chiếu đến. Đối với thao tác xoá, bạn chỉ cần gửi phần tử <id> để xoá mục đó. Mọi thông tin khác mà bạn cung cấp trong các phần tử không có trong vùng chứa tên batch: đều sẽ bị bỏ qua. Khi thao tác thành công, một mục nhập có cùng mã nhận dạng sẽ được trả về kèm theo phần tử <batch:status code="200"/>.

Lưu ý: Với một số nguồn cấp dữ liệu, bạn cũng cần chỉ định đường liên kết rel="edit" của mục nhập có yêu cầu xoá hàng loạt. Những nguồn cấp dữ liệu này hỗ trợ kiểu phiên bản đồng thời tối ưu của Giao thức dữ liệu trên Google và những nguồn cấp dữ liệu không có mã nhận dạng là URL.

Sau đây là ví dụ về yêu cầu xoá:

<entry>
  <batch:operation type="delete"/>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
</entry>

Dưới đây là ví dụ về một phản hồi thành công:

<entry>
  <batch:operation type="delete"/>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
  <batch:status code="200" reason="Success"/>
</entry>

Lưu ý: Một số nguồn cấp dữ liệu sử dụng ETag mạnh để ngăn bạn vô tình sửa đổi các thay đổi của người khác. Khi tạo yêu cầu xoá hàng loạt cho một mục nhập trong một trong những nguồn cấp dữ liệu này, bạn phải cung cấp giá trị ETag trong thuộc tính gd:etag của mục nhập đó. Ví dụ: <entry gd:etag="'F08NQAxFdip7IWA6WhVR'">...<batch:operation type="delete"/>...

Toán tử truy vấn

<batch:operation type="query">

Toán tử truy vấn tương đương với việc thực thi một GET trên URL mà phần tử <id> của mục nhập tham chiếu đến. Khi thao tác thành công, toàn bộ nội dung của mục sẽ được trả về.

Lưu ý: Với một số nguồn cấp dữ liệu, bạn cũng cần chỉ định đường liên kết rel="self" của mục nhập có yêu cầu truy vấn hàng loạt. Quy định này cũng áp dụng cho những nguồn cấp dữ liệu không có mã nhận dạng URL.

Sau đây là ví dụ về yêu cầu truy vấn:

<entry>
  <id>http://www.google.com/base/feeds/items/1743753666192313949</id>
  <batch:operation type="query"/>
</entry>

Dưới đây là ví dụ về một phản hồi thành công:

<entry>
  <id>http://www.google.com/base/feeds/items/1743753666192313949</id>
  <batch:operation type="query"/>
  <batch:status code="200" reason="Success"/>
   ...
</entry>

Hoạt động theo dõi

Kết quả nhập dữ liệu GData không nhất thiết phải được trả về theo cùng thứ tự như yêu cầu. Bạn có thể theo dõi một hoạt động trong suốt thời gian hoạt động bằng giá trị nhận dạng.

Đối với các hoạt động cập nhật, xoá và truy vấn, bạn có thể sử dụng mã nhận dạng của mục nhập để theo dõi hoạt động đó.

Đối với thao tác chèn, vì chưa có mã nhận dạng nào, bạn có thể truyền giá trị nhận dạng thao tác. Bạn có thể sử dụng giá trị nhận dạng này để liên kết các mục nhập kết quả với các mục nhập yêu cầu. Giá trị nhận dạng thao tác được truyền vào phần tử <batch:id>.

Đối với mỗi toán tử, GData trả về một phản hồi cho biết thao tác đó có thành công hay không. Mỗi câu trả lời sẽ xác định mục nhập có liên quan. Đối với thao tác cập nhật, xoá hoặc truy vấn hoặc thao tác chèn thành công, mã truy cập sẽ luôn được trả về. Nếu bạn đã chỉ định một mã nhận dạng lô thì mã này cũng sẽ được trả về. Vì các thao tác chèn không thành công không có mã mục nhập được liên kết, nên chỉ có mã hàng loạt được trả về.

Khi sử dụng giá trị nhận dạng của mỗi toán tử, bạn chỉ có thể thử lại những thao tác không thành công đó, thay vì phải gửi lại toàn bộ lô thao tác.

Nội dung của <batch:id> là một giá trị chuỗi được máy khách xác định và sẽ được lặp lại trong mục phản hồi tương ứng.Bạn có thể chỉ định bất kỳ giá trị nào giúp khách hàng tương quan với phản hồi với mục nhập trong yêu cầu ban đầu. Phần tử này sẽ được lặp lại nguyên trạng trong mục tương ứng, ngay cả khi thao tác không thành công. GData không bao giờ lưu trữ và diễn giải nội dung của mã nhận dạng lô này.

Ví dụ sau đây cho thấy một nguồn cấp dữ liệu hoạt động hàng loạt. Xin lưu ý rằng phần tử <batch:id> sẽ gắn nhãn thao tác này là itemB.

<entry>
  <title type="text">...</title>
  <content type="html">...</content>
  <batch:id>itemB</batch:id>
  <batch:operation type="insert"/>
  <g:item_type>recipes</g:item_type>
</entry>

Ví dụ sau đây cho thấy mục nhập trạng thái hàng loạt được trả về để phản hồi thao tác này.

<entry>
  <id>http://www.google.com/base/feeds/items/2173859253842813008</id>
  <published>2006-07-11T14:51:43.560Z</published>
  <updated>2006-07-11T14:51: 43.560Z</updated>
  <title type="text">...</title>
  <content type="html">...</content>
  <link rel="self" 
    type="application/atom+xml" 
    href="http://www.google.com/base/feeds/items/2173859253842813008"/>
  <link rel="edit" 
    type="application/atom+xml" 
    href="http://www.google.com/base/feeds/items/2173859253842813008"/>
  <g:item_type>recipes</g:item_type>
  <batch:operation type="insert"/>
  <batch:id>itemB</batch:id>
  <batch:status code="201" reason="Created"/>
</entry>

Xử lý mã trạng thái

Mã trạng thái được thể hiện bằng phần tử sau:

<batch:status code="200|201|404|500|..." reason="reason" [content-type="type"]/>

Mỗi mục trong nguồn cấp dữ liệu phản hồi chứa một phần tử <batch:status>. Phần tử này mô tả những gì đã xảy ra trong khi thực thi thao tác. Phương thức này bắt chước phản hồi HTTP sẽ được gửi nếu hoạt động được gửi riêng lẻ, chứ không phải là một phần của nguồn cấp dữ liệu hàng loạt.

Bạn cần kiểm tra phần tử <batch:status> của mỗi mục trong phản hồi để tìm hiểu xem thao tác liên kết có được xử lý thành công hay không. Thuộc tính code="n" chứa mã trạng thái GData.

Mô tả trạng thái

Thuộc tính reason="reason" của phần tử <batch:status> có giải thích chi tiết hơn về trạng thái của toán tử.

Loại nội dung

Thuộc tính content-type="type" của phần tử <batch:status> chứa loại MIME của dữ liệu có trong phần tử <batch:status>. Điều này tương ứng với tiêu đề Content-Type của phản hồi trạng thái HTTP. Thuộc tính này là không bắt buộc.

Khi đặt loại nội dung, phần nội dung của phần tử <batch:status> sẽ mô tả lỗi trong khi xử lý mục nhập.

Xác định hoạt động bị gián đoạn

Phần tử sau đây được đưa vào phản hồi cho một thao tác bị gián đoạn:

<batch:interrupted reason="reason" success="N" failures="N" parsed="N">

Phần tử này có nghĩa là quá trình xử lý hàng loạt bị gián đoạn và mọi nỗ lực khôi phục nguyên nhân gây gián đoạn đều không thành công. Một số mục nhập có thể đã được xử lý thành công. Tất cả các mục chưa được báo cáo là thành công trước thời điểm này đã bị bỏ qua.

Phần tử này rất bất thường và thường báo hiệu rằng nguồn cấp dữ liệu đã gửi trong phần nội dung của yêu cầu có định dạng XML không chính xác.

Tương tự như phần tử <batch:status>, bạn có thể tìm thấy mã trạng thái ngắn trong thuộc tính reason. Bạn cũng có thể thấy một phản hồi dài hơn bên trong phần tử.

Ví dụ về hoạt động hàng loạt và nguồn cấp dữ liệu trạng thái

Dưới đây là nguồn cấp dữ liệu hoạt động hàng loạt có thể được gửi đến máy chủ. Nguồn cấp dữ liệu này yêu cầu máy chủ xoá hai mục nhập và thêm hai mục mới. Lưu ý rằng phần tử <feed> phải bao gồm một vùng chứa tên không gian tên theo lô, như được làm nổi bật trong ví dụ bên dưới.

POST : http://www.google.com/base/feeds/items/batch
<?xml version="1.0" encoding="UTF-8"?>
<feed
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"
  xmlns:g="http://base.google.com/ns/1.0"
  xmlns:batch="http://schemas.google.com/gdata/batch">
  <title type="text">My Batch Feed</title>
  <entry>
    <id>http://www.google.com/base/feeds/items/13308004346459454600</id>
    <batch:operation type="delete"/>
  </entry>
  <entry>
    <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
    <batch:operation type="delete"/>
  </entry>
  <entry>
    <title type="text">...</title>
    <content type="html">...</content>
    <batch:id>itemA</batch:id>
    <batch:operation type="insert"/>
    <g:item_type>recipes</g:item_type>
  </entry>
  <entry>
    <title type="text">...</title>
    <content type="html">...</content>
    <batch:id>itemB</batch:id>
    <batch:operation type="insert"/>
    <g:item_type>recipes</g:item_type>
  </entry>
</feed>

Giả sử hai hoạt động chèn này đã hoạt động thành công, nhưng một trong hai hoạt động xoá này không thành công. Trong trường hợp này, nguồn cấp dữ liệu trạng thái hàng loạt có thể có dạng như sau. Lưu ý rằng các mục nhập đã được sắp xếp lại so với nguồn cấp dữ liệu hoạt động hàng loạt.

<?xml version="1.0" encoding="UTF-8"?>
<feed
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"
  xmlns:g="http://base.google.com/ns/1.0"
  xmlns:batch="http://schemas.google.com/gdata/batch">
  <id>http://www.google.com/base/feeds/items</id>
  <updated>2006-07-11T14:51:42.894Z</updated>
  <title type="text">My Batch</title>
  <link rel="http://schemas.google.com/g/2005#feed"
    type="application/atom+xml"
    href="http://www.google.com/base/feeds/items"/>
  <link rel="http://schemas.google.com/g/2005#post"
    type="application/atom+xml"
    href="http://www.google.com/base/feeds/items"/>
  <link rel=" http://schemas.google.com/g/2005#batch"
    type="application/atom+xml"
    href="http://www.google.com/base/feeds/items/batch"/>
  <entry>
    <id>http://www.google.com/base/feeds/items/2173859253842813008</id>
    <published>2006-07-11T14:51:43.560Z</published>
    <updated>2006-07-11T14:51: 43.560Z</updated>
    <title type="text">...</title>
    <content type="html">...</content>
    <link rel="self"
      type="application/atom+xml"
      href="http://www.google.com/base/feeds/items/2173859253842813008"/>
    <link rel="edit"
      type="application/atom+xml"
      href="http://www.google.com/base/feeds/items/2173859253842813008"/>
    <g:item_type>recipes</g:item_type>
    <batch:operation type="insert"/>
    <batch:id>itemB</batch:id>
    <batch:status code="201" reason="Created"/>
  </entry>
  <entry>
    <id>http://www.google.com/base/feeds/items/11974645606383737963</id>
    <published>2006-07-11T14:51:43.247Z</published>
    <updated>2006-07-11T14:51: 43.247Z</updated>
    <title type="text">...</title>
    <content type="html">...</content>
    <link rel="self"
      type="application/atom+xml"
      href="http://www.google.com/base/feeds/items/11974645606383737963"/>
    <link rel="edit"
      type="application/atom+xml"
      href="http://www.google.com/base/feeds/items/11974645606383737963"/>
    <g:item_type>recipes</g:item_type>
    <batch:operation type="insert"/>
    <batch:id>itemA</batch:id>
    <batch:status code="201" reason="Created"/>
  </entry>
  <entry>
    <id>http://www.google.com/base/feeds/items/13308004346459454600</id>
    <updated>2006-07-11T14:51:42.894Z</updated>
    <title type="text">Error</title>
    <content type="text">Bad request</content>
    <batch:status code="404"
      reason="Bad request"
      content-type="application/xml">
      <errors>
        <error type="request" reason="Cannot find item"/>
      </errors>
    </batch:status>
  </entry>
  <entry>
    <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
    <updated>2006-07-11T14:51:43.246Z</updated>
    <content type="text">Deleted</content>
    <batch:operation type="delete"/>
    <batch:status code="200" reason="Success"/>
  </entry>
</feed>

Sử dụng chức năng hàng loạt của thư viện ứng dụng GData Java

Phần này giải thích cách sử dụng chức năng hàng loạt của thư viện ứng dụng GData Java để gửi một nhóm các yêu cầu chèn, cập nhật và/hoặc xoá.

Các ví dụ nêu trong phần này sử dụng API Google Base.

Trước tiên, hãy nhập các lớp bạn cần có, ngoài các lớp GData và Google Base tiêu chuẩn:

import com.google.gdata.data.batch.*;
import com.google.api.gbase.client.*;

Để gửi yêu cầu hàng loạt, bạn cần lấy URL hàng loạt từ nguồn cấp dữ liệu. Đoạn mã sau đây minh hoạ cách thực hiện việc này, giả sử feed là một đối tượng GoogleBaseFeed chứa thông tin về nguồn cấp dữ liệu:

Link batchLink = feed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM);
if (batchLink != null) {
  URL batchUrl = new URL(batchLink.getHref());
  ... // batch handling
} else {
  // batching is not supported for this feed
}

Đoạn mã sau đây chuẩn bị một nguồn cấp dữ liệu để chèn hai mục nhập trong một thao tác:

GoogleBaseEntry entry1 = new GoogleBaseEntry();
...   // initialize entry 1 content
BatchUtils.setBatchId(entry1, "A"); // A is the local batch ID for this entry
feed.addEntry(entry1);
GoogleBaseEntry entry2 = new GoogleBaseEntry();
... // initialize entry 2 content
BatchUtils.setBatchId(entry2, "B"); // B is the local batch ID for this entry
feed.addEntry(entry2);

Mã trong ví dụ này không bao giờ tuyên bố rõ ràng rằng thao tác cần thực hiện đối với các mục nhập này là insert. Bạn không cần chỉ định rõ ràng vì đó là hoạt động mặc định.

Để gửi nguồn cấp dữ liệu hàng loạt và nhận kết quả, hãy gọi phương thức Service.batch.

Giống như Service.insert, Service.batch trả về các mục nhập chèn vào với các giá trị <atom:id> mới được đặt. Các mục nhập được trả về nằm trong đối tượng GoogleBaseFeed.

Nếu muốn xoá một mục thứ ba (mà bạn đã tìm nạp và lưu trữ trong entry3) cùng lúc với hai mục nhập khác, bạn có thể sử dụng mã sau:

GoogleBaseEntry toDelete = new GoogleBaseEntry();


toDelete.setId(entry3.getId());
BatchUtils.setBatchOperationType(toDelete, BatchOperationType.DELETE);

feed.addEntry(toDelete);


GoogleBaseFeed result = service.batch(batchUrl, feed);

Ở đây, service là một bản sao của com.google.gdata.client.Service.

Nếu bạn muốn cập nhật một mục, hãy chỉ định OperationType.UPDATE rồi khởi chạy mục với những thay đổi mong muốn thay vì để trống.

Những ví dụ này sử dụng API dữ liệu của Google Base. Nếu bạn đang dùng service.batch bằng một loại dịch vụ GData khác, hãy thay thế các lớp GoogleBaseFeed, GoogleBaseEntryGoogleBaseService bằng các lớp nguồn cấp dữ liệu, mục nhập và dịch vụ thích hợp.

Kết quả của thao tác hàng loạt không nhất thiết được trả về theo thứ tự mà chúng được yêu cầu. Trong ví dụ trên, nguồn cấp dữ liệu kết quả có thể chứa rất tốt entry2, theo sau là entry1. Bạn không nên cho rằng các mục nhập được trả về theo thứ tự cụ thể.

Nguồn cấp dữ liệu hoạt động hàng loạt phải chỉ định một mã nhận dạng hàng loạt duy nhất cho mỗi thao tác chèn, như giải thích trong phần Hoạt động theo dõi. Trong các ví dụ ở trên, các mã nhận dạng lô là AB. Do đó, để tìm trạng thái của các thao tác được yêu cầu, bạn nên lặp lại các mục trong nguồn cấp dữ liệu hàng loạt được trả về và so sánh mã lô hoặc mã mục nhập của các thao tác đó như sau:

for (GoogleBaseEntry entry : result.getEntries()) {
  String batchId = BatchUtils.getBatchId(entry);      
  if (BatchUtils.isSuccess(entry)) {     
    if ("A".equals(batchId)) {       
      entry1 = entry;     } 
    else if ("B".equals(batchId)) {       
      entry2 = entry;     } 
    else if (BatchUtils.getBatchOperationType(entry) 
      == BatchOperationType.DELETE) {       
      System.out.println("Entry " + entry.getId() +
      " has been deleted successfully.");     
    }      
  } else {     
    BatchStatus status = BatchUtils.getBatchStatus(entry);     
    System.err.println(batchId + " failed (" +                
      status.getReason() + ") " +  status.getContent());      
    }    
  } 

Mỗi mục nhập mà bạn thấy trong nguồn cấp dữ liệu được trả về sẽ có một đối tượng BatchStatus được liên kết. Đối tượng BatchStatus chứa một mã trả về HTTP và một phản hồi mô tả vấn đề trong khi xử lý mục nhập. Bạn cần kiểm tra mã trả về HTTP của mỗi mục để cho biết thao tác có thành công hay không.

Việc kiểm tra được thực hiện trong ví dụ trên bằng phương thức tiện lợi BatchUtils.isSuccess. Trong trường hợp này, giá trị này tương đương với: BatchUtils.getBatchStatus(entry) < 300.

Bạn có thể xem nội dung giải thích bổ sung về các mã trạng thái và phản hồi trong phần Xử lý mã trạng thái.

Trở lại đầu trang