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

带Spring批处理的多线程Lucene索引编写器

子车凌龙
2023-03-14

我有一个多步骤Spring Batch作业,在其中一个步骤中,我为在阅读器中读取的数据创建Lucene索引,以便后续步骤可以在该Lucene索引中搜索。

基于ItemReader中读取的数据,我将索引分散到几个单独的目录中。

如果我指定Step Task Executor为SimpleAsyncTaskExecutor,只要索引总是写入不同的目录,我就不会遇到任何问题,但有时会出现锁定异常。我猜,两个线程试图写入同一个索引。

如果我删除了SimpleAsyncTaskExecutor,我不会遇到任何问题,但写入会变得有序且缓慢。

如果索引被写入单个目录,Lucene索引编写器是否可以使用多线程?

我是否需要将索引创建者代码设置为线程安全的,才能使用SimpleAsynctAskeExecutor

索引创建者代码在步骤处理器中。

共有1个答案

李鸿
2023-03-14

我使用的是Lucene 6.0.0,根据IndexWriter API文档,

注意:IndexWriter实例是完全线程安全的,这意味着多个线程可以同时调用其任何方法。如果应用程序需要外部同步,则不应在IndexWriter实例上同步,因为这可能会导致死锁;改用你自己的(非Lucene)对象。

我创建了多个writer实例,这导致了问题。只要编写器周围的其余代码是线程安全的,就可以将单个编写器实例传递给任意多个线程。

我使用了单个写入器实例和并行化块。每个并行块都写入同一个目录,没有任何问题。

为了并行化块,我必须让我的块组件——读取器、处理器和写入器是线程安全的。

 类似资料:
  • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出

  • null 我更新了我的步骤并添加了一个ThreadPoolTaskExecutor,如下所示 在此之后,我的处理器将被多个线程调用,但使用相同的源数据。我还有什么需要做的吗?

  • 我想编写一个spring boot批处理应用程序,其中我有一个充满事件的数据库表。我想做的是有一个多线程的spring boot批处理应用程序,它将以这种方式工作: 我想有5个线程运行,每个线程将保留一个偏移量来跟踪它读取的事件,以便没有其他线程再次读取相同的事件。我想怎么做: 所以我希望能够在数据库表中为每个线程保留偏移量。有没有办法让Spring Boot环境以这种方式工作?

  • 问题内容: 我正在尝试在具有多个线程的Lucene中建立索引。因此,我开始编码并编写以下代码。首先,找到文件,然后为每个文件创建一个线程以对其进行索引。之后,我加入线程并优化索引。它可以工作,但我不确定…我可以大规模信任它吗?有什么办法可以改善吗? 任何麻将被视为。 问题答案: 如果要并行化索引,可以执行以下两项操作: 并行化对addDocument的调用, 增加您的合并调度程序的最大线程数。 您

  • 我目前正在编写一个Spring批处理,其中我正在读取一个数据块,并对其进行处理,然后我希望将此数据传递给两个Writer。一个writer将简单地更新数据库,而第二个writer将写入csv文件。 我计划编写自己的自定义编写器,并在customItemWriter中注入这两个ItemWriter,并在customItemWriter的write方法中调用这两个ItemWrite的write方法。这

  • 我使用的是Spring Batch 2.1.8。释放我有一个文件,它由一些头信息和一些需要处理的记录组成。 我有一个使用面向块处理的步骤。该步骤包含ItemReader和ItemWriter的实现。ItemReader实现是线程安全的,而ItemWriter不是。 我想在处理(或写入)任何记录之前使用标题信息。在继续使用面向块的处理时,如何确保这一点? 建议的解决方案:一种解决方案可以是编写一个预