Vertx-可以将RxJava和Hibernate结合起来吗

Vertx-可以将RxJava和Hibernate结合起来吗,hibernate,jdbc,rx-java,reactive-programming,vert.x,Hibernate,Jdbc,Rx Java,Reactive Programming,Vert.x,我想知道是否可以使用这个: 与 并为命名查询/DAO访问添加Hibernate 如何使Hibernate无阻塞I/O?最近,我遇到了完全相同的问题,并编写了该库: 下面是一个如何将其与vertx结合使用的示例 假设您将User实体存储在使用JPA2 Hibernate访问的数据库中。然后您将拥有UsersDAOServiceImpl如下所示: package jpa.rxjava.vertx.sample import io.vertx.core.AsyncResult import i

我想知道是否可以使用这个:

并为命名查询/DAO访问添加Hibernate


如何使Hibernate无阻塞I/O?

最近,我遇到了完全相同的问题,并编写了该库:

下面是一个如何将其与
vertx
结合使用的示例

假设您将
User
实体存储在使用JPA2 Hibernate访问的数据库中。然后您将拥有
UsersDAOServiceImpl
如下所示:

package jpa.rxjava.vertx.sample

import io.vertx.core.AsyncResult
import io.vertx.core.Handler
import io.vertx.reactivex.CompletableHelper
import io.vertx.reactivex.SingleHelper
import data.User // That's your data class
import net.eraga.rxjpa2.*
import javax.persistence.EntityManager
import javax.persistence.EntityManagerFactory

class UsersDAOServiceImpl(
        emf: EntityManagerFactory,
        readyHandler: Handler<AsyncResult<UsersDAOService>>
) : UsersDAOService {

    private lateinit var entityManager: EntityManager

    init {
        emf.rxCreateEntityManager()
                .map {
                    entityManager = it
                    this
                }
                .subscribe(SingleHelper.toObserver(readyHandler))

    }


    override fun fetchByLogin(login: String, resultHandler: Handler<AsyncResult<User>>) {
        entityManager.createQuery("SELECT i From User i where login = :login", User::class.java)
                .setParameter("login", login)
                .rxSingleResult<User>()
                .subscribe(SingleServiceHelper.toObserver(resultHandler))
    }

    override fun fetchAll(resultHandler: Handler<AsyncResult<List<User>>>) {
        entityManager.createQuery("SELECT i From User i order by modified desc", User::class.java)
                .rxResultList()
                .subscribe(SingleServiceHelper.toObserver(resultHandler))
    }

    override fun fetchById(id: Int, resultHandler: Handler<AsyncResult<User>>) {
        entityManager.rxFind(User::class.java, id)
                .subscribe(SingleServiceHelper.toObserver(resultHandler))
    }

    override fun create(user: User, resultHandler: Handler<AsyncResult<Void>>) {
        entityManager
                .rxPersist(user)
                .subscribe(CompletableHelper.toObserver(resultHandler))
    }

    override fun save(user: User, resultHandler: Handler<AsyncResult<Void>>) {
        entityManager
                .rxMerge(user)
                .toCompletable()
                .subscribe(CompletableHelper.toObserver(resultHandler))
    }

    override fun delete(id: Int, resultHandler: Handler<AsyncResult<Void>>) {
        val user = User().apply { this.id = id }
        entityManager
                .rxRemove(user)
                .subscribe(CompletableHelper.toObserver(resultHandler))
    }
}
这就是在启动应用程序垂直体时,您如何使用
RxPersistence
实例化
EntityManagerFactory

package jpa.rxjava.vertx.sample

import io.reactivex.plugins.RxJavaPlugins
import io.vertx.core.DeploymentOptions
import io.vertx.core.Future
import io.vertx.core.VertxOptions
import io.vertx.core.json.JsonObject
import io.vertx.reactivex.core.AbstractVerticle
import io.vertx.reactivex.core.RxHelper
import io.vertx.reactivex.core.Vertx
import net.eraga.rxjpa2.RxPersistence
import org.slf4j.LoggerFactory
import javax.persistence.EntityManagerFactory

class App : AbstractVerticle() {
    private val log = LoggerFactory.getLogger(this.javaClass)

    @Throws(Exception::class)
    override fun start(startFuture: Future<Void>) {

        RxPersistence
                .createEntityManagerFactory("initiatives")
                .flatMap {
                    log.info("Done createEntityManagerFactory {}", it)
                    App.entityManagerFactory = it
                    vertx.rxDeployVerticle(UsersVerticle::class.java.name)
                }.flatMap {
                    log.info("Started {}", it)

                    vertx.rxDeployVerticle(HttpServerVerticle::class.java.name,
                            DeploymentOptions().setInstances(2))
                }.subscribe(
                        {
                            log.info("Started {}", it)
                            startFuture.complete()
                        },
                        {
                            log.error("Fail {}", it.message)
                            startFuture.fail(it)
                        }
                )
    }

    companion object {
        lateinit var entityManagerFactory: EntityManagerFactory

        @JvmStatic
        fun main(args: Array<String>) {
            System.setProperty("org.jboss.logging.provider", "slf4j")
            System.setProperty("hazelcast.logging.type", "slf4j")


            Vertx.clusteredVertx(VertxOptions().setClustered(true)) { cluster ->
                if (cluster.succeeded()) {
                    val vertx = cluster.result()

                    RxJavaPlugins.setComputationSchedulerHandler({ s -> RxHelper.scheduler(vertx) })
                    RxJavaPlugins.setIoSchedulerHandler({ s -> RxHelper.blockingScheduler(vertx) })
                    RxJavaPlugins.setNewThreadSchedulerHandler({ s -> RxHelper.scheduler(vertx) })
                    RxJavaPlugins.lockdown()

                    vertx.deployVerticle(App::class.java.name, DeploymentOptions().setConfig(JsonObject().put("local", true)))
                }
            }
        }
    }
}
包jpa.rxjava.vertx.sample
导入io.reactivex.plugins.RxJavaPlugins
导入io.vertx.core.DeploymentOptions
导入io.vertx.core.Future
导入io.vertx.core.VertxOptions
导入io.vertx.core.json.JsonObject
导入io.vertx.reactivex.core.AbstractVerticle
导入io.vertx.reactivex.core.RxHelper
导入io.vertx.reactivex.core.vertx
导入net.eraga.rxjpa2.rx持久性
导入org.slf4j.LoggerFactory
导入javax.persistence.EntityManagerFactory
类应用程序:AbstractVerticle(){
private val log=LoggerFactory.getLogger(this.javaClass)
@抛出(异常::类)
覆盖乐趣开始(开始未来:未来){
Rx持久性
.createEntityManagerFactory(“计划”)
.平面图{
log.info(“完成createEntityManagerFactory{}”,it)
App.entityManagerFactory=it
rxDeployVerticle(UsersVerticle::class.java.name)
}.平面图{
info(“启动{}”,it)
rxDeployVerticle(HttpServerVerticle::class.java.name,
DeploymentOptions().setInstances(2))
}.订阅(
{
info(“启动{}”,it)
startFuture.complete()
},
{
log.error(“Fail{}”,it.message)
startFuture.fail(it)
}
)
}
伴星{
lateinit变量entityManagerFactory:entityManagerFactory
@JvmStatic
趣味主线(args:Array){
System.setProperty(“org.jboss.logging.provider”、“slf4j”)
System.setProperty(“hazelcast.logging.type”、“slf4j”)
clusteredVertx(VertxOptions().setClustered(true)){cluster->
if(cluster.successed()){
val vertx=cluster.result()
RxJavaPlugins.setComputationSchedulerHandler({s->RxHelper.scheduler(vertx)})
RxJavaPlugins.setIoSchedulerHandler({s->RxHelper.blockingScheduler(vertx)})
RxJavaPlugins.setNewThreadSchedulerHandler({s->RxHelper.scheduler(vertx)})
RxJavaPlugins.lockdown()
deployVerticle(App::class.java.name,DeploymentOptions().setConfig(JsonObject().put(“local”,true)))
}
}
}
}
}

您可以看看这个项目,基本上,您不能让hibernate在处理事务时不阻塞。
package jpa.rxjava.vertx.sample

import io.reactivex.plugins.RxJavaPlugins
import io.vertx.core.DeploymentOptions
import io.vertx.core.Future
import io.vertx.core.VertxOptions
import io.vertx.core.json.JsonObject
import io.vertx.reactivex.core.AbstractVerticle
import io.vertx.reactivex.core.RxHelper
import io.vertx.reactivex.core.Vertx
import net.eraga.rxjpa2.RxPersistence
import org.slf4j.LoggerFactory
import javax.persistence.EntityManagerFactory

class App : AbstractVerticle() {
    private val log = LoggerFactory.getLogger(this.javaClass)

    @Throws(Exception::class)
    override fun start(startFuture: Future<Void>) {

        RxPersistence
                .createEntityManagerFactory("initiatives")
                .flatMap {
                    log.info("Done createEntityManagerFactory {}", it)
                    App.entityManagerFactory = it
                    vertx.rxDeployVerticle(UsersVerticle::class.java.name)
                }.flatMap {
                    log.info("Started {}", it)

                    vertx.rxDeployVerticle(HttpServerVerticle::class.java.name,
                            DeploymentOptions().setInstances(2))
                }.subscribe(
                        {
                            log.info("Started {}", it)
                            startFuture.complete()
                        },
                        {
                            log.error("Fail {}", it.message)
                            startFuture.fail(it)
                        }
                )
    }

    companion object {
        lateinit var entityManagerFactory: EntityManagerFactory

        @JvmStatic
        fun main(args: Array<String>) {
            System.setProperty("org.jboss.logging.provider", "slf4j")
            System.setProperty("hazelcast.logging.type", "slf4j")


            Vertx.clusteredVertx(VertxOptions().setClustered(true)) { cluster ->
                if (cluster.succeeded()) {
                    val vertx = cluster.result()

                    RxJavaPlugins.setComputationSchedulerHandler({ s -> RxHelper.scheduler(vertx) })
                    RxJavaPlugins.setIoSchedulerHandler({ s -> RxHelper.blockingScheduler(vertx) })
                    RxJavaPlugins.setNewThreadSchedulerHandler({ s -> RxHelper.scheduler(vertx) })
                    RxJavaPlugins.lockdown()

                    vertx.deployVerticle(App::class.java.name, DeploymentOptions().setConfig(JsonObject().put("local", true)))
                }
            }
        }
    }
}