Vertx-可以将RxJava和Hibernate结合起来吗
我想知道是否可以使用这个: 与 并为命名查询/DAO访问添加HibernateVertx-可以将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
如何使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)))
}
}
}
}
}