最初由 Mincong Huang 在 Google Summer of Code 项目中启动,Hibernate Search 5.9 将集成 JSR 352,即 "Java 平台的批处理应用程序"。这种集成提供了一个新的大量索引(索引大量实体)实现,作为一个 JSR 352 作业。
昨天我们发布了 5.9.0.Beta1,您可以尝试一下!
为什么它很好用?如何使用它?让我们来了解一下!
什么是 JSR 352?
"JSR 352:Java 平台的批处理应用程序" 是一个规范,定义了执行批处理过程("作业")的接口和机制,即反复对大量项目应用相同操作的进程。
在 JSR 352 中
-
作业定义由一个 XML 文件和几个 Java 类提供,称为批处理工件。在我们的例子中,定义由 Hibernate Search 提供。
-
JSR 352 运行时通过管理线程、事务、执行流程(在批处理工件上调用方法)等来避免样板代码...
-
剩下的只是配置基础设施。在我们的例子中,这是您的责任,作为 Hibernate Search 的用户。
它与现有的大量索引器相比有何优势?
您是否曾经尝试使用现有的大量索引器重新索引 100,000 个实体,但在第 99,001 个实体处遇到一些网络或磁盘错误?然后您必须从头开始重新启动,即使前 99,000 个实体索引得很好...
使用JSR 352的大规模索引作业,作业将从最后一个检查点恢复,可能在第95,000个实体左右。
还有其他优点(例如能够在多个不相关的后台作业之间共享资源),但真正使我们认为JSR 352有意义的原因是这个。
如何使用JSR 352的大规模索引作业?
设置
在Wildfly 11中,使用我们的JBoss模块,配置Hibernate ORM和Hibernate Search。为了使您的应用程序能够访问Hibernate Search的大规模索引作业,请在您的部署中添加对org.hibernate.search.jsr352
模块的依赖项,并导入元信息,例如,通过在您的应用程序的META-INF/MANIFEST.MF
文件中指定以下内容:Dependencies: org.hibernate.search.jsr352 meta-inf
。就是这样:然后您可以通过CDI注入在您的应用程序中检索javax.batch.operations.JobOperator
实例。
在Java SE应用程序中,您可以使用JSR 352的参考实现,JBatch,在Java SE模式下使用。您需要在您的项目中添加以下依赖项
-
在您的项目中添加以下依赖项
-
org.hibernate:hibernate-search-jsr352-core:5.9.0.Beta1
-
com.ibm.jbatch:com.ibm.jbatch-runtime:1.0
-
javax.batch:javax.batch-api:1.0
-
javax.inject:javax.inject:1
-
org.apache.derby:derby:10.13.1.1
-
-
在
META-INF/services
下添加配置文件, -
通过调用
javax.batch.runtime.BatchRuntime.getJobOperator()
在您的应用程序中检索JobOperator
(请确保存储结果,因为每次调用都可能创建一个新的操作员)。 -
在尝试启动大规模索引作业之前,请确保初始化Hibernate ORM,并在最后一个大规模索引作业停止后关闭它。
您还可以在Java SE模式下使用JBeret
-
在您的项目中添加对
org.hibernate:hibernate-search-jsr352-jberet:5.9.0.Beta1
的依赖项 -
按照JBeret文档中的说明设置您的项目
-
通过调用
javax.batch.runtime.BatchRuntime.getJobOperator()
在您的应用程序中检索JobOperator
(请确保存储结果,因为每次调用都可能创建一个新的操作员)。 -
在尝试启动大规模索引作业之前,请确保初始化Hibernate ORM,并在最后一个大规模索引作业停止后关闭它。
至于其他JSR 352运行时,大规模索引器可能正常工作也可能不正常。我们正在测试至少另一个Java EE应用程序服务器和Spring Batch:请参见下面的当前限制和进一步工作。
用法
以下所有示例都假设变量jobOperator
包含上述说明中检索到的作业操作员。
要启动大规模索引作业
java.util.Properties parameters = org.hibernate.search.jsr352.massindexing.MassIndexingJob.parameters()
.forEntities( MyFirstEntity.class, MySecondEntity.class )
.build();
long executionId = jobOperator.start(
org.hibernate.search.jsr352.massindexing.MassIndexingJob.NAME,
parameters
);
您可以通过此调用查询执行状态
javax.batch.runtime.JobExecution jobExecution = jobOperator.getJobExecution( executionId );
您可以通过这种方式暂停作业
long executionId2 = jobOperator.stop( executionId );
要暂停后或失败后恢复作业,您可以这样请求重启
long executionId2 = jobOperator.restart( executionId, parameters );
根据JSR 352规范,在重启作业时必须再次提供参数。 但是,JBeret,Wildfly中包含的JSR 352实现,允许您传递 |
从调用MassIndexingJob.parameters()
获得的构建器提供了一些设置。以下是一些最有用的
-
.purgeAllOnStart(boolean)
:指定是否应在作业开始时清除现有索引。 -
.restrictedBy(Criterion)
:使用Criterion
仅索引实体子集。 -
.restrictedBy(String)
:使用HQL仅索引实体子集。请注意,当使用HQL时,作业将切换到降级模式,该模式存在几个限制,使其仅适用于小型、快速执行。有关详细信息,请参阅文档。
有关作业参数、如何调整性能或如何处理依赖于多个JPA持久单元的应用程序的更多信息,请参阅文档。
性能
我们进行了一些基准测试,根据我们的观察,JSR 352的大规模索引作业的性能与现有的大规模索引器相当。
然而,请注意,性能很大程度上取决于您的配置,您可能需要调整作业参数以实现最佳性能,具体请参阅文档中的说明。
当前限制和后续工作
目前,Hibernate Search JSR 352集成仅被证明与两种JSR 352运行时一起工作:独立模式下的JBatch和WildFly服务器中的JBeret。
我们希望确保我们的大规模索引作业能够与其他Java EE应用程序服务器一起工作,并希望与Spring自己的Spring Batch项目一起工作,该项目对JSR 352的支持有限。
在此期间……请记住,我们已经发布了5.9.0.Beta1,因此您现在就可以尝试!有关如何获取新版本的信息,请参阅hibernate.org。
无论如何,欢迎您联系我们,无论是有任何问题、问题,还是简单地给我们提供反馈!