1.配置Repository
@Bean
public Cache cache() {
return new WeakReferenceCache();
}
@Bean
public Repository<OrderAggregate> orderAggregateRepository(EventStore eventStore, Cache cache) {
return EventSourcingRepository.builder(OrderAggregate.class)
.cache(cache)
.eventStore(eventStore)
.build();
}
2.找到聚合id
自己設計處理
3.repository.load
@Autowired
private Repository<OrderAggregate> repository;
...
// 1.找到聚合
String aggregateIdentifier = "856bcb33-7e47-4159-8e68-c4feaea86dc6";
Aggregate<OrderAggregate> load = repository.load(aggregateIdentifier);
...
保留測試代碼,方便以後查看…
@QueryHandler
public List<OrderedProduct> handle(FindAllOrderedProductsQuery query) throws Exception {
System.out.println("查詢~");
// 1.找到聚合
String aggregateIdentifier = "856bcb33-7e47-4159-8e68-c4feaea86dc6";
Aggregate<OrderAggregate> load = repository.load(aggregateIdentifier);
System.out.println("聚合:\n" + load.identifierAsString() + "\n" + load.type() + "\n" + load.isDeleted() + "\n" + load.version());
//
// PlaceOrderCommand command = new PlaceOrderCommand(load.identifierAsString(), null);
// CommandMessage<Object> message = GenericCommandMessage.asCommandMessage(command);
//
//
// // 2.根據聚合標識找到 DomainEventEntry
//
// DomainEventEntry eventEntry = null;
//
// EntityManager entityManager = entityManagerProvider.getEntityManager();
// aggregateIdentifier
// String jpql = "select de from DomainEventEntry de where de.aggregateIdentifier =:aggregateIdentifier";
// TypedQuery<DomainEventEntry> query1 = entityManager.createQuery(jpql, DomainEventEntry.class);
// query1.setParameter("aggregateIdentifier", load.identifierAsString());
// Optional<DomainEventEntry> domainEventEntry = query1.getResultStream().findAny();
//
//
// if (domainEventEntry.isPresent()) {
// eventEntry = domainEventEntry.get();
// }
// byte[] data = eventEntry.getPayload().getData();
//
// ByteArrayInputStream bis = new ByteArrayInputStream(data);
//
// ObjectInputStream ois = new ObjectInputStream(bis);
//
// Object o = ois.readObject();
// 3.拿到payload中的事件,在此聚合內再次執行(回放)
// OrderPlacedEvent event = new OrderPlacedEvent();
// EventMessage<Object> objectEventMessage = GenericEventMessage.asEventMessage(event);
//
// Object handle = load.handle(objectEventMessage);
return new ArrayList<>(orderedProducts.values());
}
4. 回放操作
聚合內的 @EventSourcingHandler
註解的方法被觸發,更改聚合爲當初狀態。
只能回放一次,重啓服務後可繼續回放。