Batchverarbeitung im Google-Datenprotokoll

Mit der Batchverarbeitung können Sie mehrere Vorgänge in einer Anfrage ausführen, anstatt jeden Vorgang einzeln senden zu müssen.

Hinweis: Für Batchvorgänge benötigen Sie eine aktuelle Version Ihrer Google Data API-Clientbibliothek. Batchvorgänge werden von der JavaScript-Clientbibliothek nicht unterstützt.

Zielgruppe

Dieses Dokument richtet sich an Programmierer, die mehrere Vorgänge in einer einzigen Anfrage mithilfe der Batchverarbeitung senden möchten.

In diesem Dokument wird davon ausgegangen, dass Sie mit der GData-Java-Clientbibliothek vertraut sind. Die Beispiele in diesem Dokument zeigen, wie die Java-Clientbibliothek zum Ausführen von Batchvorgängen verwendet wird.

Die Beispiele in diesem Dokument beziehen sich speziell auf die Google Base Data API. Andere Dienste können jedoch auch Batch-Funktionen bereitstellen.

Hinweis: Das Protokoll und die allgemeinen Verfahren sind für andere Clientbibliotheken identisch. Die spezifischen Methoden zum Ausführen von Batchanfragen können sich jedoch unterscheiden. Weitere Informationen finden Sie in der Dokumentation zur Clientbibliothek.

Einführung

Mit einem GData-Batch-Feed können Sie mehrere Einfüge-, Aktualisierungs-, Lösch- und Abfragevorgänge erfassen und diese dann alle gleichzeitig senden und ausführen.

Der folgende Feed enthält beispielsweise vier Vorgänge:

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

Der Dienst führt so viele der angeforderten Änderungen wie möglich aus und gibt Statusinformationen zurück, mit denen Sie den Erfolg oder Misserfolg jedes Vorgangs bewerten können.

Der Dienst versucht, alle Vorgänge innerhalb eines Batches auszuführen, auch wenn einige der im Batch enthaltenen Vorgänge nicht erfolgreich sind.

Batchanfrage senden

Eine Batchanfrage sollte als HTTP POST-Anfrage an eine Batch-URL gesendet werden. Verschiedene Feeds unterstützen unterschiedliche Batchvorgänge. Schreibgeschützte Feeds unterstützen nur Abfragen.

Wenn Sie wissen möchten, ob ein bestimmter Feed Batchvorgänge unterstützt, können Sie ihn abfragen. Wenn der Feed eine „Batch“-Link-Beziehung auf Feedebene enthält, bedeutet das, dass der Feed Batchvorgänge unterstützt.

Eine „Batch“-Linkbeziehung ist ein <link>-Element mit rel="http://schemas.google.com/g/2005#batch". Das Attribut href der Verknüpfungsbeziehung definiert die URL, unter der Feeddokumente für Batchvorgänge gepostet werden können.

Wenn du zum Beispiel GET http://www.google.com/base/feeds/items (den regulären Google Base-Artikelfeed) ausführst, erhältst du möglicherweise die folgende Antwort:

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

In diesem Beispiel lautet die Batch-URL http://www.google.com/base/feeds/items/batch.

Batchvorgangsfeed schreiben

Ein Vorgangsfeed enthält eine Liste von Einträgen, die eingefügt, aktualisiert, gelöscht oder abgefragt werden sollen. Jeder Vorgang wird durch ein <batch:operation type="insert|update|delete|query"/>-Element definiert.

Dieses Element kann ein direktes untergeordnetes Element eines <feed>-Elements, ein direktes untergeordnetes Element eines der Einträge im Feed oder beides sein. Wenn es in einem Eintrag enthalten ist, gibt es den Vorgang an, der für diesen bestimmten Eintrag ausgeführt werden soll. Wenn dieses Element im Feed enthalten ist, gibt es den Standardvorgang an, der für alle Einträge ausgeführt wird, die kein <batch:operation/>-Element haben.

Wenn weder der Eintrag noch der Feed einen Vorgang angibt, ist der Standardvorgang insert.

Anwendungen sollten nicht mehrere Vorgänge auf denselben Eintrag in einem einzelnen Batch-Feed anwenden. Die Ergebnisse sind unbestimmt, wenn Sie mehrere Vorgänge für denselben Eintrag angeben.

Um die Leistung zu verbessern, werden Vorgänge möglicherweise nicht in der Reihenfolge verarbeitet, in der sie angefordert wurden. Das Endergebnis ist jedoch immer dasselbe, wenn die Einträge der Reihe nach verarbeitet wurden.

Die Anzahl der Byte in der XML,die Sie an den Server senden,darf 1 MB (1.048.576 Byte) nicht überschreiten. Im Allgemeinen gibt es keine Begrenzung für die Anzahl der angeforderten Vorgänge, solange die Gesamtgröße der Byte 1 MB nicht überschreitet. Für einige Dienste können jedoch zusätzliche Einschränkungen gelten.

Wenn Sie die Batchvorgänge verwenden möchten, müssen Sie dem <feed>-Element die Batch-Namespace-Deklaration als Attribut hinzufügen:

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

Vorgänge einfügen

Ein Einfügevorgang wird so beschrieben:

<batch:operation type="insert">

Ein Einfügevorgang entspricht dem POSTEN des Eintrags. Wenn der Vorgang erfolgreich ist, wird der gesamte Inhalt des Eintrags mit einem aktualisierten <id>-Element und einem <batch:status code="201"/>-Element zurückgegeben.

Hier ein Beispiel für eine erfolgreiche Einfügungsanfrage:

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

Hier ein Beispiel für eine Antwort auf eine erfolgreiche Einfügungsanfrage:

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

Aktualisierungsvorgänge

<batch:operation type="update">

Ein Aktualisierungsvorgang entspricht dem Ausführen eines PUT für die URL, auf die das <id>-Element des Eintrags verweist. Wenn der Vorgang erfolgreich ist, wird der gesamte Eintrag mit einem <batch:status code="200"/>-Element zurückgegeben.

Hinweis:Bei bestimmten Feeds müssen Sie auch den Link rel="edit" des Eintrags bei Batch-Aktualisierungsanfragen angeben. Dazu gehören diejenigen Feeds, die das V1-Format von Data Optimistic Concurrency von Google Data Protocol unterstützen, sowie Feeds, die keine URLs mit URLs enthalten.

Hier ein Beispiel für eine Aktualisierungsanfrage:

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

Hier ein Beispiel für eine erfolgreiche Antwort:

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

Hinweis: Bei einigen Feeds werden starke ETags verwendet, um zu verhindern, dass Sie versehentlich die Änderungen eines anderen Nutzers ändern. Wenn Sie eine Batch-Aktualisierungsanfrage für einen Eintrag in einem dieser Feeds stellen, müssen Sie den ETag-Wert im Attribut gd:etag des Eintrags angeben. Beispiel: <entry gd:etag="'F08NQAxFdip7IWA6WhVR'">...<batch:operation type="update"/>...

Teilweise Aktualisierung

Feeds, die Teilaktualisierungen unterstützen, können auch in Batchanfragen verwendet werden. Eine teilweise Aktualisierung entspricht der Ausführung einer PATCH für die URL, auf die das <id>-Element des Eintrags verweist. Wenn der Vorgang erfolgreich ist, wird der gesamte Eintrag mit einem <batch:status code="200"/>-Element zurückgegeben.

Hinweis: Bei bestimmten Feeds müssen Sie auch den Link rel="edit" des Eintrags bei Batch-Aktualisierungsanfragen angeben. Dazu gehören diejenigen Feeds, die das V1-Format von Data Optimistic Concurrency von Google Data Protocol unterstützen, sowie Feeds, die keine URLs mit URLs enthalten.

<batch:operation type="patch"/>

Hier ein Beispiel für eine Teilaktualisierungsanfrage:

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

Hier ein Beispiel für eine erfolgreiche Antwort:

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

Vorgänge löschen

<batch:operation type="delete">

Ein Löschvorgang entspricht dem Ausführen eines DELETE für die URL, auf die das <id>-Element des Eintrags verweist. Für einen Löschvorgang müssen Sie nur das Element <id> senden, um den Eintrag zu löschen. Alle anderen Informationen, die Sie in Elementen angeben, die sich nicht im Namespace batch: befinden, werden ignoriert. Wenn der Vorgang erfolgreich ist, wird ein Eintrag mit derselben ID mit einem <batch:status code="200"/>-Element zurückgegeben.

Hinweis: Bei bestimmten Feeds müssen Sie auch den Link rel="edit" des Eintrags bei Batch-Löschanfragen angeben. Dazu gehören diejenigen Feeds, die das V1-Format von Data Optimistic Concurrency von Google Data Protocol unterstützen, sowie Feeds, die keine URLs mit URLs enthalten.

Hier ein Beispiel für eine Löschanfrage:

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

Hier ein Beispiel für eine erfolgreiche Antwort:

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

Hinweis: Bei einigen Feeds werden starke ETags verwendet, um zu verhindern, dass Sie versehentlich die Änderungen eines anderen Nutzers ändern. Wenn Sie eine Batch-Löschanfrage für einen Eintrag in einem dieser Feeds stellen, müssen Sie den ETag-Wert im Attribut gd:etag des Eintrags angeben. Beispiel: <entry gd:etag="'F08NQAxFdip7IWA6WhVR'">...<batch:operation type="delete"/>...

Abfragevorgänge

<batch:operation type="query">

Ein Abfragevorgang entspricht dem Ausführen eines GET für die URL, auf die das <id>-Element des Eintrags verweist. Wenn der Vorgang erfolgreich ist, wird der gesamte Eintraginhalt zurückgegeben.

Hinweis: Bei bestimmten Feeds müssen Sie auch den Link rel="self" des Eintrags in Batchabfragen angeben. Dazu gehören auch Feeds ohne IDs.

Hier ein Beispiel für eine Abfrageanfrage:

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

Hier ein Beispiel für eine erfolgreiche Antwort:

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

Vorgänge verfolgen

GData-Eintragsergebnisse werden nicht unbedingt in derselben Reihenfolge wie die Anfrage zurückgegeben. Sie können einen Vorgang über seine Kennung verfolgen.

Für Aktualisierungs-, Lösch- und Abfragevorgänge können Sie die ID des Eintrags selbst verwenden, um den Vorgang zu verfolgen.

Da bei Vorgängen zum Einfügen noch keine ID vorhanden ist, können Sie eine Vorgangs-ID übergeben. Diese ID kann verwendet werden, um die Ergebniseinträge mit den Anfrageeinträgen zu verknüpfen. Die Vorgangs-ID wird im <batch:id>-Element übergeben.

GData gibt für jeden Vorgang eine Antwort zurück, aus der hervorgeht, ob der Vorgang erfolgreich war oder fehlgeschlagen ist. Jede Antwort gibt den zugehörigen Eintrag an. Bei einem Aktualisierungs-, Lösch- oder Abfragevorgang oder einem erfolgreichen Einfügevorgang wird immer die Eingabe-ID zurückgegeben. Wenn Sie eine Batch-ID angegeben haben, wird diese ebenfalls zurückgegeben. Da fehlgeschlagenen Einfügevorgängen keine Eintrags-ID zugeordnet ist, wird nur die Batch-ID zurückgegeben.

Mit der ID jedes Vorgangs können Sie nur fehlgeschlagene Vorgänge wiederholen und müssen nicht den gesamten Batch noch einmal senden.

Der Inhalt von <batch:id> ist ein vom Client definierter Stringwert, der im entsprechenden Antworteintrag zurückgegeben wird.Sie können einen beliebigen Wert angeben, der dem Client dabei hilft, die Antwort mit dem Eintrag in der ursprünglichen Anfrage zu korrelieren. Dieses Element wird unverändert im entsprechenden Eintrag zurückgegeben, auch wenn der Vorgang fehlgeschlagen ist. GData speichert oder interpretiert den Inhalt dieser Batch-ID nie.

Das folgende Beispiel zeigt einen Batchvorgangsfeed. Das Element <batch:id> kennzeichnet diesen Vorgang als 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>

Das folgende Beispiel zeigt den Batchstatuseintrag, der als Antwort auf diesen Vorgang zurückgegeben wird.

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

Statuscodes verarbeiten

Statuscodes werden durch das folgende Element ausgedrückt:

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

Jeder Eintrag im Antwortfeed enthält ein <batch:status>-Element. Dieses Element beschreibt, was beim Ausführen des Vorgangs passiert ist. Es wird die HTTP-Antwort nachgeahmt, die gesendet worden wäre, wenn der Vorgang einzeln und nicht als Teil eines Batchfeeds gesendet worden wäre.

Sie müssen das Element <batch:status> jedes Eintrags in der Antwort prüfen, um festzustellen, ob der zugehörige Vorgang erfolgreich verarbeitet wurde. Das Attribut code="n" enthält einen GData-Statuscode.

Statusbeschreibungen

Das Attribut reason="reason" des Elements <batch:status> enthält eine ausführlichere Erläuterung des Status des Vorgangs.

Contenttyp

Das Attribut content-type="type" des Elements <batch:status> enthält den MIME-Typ der Daten, die im Element <batch:status> enthalten sind. Dies entspricht dem Content-Type-Header einer HTTP-Statusantwort. Dieses Attribut ist optional.

Wenn der Inhaltstyp festgelegt ist, beschreibt der Textteil des <batch:status>-Elements, was bei der Verarbeitung des Eintrags schiefgelaufen ist.

Unterbrechungen für Vorgänge identifizieren

Das folgende Element ist in der Antwort für einen unterbrochenen Vorgang enthalten:

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

Dieses Element bedeutet, dass die Batchverarbeitung unterbrochen wurde und alle Versuche, die Ursache der Unterbrechung wiederherzustellen, fehlgeschlagen sind. Einige Einträge wurden möglicherweise bereits erfolgreich verarbeitet. Alle Einträge, die vor diesem Zeitpunkt nicht als erfolgreich gemeldet wurden, wurden verworfen.

Dieses Element ist sehr ungewöhnlich und signalisiert in der Regel, dass der im Text der Anfrage gesendete Feed nicht das richtige XML-Format hatte.

Wie beim <batch:status>-Element finden Sie im reason-Attribut einen kurzen Statuscode. Eine längere Antwort kann auch im Element gefunden werden.

Beispiele für Batchvorgänge und Statusfeeds

Hier ist ein Batch-Vorgangsfeed, der an den Server gesendet werden kann. Dieser Feed fordert den Server auf, zwei Einträge zu löschen und zwei neue Einträge hinzuzufügen. Das Element <feed> muss, wie im folgenden Beispiel hervorgehoben, eine Namespace-Deklarierung für einen Batch enthalten.

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>

Angenommen, die beiden Einfügungen haben funktioniert, einer der beiden Löschvorgänge ist jedoch fehlgeschlagen. In diesem Fall könnte der Batchstatusfeed so aussehen: Die Einträge wurden im Vergleich zum Batchvorgangsfeed neu angeordnet.

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

Batchfunktion der GData-Java-Clientbibliothek verwenden

In diesem Abschnitt wird erläutert, wie Sie mit der Batchfunktion der GData-Java-Clientbibliothek eine Gruppe von Einfüge-, Aktualisierungs- und/oder Löschanfragen senden.

In den Beispielen dieses Abschnitts werden die Google Base-APIs verwendet.

Importieren Sie zusätzlich zu den GData- und Google Base-Standardklassen zuerst die erforderlichen Klassen:

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

Wenn Sie eine Batchanfrage senden möchten, müssen Sie die Batch-URL aus einem Feed abrufen. Das folgende Code-Snippet zeigt, wie das geht. Dabei wird davon ausgegangen, dass feed ein GoogleBaseFeed-Objekt ist, das Informationen zu einem Feed enthält:

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
}

Mit dem folgenden Code-Snippet wird ein Feed vorbereitet, in dem zwei Einträge in einem Vorgang eingefügt werden:

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

Der Code in diesem Beispiel gibt nie explizit an, dass der Vorgang für diese Einträge insert ist. Sie müssen dies nicht explizit angeben, da das Einfügen der Standardvorgang ist.

Rufen Sie die Methode Service.batch auf, um den Batch-Feed zu senden und die Ergebnisse zu erhalten.

Wie Service.insert gibt Service.batch auch die eingefügten Einträge mit neuen <atom:id>-Werten zurück. Die zurückgegebenen Einträge sind in einem GoogleBaseFeed-Objekt enthalten.

Wenn Sie beim Einfügen der anderen beiden Einträge einen dritten Eintrag löschen möchten, den Sie bereits in entry3 abgerufen und gespeichert haben, können Sie den folgenden Code verwenden:

GoogleBaseEntry toDelete = new GoogleBaseEntry();


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

feed.addEntry(toDelete);


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

Hier ist service eine Instanz von com.google.gdata.client.Service.

Wenn Sie einen Eintrag aktualisieren möchten, geben Sie OperationType.UPDATE an und initialisieren Sie den Eintrag mit den gewünschten Änderungen, anstatt ihn größtenteils leer zu lassen.

In diesen Beispielen wird das Google Base-Daten-API verwendet. Wenn Sie service.batch mit einem anderen GData-Diensttyp verwenden, ersetzen Sie die Klassen GoogleBaseFeed, GoogleBaseEntry und GoogleBaseService durch die entsprechenden Feed-, Eingabe- und Dienstklassen.

Die Ergebnisse eines Batchvorgangs werden nicht unbedingt in der Reihenfolge zurückgegeben, in der sie angefordert wurden. Im obigen Beispiel könnte der Ergebnisfeed entry2 gefolgt von entry1 enthalten. Sie sollten niemals davon ausgehen, dass Einträge in einer bestimmten Reihenfolge zurückgegeben werden.

Ihr Feed für Batchvorgänge sollte jedem Einfügevorgang eine eindeutige Batch-ID zugewiesen werden, wie unter Vorgänge verfolgen erläutert. In den obigen Beispielen sind die Batch-IDs A und B. Um den Status der angeforderten Vorgänge zu ermitteln, sollten Sie daher die Einträge im zurückgegebenen Batchfeed iterieren und deren Batch-ID oder Eintrags-ID folgendermaßen vergleichen:

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

Jedem Eintrag im zurückgegebenen Feed ist ein BatchStatus-Objekt zugeordnet. Das BatchStatus-Objekt enthält einen HTTP-Rückgabecode und eine Antwort, die beschreibt, was während der Verarbeitung des Eintrags schiefgelaufen ist. Sie müssen den HTTP-Rückgabecode jedes Eintrags prüfen, um festzustellen, ob der Vorgang erfolgreich war.

Die Prüfung wird im obigen Beispiel mit der Convenience-Methode BatchUtils.isSuccess durchgeführt. In diesem Fall entspricht dies BatchUtils.getBatchStatus(entry) < 300.

Weitere Informationen zu Statuscodes und -antworten finden Sie unter Statuscodes verarbeiten.

Nach oben