当前位置: 首页 > 知识库问答 >
问题:

Quarkus CDI上下文与Kotlin协程

金飞
2023-03-14

我试图将一些Hibernate/Hibernate搜索调用卸载到另一个线程,但我收到的错误表明CDI没有在该线程中正确设置。

我已经看过这本指南了https://quarkus.io/guides/context-propagation,但没有提到科特林合作项目。

有什么方法可以通过协同程序进行上下文传播吗?

我正在用

val entityReferences = withContext(Dispatchers.IO ) {
    //hibernate code here
}
javax.enterprise.context.ContextNotActiveException
    at io.quarkus.arc.impl.ClientProxies.getDelegate(ClientProxies.java:40)
    at io.quarkus.hibernate.orm.runtime.RequestScopedSessionHolder_ClientProxy.arc$delegate(RequestScopedSessionHolder_ClientProxy.zig:42)
    at io.quarkus.hibernate.orm.runtime.RequestScopedSessionHolder_ClientProxy.getOrCreateSession(RequestScopedSessionHolder_ClientProxy.zig:102)
    at io.quarkus.hibernate.orm.runtime.session.TransactionScopedSession.acquireSession(TransactionScopedSession.java:104)
    at io.quarkus.hibernate.orm.runtime.session.TransactionScopedSession.createQuery(TransactionScopedSession.java:376)
    at io.quarkus.hibernate.orm.runtime.session.ForwardingSession.createQuery(ForwardingSession.java:188)
    at io.quarkus.hibernate.orm.runtime.session.ForwardingSession.createQuery(ForwardingSession.java:47)
    at org.hibernate.Session_5b93bee577ae2f8d76647de04cfab36afbf52958_Synthetic_ClientProxy.createQuery(Session_5b93bee577ae2f8d76647de04cfab36afbf52958_Synthetic_ClientProxy.zig:927)

共有1个答案

马弘和
2023-03-14

我通过创建一个定制的协同程序上下文,成功地将请求范围的上下文附加到线程。

class RequestContextElement(private val controller: RequestContextController) : ThreadContextElement<Boolean>, AbstractCoroutineContextElement(Key) {
    companion object Key : CoroutineContext.Key<RequestContextElement>
    override fun updateThreadContext(context: CoroutineContext) = controller.activate()
    override fun restoreThreadContext(context: CoroutineContext, oldState: Boolean) = controller.deactivate()
}

RequestContextController注入到创建协同路由的bean中。

@Inject
protected lateinit var requestContextController: RequestContextController

然后将自定义上下文添加到协同程序上下文中

val entityReferences = withContext(Dispatchers.IO + RequestContextElement(requestContextController)) {
// Hibernate code
}

我使用了以下资源

  • https://codingwithmohit.com/coroutines/custom-coroutine-context-uses-cases/
  • https://rmannibucau.metawerx.net/cdi-2.0-request-scope-controller.html

如果有必要,第一个资源也可能是传播事务的一些帮助。

 类似资料:
  • 我多年来一直在使用Spring MVC,我试图理解与Spring Boot的一些关键区别。 你能帮我确认一下吗?或者让我明白我在这里遗漏了什么?

  • 我在Grails应用程序中很好地使用Liquibase变更集上下文时遇到了一个问题。我有一组变更集,我只想在“测试”上下文中运行。但是,它们每次都在执行。我想我有配置问题。 根据我的理解,在最后一行中,我告诉databasemigration插件将“Development”上下文设置为“Development”,因此当Liquibase执行时,它不应该运行上面的变更集,因为它是在“Test”上下文

  • 本文向大家介绍Kotlin如何捕获上下文中的变量与常量详解,包括了Kotlin如何捕获上下文中的变量与常量详解的使用技巧和注意事项,需要的朋友参考一下 Lambda表达式或匿名函数可以访问或修改其所在上下文中的变量和常量,这个过程被称为捕获。 上例中顶一个一个局部函数,这个局部函数可访问或修改其所在函数中的变量。 Lambda表达式或匿名函数都会持有一个其所捕获的变量的副本,因此表面上看addEl

  • 我看到的主题,如如何下载文件在Android使用改造库?,他们使用和RxJava/回调。 我有Kotlin、协同程序、改装2.6.0和类似于中的查询https://stackoverflow.com/a/56473934/2914140: 我有一个改装客户: 如果令牌参数正确,查询将返回PDF文件: 如果是错误的,它将返回带有错误描述的JSON: 因此,ExportResponse是一个包含JSO

  • 本文向大家介绍基于python实现FTP文件上传与下载操作(ftp&sftp协议),包括了基于python实现FTP文件上传与下载操作(ftp&sftp协议)的使用技巧和注意事项,需要的朋友参考一下 前言 FTP(File Transfer Protocol)是文件传输协议的简称。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。用户可以通过它把自己的

  • 问题 你想让你的对象支持上下文管理协议(with语句)。 解决方案 为了让一个对象兼容 with 语句,你需要实现 __enter__() 和 __exit__() 方法。 例如,考虑如下的一个类,它能为我们创建一个网络连接: from socket import socket, AF_INET, SOCK_STREAM class LazyConnection: def __init_