Usa le estensioni - AWS SDK for Java 2.x

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Usa le estensioni

Il DynamoDB Enhanced API Client supporta le estensioni dei plugin che forniscono funzionalità che vanno oltre le operazioni di mappatura. Le estensioni hanno due metodi hook, e. beforeWrite() afterRead() beforeWrite()modifica un'operazione di scrittura prima che venga eseguita e il afterRead() metodo modifica i risultati di un'operazione di lettura dopo l'operazione. Poiché alcune operazioni (come l'aggiornamento degli elementi) eseguono sia un'operazione di scrittura che una successiva lettura, vengono chiamati entrambi i metodi hook.

Le estensioni vengono caricate nell'ordine in cui sono specificate nel generatore di client avanzato. L'ordine di caricamento può essere importante perché un'estensione può agire su valori che sono stati trasformati da un'estensione precedente.

Il client avanzato API viene fornito con un set di estensioni del plug-in che si trovano nel extensions pacchetto. Per impostazione predefinita, il client avanzato carica VersionedRecordExtension e ilAtomicCounterExtension. È possibile sovrascrivere il comportamento predefinito con Enhance Client Builder e caricare qualsiasi estensione. Puoi anche specificarne nessuna se non desideri le estensioni predefinite.

Se carichi le tue estensioni, il client avanzato non carica alcuna estensione predefinita. Se desideri il comportamento fornito da una delle estensioni predefinite, devi aggiungerla esplicitamente all'elenco delle estensioni.

Nell'esempio seguente, un'estensione personalizzata denominata verifyChecksumExtension viene caricata dopo ilVersionedRecordExtension, che di solito viene caricata automaticamente per impostazione predefinita. In questo esempio non AtomicCounterExtension viene caricato.

DynamoDbEnhancedClientExtension versionedRecordExtension = VersionedRecordExtension.builder().build(); DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder() .dynamoDbClient(dynamoDbClient) .extensions(versionedRecordExtension, verifyChecksumExtension) .build();

VersionedRecordExtension

VersionedRecordExtensionViene caricato per impostazione predefinita e incrementa e tiene traccia del numero di versione di un elemento man mano che gli elementi vengono scritti nel database. A ogni scrittura verrà aggiunta una condizione che causa l'esito negativo della scrittura se il numero di versione dell'elemento persistente effettivo non corrisponde al valore letto l'ultima volta dall'applicazione. Questo comportamento fornisce in modo efficace un blocco ottimistico per gli aggiornamenti degli elementi. Se un altro processo aggiorna un elemento tra il momento in cui il primo processo ha letto l'elemento e lo sta scrivendo, la scrittura avrà esito negativo.

Per specificare l'attributo da utilizzare per tenere traccia del numero di versione dell'articolo, contrassegnate un attributo numerico nello schema della tabella.

Il frammento seguente specifica che l'versionattributo deve contenere il numero di versione dell'articolo.

@DynamoDbVersionAttribute public Integer getVersion() {...}; public void setVersion(Integer version) {...};

L'approccio equivalente allo schema di tabella statica è illustrato nel frammento seguente.

.addAttribute(Integer.class, a -> a.name("version") .getter(Customer::getVersion) .setter(Customer::setVersion) // Apply the 'version' tag to the attribute. .tags(VersionedRecordExtension.AttributeTags.versionAttribute())

AtomicCounterExtension

AtomicCounterExtensionViene caricato per impostazione predefinita e incrementa un attributo numerico con tag ogni volta che un record viene scritto nel database. È possibile specificare valori iniziali e incrementali. Se non viene specificato alcun valore, il valore iniziale viene impostato su 0 e il valore dell'attributo aumenta di 1.

Per specificare quale attributo è un contatore, contrassegnate un attributo di tipo Long nello schema della tabella.

Il frammento seguente mostra l'uso dei valori di inizio e incremento predefiniti per l'attributo. counter

@DynamoDbAtomicCounter public Long getCounter() {...}; public void setCounter(Long counter) {...};

L'approccio allo schema di tabella statica è illustrato nel frammento seguente. L'estensione del contatore atomico utilizza un valore iniziale di 10 e incrementa il valore di 5 ogni volta che viene scritto il record.

.addAttribute(Integer.class, a -> a.name("counter") .getter(Customer::getCounter) .setter(Customer::setCounter) // Apply the 'atomicCounter' tag to the attribute with start and increment values. .tags(StaticAttributeTags.atomicCounter(10L, 5L))

AutoGeneratedTimestampRecordExtension

Aggiorna AutoGeneratedTimestampRecordExtension automaticamente gli attributi di tipo contrassegnati Instant con un timestamp corrente ogni volta che l'elemento viene scritto correttamente nel database.

Questa estensione non viene caricata per impostazione predefinita. Pertanto, è necessario specificarla come estensione personalizzata quando si crea il client avanzato, come illustrato nel primo esempio di questo argomento.

Per specificare l'attributo da aggiornare con il timestamp corrente, contrassegnate l'Instantattributo nello schema della tabella.

L'lastUpdateattributo è l'obiettivo del comportamento delle estensioni nel seguente frammento. Nota il requisito secondo cui l'attributo deve essere di Instant tipo.

@DynamoDbAutoGeneratedTimestampAttribute public Instant getLastUpdate() {...} public void setLastUpdate(Instant lastUpdate) {...}

L'approccio equivalente allo schema di tabella statica è illustrato nel frammento seguente.

.addAttribute(Instant.class, a -> a.name("lastUpdate") .getter(Customer::getLastUpdate) .setter(Customer::setLastUpdate) // Applying the 'autoGeneratedTimestamp' tag to the attribute. .tags(AutoGeneratedTimestampRecordExtension.AttributeTags.autoGeneratedTimestampAttribute())

AutoGeneratedUuidExtension

È possibile generare un identificatore univoco UUID (Universally Unique Identifier) per un attributo quando un nuovo record viene scritto nel database utilizzando il. AutoGeneratedUuidExtension Il metodo Java JDK UUID.random UUID () genera il valore e l'estensione viene applicata a un attributo di tipo. java.lang.String

Poiché Java SDK non carica questa estensione per impostazione predefinita, è necessario specificarla come estensione personalizzata quando si crea il client avanzato, come illustrato nel primo esempio di questo argomento.

L'uniqueIdattributo è l'obiettivo del comportamento dell'estensione nel frammento seguente.

@AutoGeneratedUuidExtension public String getUniqueId() {...} public void setUniqueId(String uniqueId) {...}

L'approccio equivalente allo schema di tabella statica è illustrato nel frammento seguente.

.addAttribute(String.class, a -> a.name("uniqueId") .getter(Customer::getUniqueId) .setter(Customer::setUniqueId) // Applying the 'autoGeneratedUuid' tag to the attribute. .tags(AutoGeneratedUuidExtension.AttributeTags.autoGeneratedUuidAttribute())

Se desideri che l'estensione compili UUID solo per i putItem metodi e non per i updateItem metodi, aggiungi l'annotazione sul comportamento di aggiornamento come mostrato nel seguente frammento.

@AutoGeneratedUuidExtension @DynamoDbUpdateBehavior(UpdateBehavior.WRITE_IF_NOT_EXISTS) public String getUniqueId() {...} public void setUniqueId(String uniqueId) {...}

Se utilizzate l'approccio dello schema a tabella statica, utilizzate il seguente codice equivalente.

.addAttribute(String.class, a -> a.name("uniqueId") .getter(Customer::getUniqueId) .setter(Customer::setUniqueId) // Applying the 'autoGeneratedUuid' tag to the attribute. .tags(AutoGeneratedUuidExtension.AttributeTags.autoGeneratedUuidAttribute(), StaticAttributeTags.updateBehavior(UpdateBehavior.WRITE_IF_NOT_EXISTS))

Estensioni personalizzate

La seguente classe di estensione personalizzata mostra un beforeWrite() metodo che utilizza un'espressione di aggiornamento. Dopo la riga di commento 2, creiamo un SetAction attributo per impostare l'registrationDateattributo se l'elemento nel database non ha già un registrationDate attributo. Ogni volta che un Customer oggetto viene aggiornato, l'estensione si assicura che a registrationDate sia impostato.

public final class CustomExtension implements DynamoDbEnhancedClientExtension { // 1. In a custom extension, use an UpdateExpression to define what action to take before // an item is updated. @Override public WriteModification beforeWrite(DynamoDbExtensionContext.BeforeWrite context) { if ( context.operationContext().tableName().equals("Customer") && context.operationName().equals(OperationName.UPDATE_ITEM)) { return WriteModification.builder() .updateExpression(createUpdateExpression()) .build(); } return WriteModification.builder().build(); // Return an "empty" WriteModification instance if the extension should not be applied. // In this case, if the code is not updating an item on the Customer table. } private static UpdateExpression createUpdateExpression() { // 2. Use a SetAction, a subclass of UpdateAction, to provide the values in the update. SetAction setAction = SetAction.builder() .path("registrationDate") .value("if_not_exists(registrationDate, :regValue)") .putExpressionValue(":regValue", AttributeValue.fromS(Instant.now().toString())) .build(); // 3. Build the UpdateExpression with one or more UpdateAction. return UpdateExpression.builder() .addAction(setAction) .build(); } }