Modification d'une application du kit SDK pour Java 1.x pour utiliser DAX - Amazon DynamoDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Modification d'une application du kit SDK pour Java 1.x pour utiliser DAX

Si vous disposez déjà d'une application Java utilisant Amazon DynamoDB, vous devez la modifier pour qu'elle puisse accéder à votre cluster DynamoDB Accelerator (DAX). Le client Java étant similaire au client de bas niveau DynamoDB inclus dans l'AWS SDK for Java, vous n'avez pas besoin de réécrire entièrement l'application.

Note

Ces instructions s'appliquent aux applications utilisant le kit SDK AWS pour Java 1.x. Pour les applications utilisant le kit SDK AWS pour Java 2.x, consultez Modification d'une application existante pour utiliser DAX .

Supposez que vous disposez d'une table DynamoDB nommée Music. La clé de partition de la table est Artist et sa clé de tri est SongTitle. Le programme suivant lit un élément directement dans la table Music.

import java.util.HashMap; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.amazonaws.services.dynamodbv2.model.GetItemRequest; import com.amazonaws.services.dynamodbv2.model.GetItemResult; public class GetMusicItem { public static void main(String[] args) throws Exception { // Create a DynamoDB client AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); HashMap<String, AttributeValue> key = new HashMap<String, AttributeValue>(); key.put("Artist", new AttributeValue().withS("No One You Know")); key.put("SongTitle", new AttributeValue().withS("Scared of My Shadow")); GetItemRequest request = new GetItemRequest() .withTableName("Music").withKey(key); try { System.out.println("Attempting to read the item..."); GetItemResult result = client.getItem(request); System.out.println("GetItem succeeded: " + result); } catch (Exception e) { System.err.println("Unable to read item"); System.err.println(e.getMessage()); } } }

Pour modifier le programme, vous remplacez le client DynamoDB par un client DAX.

import java.util.HashMap; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazon.dax.client.dynamodbv2.AmazonDaxClientBuilder; import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.amazonaws.services.dynamodbv2.model.GetItemRequest; import com.amazonaws.services.dynamodbv2.model.GetItemResult; public class GetMusicItem { public static void main(String[] args) throws Exception { //Create a DAX client AmazonDaxClientBuilder daxClientBuilder = AmazonDaxClientBuilder.standard(); daxClientBuilder.withRegion("us-east-1").withEndpointConfiguration("mydaxcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111"); AmazonDynamoDB client = daxClientBuilder.build(); /* ** ... ** Remaining code omitted (it is identical) ** ... */ } }

Utilisation de l'API de document DynamoDB

L'AWS SDK for Java fournit une interface de document pour DynamoDB. L'API Document agit en tant qu'encapsuleur englobant le client DynamoDB de bas niveau. Pour plus d'informations, consultez Interfaces de document.

L'interface de document peut également être utilisée avec le client DAX de bas niveau comme dans l'exemple suivant.

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazon.dax.client.dynamodbv2.AmazonDaxClientBuilder; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.GetItemOutcome; import com.amazonaws.services.dynamodbv2.document.Table; public class GetMusicItemWithDocumentApi { public static void main(String[] args) throws Exception { //Create a DAX client AmazonDaxClientBuilder daxClientBuilder = AmazonDaxClientBuilder.standard(); daxClientBuilder.withRegion("us-east-1").withEndpointConfiguration("mydaxcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111"); AmazonDynamoDB client = daxClientBuilder.build(); // Document client wrapper DynamoDB docClient = new DynamoDB(client); Table table = docClient.getTable("Music"); try { System.out.println("Attempting to read the item..."); GetItemOutcome outcome = table.tgetItemOutcome( "Artist", "No One You Know", "SongTitle", "Scared of My Shadow"); System.out.println(outcome.getItem()); System.out.println("GetItem succeeded: " + outcome); } catch (Exception e) { System.err.println("Unable to read item"); System.err.println(e.getMessage()); } } }

Client asynchrone DAX

AmazonDaxClient est synchrone. Pour une opération d'API DAX de longue durée, par exemple une opération Scan exécutée sur une table volumineuse, ce client peut bloquer l'exécution du programme jusqu'à la fin de l'opération. Si votre programme doit effectuer d'autres tâches au cours d'une opération d'API DAX, vous pouvez utiliser ClusterDaxAsyncClient à la place.

Le programme suivant montre comment utiliser ClusterDaxAsyncClient avec Future de Java pour implémenter une solution sans blocage.

import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import com.amazon.dax.client.dynamodbv2.ClientConfig; import com.amazon.dax.client.dynamodbv2.ClusterDaxAsyncClient; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.handlers.AsyncHandler; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsync; import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.amazonaws.services.dynamodbv2.model.GetItemRequest; import com.amazonaws.services.dynamodbv2.model.GetItemResult; public class DaxAsyncClientDemo { public static void main(String[] args) throws Exception { ClientConfig daxConfig = new ClientConfig().withCredentialsProvider(new ProfileCredentialsProvider()) .withEndpoints("mydaxcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111"); AmazonDynamoDBAsync client = new ClusterDaxAsyncClient(daxConfig); HashMap<String, AttributeValue> key = new HashMap<String, AttributeValue>(); key.put("Artist", new AttributeValue().withS("No One You Know")); key.put("SongTitle", new AttributeValue().withS("Scared of My Shadow")); GetItemRequest request = new GetItemRequest() .withTableName("Music").withKey(key); // Java Futures Future<GetItemResult> call = client.getItemAsync(request); while (!call.isDone()) { // Do other processing while you're waiting for the response System.out.println("Doing something else for a few seconds..."); Thread.sleep(3000); } // The results should be ready by now try { call.get(); } catch (ExecutionException ee) { // Futures always wrap errors as an ExecutionException. // The *real* exception is stored as the cause of the // ExecutionException Throwable exception = ee.getCause(); System.out.println("Error getting item: " + exception.getMessage()); } // Async callbacks call = client.getItemAsync(request, new AsyncHandler<GetItemRequest, GetItemResult>() { @Override public void onSuccess(GetItemRequest request, GetItemResult getItemResult) { System.out.println("Result: " + getItemResult); } @Override public void onError(Exception e) { System.out.println("Unable to read item"); System.err.println(e.getMessage()); // Callers can also test if exception is an instance of // AmazonServiceException or AmazonClientException and cast // it to get additional information } }); call.get(); } }