GemfireRepository 插入 List(Domain Class)

GemfireRepository inserting List(Domain Class)

我有场景需要使用 GemfireRepository 插入域列表 类 但它不可用,因为它在 Cassandra 中可用...

@Autowired
private CassandraOperations cassandraTemplate;
cassandraTemplate.insert(List<DomainClass>);

后续问题...

@EnableAsync
public class GenericWriter<K, V> extends CacheWriterAdapter<K, V> implements Declarable {

    private static Logger log = LoggerFactory.getLogger(GenericWriter.class);

    @Autowired
    private CassandraOperations cassandraOperations;

    ExecutorService executor = null;

    /**
     * Cache Writer get called before any event occurs on the cache, where in
     * EntryEvent interface reference has the helper methods
     */
    @Override
    @Async
    public void beforeCreate(EntryEvent<K, V> e) throws CacheWriterException {

        String eventOperation = e.getOperation().toString();
        log.info("#####inside before create#####");
        executor = Executors.newSingleThreadExecutor();

        executor.submit(() -> {
            log.info("****inside submit*****");
            if (eventOperation.equals("CREATE")) {
                log.info("Cache Writer for " + e.getRegion().getName() + " over Cassandra is activated"
                        + e.getNewValue());
                try {
                    cassandraOperations.insert(e.getNewValue());
                } catch (CassandraConnectionFailureException | CassandraWriteTimeoutException
                        | CassandraInternalException cassException) {
                    cassException.printStackTrace();
                    log.info("Cassandra Exception:" + cassException.toString());
                }
                catch (Exception ex){
                    log.info("Exception--------------------"+ex.getStackTrace());
                    ex.printStackTrace();
                }
            }
        });
        executor.shutdown();
    }

    @Override
    public void init(Properties arg0) {
        // TODO Auto-generated method stub

    }
}

Vigneshwaran-

首先,你不是在比较苹果和苹果。

CassandraOperations 不是 SDG 的 GemfireRepository 的 "equivalent"。那将是 SDG 的 GemfireOperations

Spring Data GemFire 的 o.s.d.g.repository.GemfireRepository 接口是 Spring Data Common 的 o.s.d.repository.CrudRepository 接口和 Spring Data Common 的 Repository infrastructure/abstraction 的一部分,它实现了 数据访问对象 (DAO) 模式,通过简单的接口定义具有基本的 CRUD 和查询功能。有关详细信息,请参阅 here

Spring Data Cassandra 还通过 CassandraRepository 扩展和实现了 SD Commons 的存储库基础设施。因此,CassandraRepositoryGemfireRepository等价。

现在,至于 "inserting a list of application domain types"...好吧,如果您使用的是 SDG 的 GemfireOperations(由 SDG 的 GemfireTemplate) you can insert multiple application domain objects into GemFire using the gemfireTemplate.putAll(:Map<K, V>) 操作实现。

如您所见,putAll(..) 方法接受一个 java.util.Map,其中键是标识符,值是您的应用程序域对象。

让我们暂时假设您有一个 Customer 应用程序域类型...

@Region("Customers")
class Customer {

  @Id
  private Long id;

  private String name;

  // constructor(s), getter/setters, equals, hashCode, toString, etc
}

那么你可以...

@Resource(name = "Customers"
private Region<Long, Customer> customers;

...

private GemfireOperations customersTemplate = new GemfireTemplate(customers);

...

Customer jonDoe = new Customer(1L, "Jon Doe");
Customer janeDoe = new Customer(2L, "Jane", "Doe");

Map<Long, Customer> customers = ...;

customers.put(jonDoe.getId(), jonDoe);
customers.put(janeDoe.getId(), janeDoe);

customersTemplate.putAll(customers);

但是,这是相当多的样板代码。使用 SDG 的存储库抽象和扩展要简单得多。首先你会像这样定义一个 CustomerRepository...

public interface CustomerRepository extends GemfireRepository<Customer, Long> { ... }

然后您可以使用...

保存 Customersjava.util.List
List<Customer> customers = Arrays.asList(jonDoe, janeDoe);

customerRepository.save(customers);

记住,SDG 的 GemfireRepository 扩展了 SD Common 的 o.s.d.repository.CrudRepository. SD Common's o.s.d.repository.CrudRepository has a save(:Iterable<S>) 方法,其中...

SCrudRepository<T, ID> 中扩展了 T

并且,由于 java.util.List 是一个 Iterable<E>,您可以使用一种方法来保存多个实体或特定类型的应用程序域对象(例如 Customer)。

SDG Repository 基础设施扩展的另一个便利功能是...

它将检查应用程序域类型(例如 Customer),它会看到 Customer 被注释为 SDG 的 @Region annotation and use the value to determine the GemFire Region (i.e. "Customers" from above) in which to persist entities of type Customer and also use the @Id annotated 字段(或 属性,例如 getId() on Customer) 以确定实体将映射到的 "Customers" 区域中的 "key"。

无论如何,您只是深入挖掘了一点,阅读 docs and look at the API

都在那里。

希望对您有所帮助!

-约翰