簡體   English   中英

在Spring事務中將JPA實體批量索引修改為Elasticsearch索引

[英]Bulkindexing JPA Entities modified during Spring transaction to Elasticsearch index

我有一個JPA實體類,它也是一個Elasticsearch文檔。 該環境是一個使用Spring Data Jpa和Spring Data Elasticsearch的Spring Boot應用程序。

@Entity
@Document(indexname...etc)
@EntityListeners(MyJpaEntityListener.class)
public class MyEntity {
    //ID, constructor and stuff following here
}

創建,更新或刪除此實體的實例時,會將其重新索引到Elasticsearch。 當前,這是通過對PostPersist,PostUpdate和PostRemove事件做出反應的JPA EntityListener來實現的。

public class MyJpaEntityListener {

    @PostPersist
    @PostUpdate
    public void postPersistOrUpdate(MyEntity entity) {
        //Elasticsearch indexing code gets here
    }

    @PostRemove
    public void postPersistOrUpdate(MyEntity entity) {
        //Elasticsearch indexing code gets here
    }
}

當在單個事務中修改單個或幾個實體時,一切都很好。 每次修改都會觸發單獨的索引操作。 但是,如果許多實體在事務內被修改,它將變得很慢。

我想對在事務結束時(或提交后)修改過的所有實體進行批量索引。 我看了一下TransactionalEventListeners,AOP和TransactionSynchronizationManager,但是到目前為止,還沒有一個好的設置。

如何以一種優雅的方式收集每個事務的所有已修改實體,而無需自己親自處理每種服務方法?

以及如何在事務結束時使用該事務的已收集實體觸發bulkindex。

感謝您的時間和幫助!

我不認為服務和實體與Elasticsearch相關代碼混合使用,這是一種與眾不同的優雅方法,即在服務層事務處理方法中將spring方面與@AfterReturning一起使用。

可以調整切入點表達式以捕獲所需的所有服務方法。

@Order(1)保證該代碼將在事務提交后運行。

下面的代碼只是一個示例...您必須對其進行調整以適合您的項目。

@Aspect
@Component()
@Order(1)
public class StoreDataToElasticAspect {

    @Autowired
    private SampleElasticsearhRepository elasticsearchRepository;


    @AfterReturning(pointcut = "execution(* com.example.DatabaseService.bulkInsert(..))")
    public void synonymsInserted(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        //create elasticsearch documents from method params.
        //can also inject database services if more information is needed for the documents.
        List<String> ids = (List) args[0];
        //create batch from ids
       elasticsearchRepository.save(batch);
    }
}

這是一個有關日志記錄方面的示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM