首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Quarkus中异步持久化数据

在Quarkus中异步持久化数据
EN

Stack Overflow用户
提问于 2020-09-15 17:00:47
回答 1查看 412关注 0票数 2

我正在尝试使用Quarkus和Hibernate-Panache异步保存一些数据:

代码语言:javascript
运行
复制
  Executors.newFixedThreadPool(1).execute(new Runnable() {
        @Override
        @Transactional // I need a transaction to persist the data
        public void run() {
            List<List<String>> myData = myCsvParser.parse(data);
            myRepository.importData(myData, myID);
            myBusinessService.doBusinessLogic(myID);
        }

不幸的是,我得到了:

代码语言:javascript
运行
复制
Exception in thread "pool-5-thread-1" javax.enterprise.context.ContextNotActiveException: interface javax.enterprise.context.RequestScoped
    at io.quarkus.hibernate.orm.runtime.RequestScopedEntityManagerHolder_ClientProxy.arc$delegate(RequestScopedEntityManagerHolder_ClientProxy.zig:68)
    at io.quarkus.hibernate.orm.runtime.RequestScopedEntityManagerHolder_ClientProxy.getOrCreateEntityManager(RequestScopedEntityManagerHolder_ClientProxy.zig:220)
    at io.quarkus.hibernate.orm.runtime.entitymanager.TransactionScopedEntityManager.getEntityManager(TransactionScopedEntityManager.java:77)
    at io.quarkus.hibernate.orm.runtime.entitymanager.TransactionScopedEntityManager.contains(TransactionScopedEntityManager.java:285)

这里有一个复制器项目:https://github.com/MarcusBiel/quarkus-reproducer

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2020-09-15 20:07:14

在Quarkus Zulip聊天中Martin Kouba @martunek (et all)的帮助下,我让它像这样工作:

代码语言:javascript
运行
复制
 @Dependent
public class MyTask implements Runnable {

    @Inject
    private MyParser myParser;

    @Inject
    private MyBusinessService myBusinessService;

    @Inject
    private MyRepository myRepository;

    private String csvData;
    private String myId;

    @Override
    @Transactional
    @ActivateRequestContext
    public void run() {
        List<List<String>> myData = csvParser.parse(csvData);
        myRepository.importData(myData, myId);
        myBusinessService.myBusinessMethod(myId);

    }

    public void setCsvData(String csvData) {
        this.csvData = csvData;
    }

    public void setMyId(String myId) {
        this.myId = myId;
    }
}

在"MyService“中,我们像这样执行这个任务:

代码语言:javascript
运行
复制
ExecutorService executor = Executors.newFixedThreadPool(1);
MyTask myTask = Arc.container().instance(MyTask.class).get();
myTask.setCsvData(csvData);
myTask.setMyId(myId);
executor.execute(myTask);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63898482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档