跳到主要内容

7. 存储

以下示例显示了如何为此仓库创建实现:

package io.micronaut.microstream.docs;

import io.micronaut.core.annotation.NonNull;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.Optional;
import java.util.UUID;

public interface CustomerRepository {

@NonNull
Customer save(@NonNull @NotNull @Valid CustomerSave customerSave);

void update(@NonNull @NotBlank String id,
@NonNull @NotNull @Valid CustomerSave customerSave);

@NonNull
Optional<Customer> findById(@NonNull @NotBlank String id);

void deleteById(@NonNull @NotBlank String id);
}

7.1 StorageManager

以下示例显示了如何创建一个仓库,该仓库注入 StorageManager 并检索根实例:

@Singleton
public class CustomerRepositoryImpl implements CustomerRepository {

private final StorageManager storageManager;

public CustomerRepositoryImpl(StorageManager storageManager) { //
this.storageManager = storageManager;
}

@Override
@NonNull
public Customer save(@NonNull @NotNull @Valid CustomerSave customerSave) {
return XThreads.executeSynchronized(() -> { //
String id = UUID.randomUUID().toString();
Customer customer = new Customer(id, customerSave.getFirstName(), customerSave.getLastName());
data().getCustomers().put(id, customer);
storageManager.store(data().getCustomers()); //
return customer;
});
}

@Override
public void update(@NonNull @NotBlank String id,
@NonNull @NotNull @Valid CustomerSave customerSave) {
XThreads.executeSynchronized(() -> { //
Customer c = data().getCustomers().get(id);
c.setFirstName(customerSave.getFirstName());
c.setLastName(customerSave.getLastName());
storageManager.store(c); //
});
}

@Override
@NonNull
public Optional<Customer> findById(@NonNull @NotBlank String id) {
return Optional.ofNullable(data().getCustomers().get(id));
}

@Override
public void deleteById(@NonNull @NotBlank String id) {
XThreads.executeSynchronized(() -> { //
data().getCustomers().remove(id);
storageManager.store(data().getCustomers()); //
});
}

private Data data() {
return (Data) storageManager.root();
}
}
  1. 如果 Micronaut 应用程序只有一个 MicroStream 实例,则不需要指定名称限定符来注入 StorageManager
  2. 当你在多线程环境中使用 MicroStream 技术时,必须同步读取和写入此共享对象图。
  3. 要存储新创建的对象,请存储该对象的“所有者”

7.2 使用注解

以下示例显示了等效实现如何利用 Micronaut MicroStream 注解来简化对象存储。

@Singleton
public class CustomerRepositoryStoreImpl implements CustomerRepository {

private final RootProvider<Data> rootProvider;

public CustomerRepositoryStoreImpl(RootProvider<Data> rootProvider) { //
this.rootProvider = rootProvider;
}

@Override
@NonNull
public Customer save(@NonNull @NotNull @Valid CustomerSave customerSave) {
return addCustomer(rootProvider.root().getCustomers(), customerSave);
}

@Override
public void update(@NonNull @NotBlank String id,
@NonNull @NotNull @Valid CustomerSave customerSave) {
updateCustomer(id, customerSave);
}

@Override
@NonNull
public Optional<Customer> findById(@NonNull @NotBlank String id) {
return Optional.ofNullable(rootProvider.root().getCustomers().get(id));
}

@Override
public void deleteById(@NonNull @NotBlank String id) {
removeCustomer(rootProvider.root().getCustomers(), id);
}

@StoreReturn //
@Nullable
protected Customer updateCustomer(@NonNull String id,
@NonNull CustomerSave customerSave) {
Customer c = rootProvider.root().getCustomers().get(id);
if (c != null) {
c.setFirstName(customerSave.getFirstName());
c.setLastName(customerSave.getLastName());
return c;
}
return null;
}

@StoreParams("customers") //
protected Customer addCustomer(@NonNull Map<String, Customer> customers,
@NonNull CustomerSave customerSave) {
Customer customer = new Customer(UUID.randomUUID().toString(),
customerSave.getFirstName(),
customerSave.getLastName());
customers.put(customer.getId(), customer);
return customer;
}

@StoreParams("customers") //
protected void removeCustomer(@NonNull Map<String, Customer> customers,
@NonNull String id) {
customers.remove(id);
}
}
  1. 你还可以注入 RootProvider 的实例,以便轻松访问 MicroStream 根实例。如果你的 Micronaut 应用程序只有一个 MicroStream 实例,则不需要指定名称限定符来注入它。
  2. 规则是:“必须存储已修改的对象!”
  3. 要存储新创建的对象,请存储该对象的“所有者”
注意

Micronaut MicroStream 注解仅适用于同步方法。它不对返回 PublisherCompletableFuture 的方法执行任何逻辑操作。对于这些情况,请直接使用 StorageManager

英文链接