Gunakan ekstensi - AWS SDK for Java 2.x

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Gunakan ekstensi

DynamoDB Enhanced API Client mendukung ekstensi plugin yang menyediakan fungsionalitas di luar operasi pemetaan. Ekstensi memiliki dua metode kait, beforeWrite() danafterRead(). beforeWrite()memodifikasi operasi tulis sebelum itu terjadi, dan afterRead() metode memodifikasi hasil operasi baca setelah itu terjadi. Karena beberapa operasi (seperti pembaruan item) melakukan penulisan dan kemudian membaca, kedua metode hook dipanggil.

Ekstensi dimuat dalam urutan yang ditentukan dalam pembuat klien yang disempurnakan. Urutan pemuatan dapat menjadi penting karena satu ekstensi dapat bertindak berdasarkan nilai yang telah diubah oleh ekstensi sebelumnya.

Klien yang disempurnakan API dilengkapi dengan satu set ekstensi plugin yang terletak di extensions paket. Secara default, klien yang disempurnakan memuat VersionedRecordExtension file dan fileAtomicCounterExtension. Anda dapat mengganti perilaku default dengan pembuat klien peningkatan dan memuat ekstensi apa pun. Anda juga dapat menentukan none jika Anda tidak ingin ekstensi default.

Jika Anda memuat ekstensi Anda sendiri, klien yang disempurnakan tidak memuat ekstensi default apa pun. Jika Anda menginginkan perilaku yang disediakan oleh salah satu ekstensi default, Anda perlu menambahkannya secara eksplisit ke daftar ekstensi.

Dalam contoh berikut, ekstensi kustom bernama verifyChecksumExtension dimuat setelahVersionedRecordExtension, yang biasanya dimuat secara default dengan sendirinya. AtomicCounterExtensionTidak dimuat dalam contoh ini.

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

VersionedRecordExtension

VersionedRecordExtensionIni dimuat secara default dan akan menambah dan melacak nomor versi item sebagai item ditulis ke database. Sebuah kondisi akan ditambahkan ke setiap penulisan yang menyebabkan penulisan gagal jika nomor versi item tetap yang sebenarnya tidak cocok dengan nilai yang terakhir dibaca aplikasi. Perilaku ini secara efektif memberikan penguncian optimis untuk pembaruan item. Jika proses lain memperbarui item antara waktu proses pertama membaca item dan menulis pembaruan untuk itu, penulisan akan gagal.

Untuk menentukan atribut mana yang akan digunakan untuk melacak nomor versi item, beri tag atribut numerik dalam skema tabel.

Cuplikan berikut menentukan bahwa version atribut harus menyimpan nomor versi item.

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

Pendekatan skema tabel statis setara ditunjukkan dalam cuplikan berikut.

.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

AtomicCounterExtensionIni dimuat secara default dan menambah atribut numerik yang ditandai setiap kali catatan ditulis ke database. Nilai mulai dan kenaikan dapat ditentukan. Jika tidak ada nilai yang ditentukan, nilai awal diatur ke 0 dan nilai atribut meningkat sebesar 1.

Untuk menentukan atribut mana yang merupakan penghitung, beri tag atribut tipe Long dalam skema tabel.

Cuplikan berikut menunjukkan penggunaan nilai awal dan kenaikan default untuk atribut. counter

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

Pendekatan skema tabel statis ditunjukkan dalam cuplikan berikut. Ekstensi penghitung atom menggunakan nilai awal 10 dan menambah nilai sebesar 5 setiap kali catatan ditulis.

.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

AutoGeneratedTimestampRecordExtensionSecara otomatis memperbarui atribut tipe yang ditandai Instant dengan stempel waktu saat ini setiap kali item berhasil ditulis ke database.

Ekstensi ini tidak dimuat secara default. Oleh karena itu, Anda perlu menentukannya sebagai ekstensi khusus saat Anda membangun klien yang disempurnakan seperti yang ditunjukkan pada contoh pertama dalam topik ini.

Untuk menentukan atribut mana yang akan diperbarui dengan stempel waktu saat ini, beri tag Instant atribut dalam skema tabel.

lastUpdateAtribut adalah target perilaku ekstensi dalam cuplikan berikut. Perhatikan persyaratan bahwa atribut harus berupa Instant tipe.

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

Pendekatan skema tabel statis setara ditunjukkan dalam cuplikan berikut.

.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

Anda dapat menghasilkan unik UUID (Universalally Unique Identifier) untuk atribut ketika catatan baru ditulis ke database dengan menggunakan. AutoGeneratedUuidExtension Metode Java JDK UUID.random UUID () menghasilkan nilai dan Anda menerapkan ekstensi ke atribut tipejava.lang.String.

Karena Java SDK tidak memuat ekstensi ini secara default, Anda perlu menentukannya sebagai ekstensi khusus saat Anda membangun klien yang disempurnakan seperti yang ditunjukkan pada contoh pertama dalam topik ini.

uniqueIdAtribut adalah target perilaku ekstensi dalam cuplikan berikut.

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

Pendekatan skema tabel statis setara ditunjukkan dalam cuplikan berikut.

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

Jika Anda ingin ekstensi mengisi UUID satu-satunya putItem metode dan bukan untuk updateItem metode, tambahkan anotasi perilaku pembaruan seperti yang ditunjukkan pada cuplikan berikut.

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

Jika Anda menggunakan pendekatan skema tabel statis, gunakan kode setara berikut.

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

Ekstensi kustom

Kelas ekstensi kustom berikut menunjukkan beforeWrite() metode yang menggunakan ekspresi pembaruan. Setelah baris komentar 2, kita membuat SetAction untuk mengatur registrationDate atribut jika item dalam database belum memiliki registrationDate atribut. Setiap kali Customer objek diperbarui, ekstensi memastikan bahwa a registrationDate disetel.

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