Axon參考指南 - 聚合事件回放

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 註解的方法被觸發,更改聚合爲當初狀態。
在這裏插入圖片描述
只能回放一次,重啓服務後可繼續回放。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章