itx / importer
Requires
README
用法
运行队列工作进程
要运行导入扩展的队列工作进程,请运行以下命令
vendor/bin/typo3cms importer:queue-worker
这将运行一个单独的队列工作进程。您可以通过运行多个队列工作进程来并行化导入,从而加快导入速度。
要使它们在多个实例中自动运行,可以使用以下命令
vendor/bin/typo3cms importer:queue-worker-manager <optional worker count>
导入数据
要创建新的导入,您需要创建 3 个文件
-
生产者类
生产者类应继承自 Itx\Importer\Command\Producer\AbstractJobProducer 类。在生产者类内部,您将调用 API 来获取您想要导入的数据信息。最后,您将需要使用 generateJobs 方法来创建队列工作进程将处理的作业。
-
有效载荷类
使用自定义有效载荷类将类型安全的数据传递给消费者类。此类没有 getter 和 setter。
-
消费者类
消费者类将由队列工作进程调用,并需要实现 ConsumerInterface。它将接收有效载荷类作为参数。在消费者类内部,您可以使用有效载荷类中的数据将数据导入到您的数据库中。您不需要注册消费者,它将被自动检测。
当所有作业都处理完毕后,导入器将调用生产者类上的 finish 方法。使用此方法来清理临时文件或删除旧记录。
您需要将生产者类作为命令在 Service.yaml 中注册。命名方式如下
importer:producer:<importer type name here>
请确保使用与生产者类导入类型名称方法相同的名称。
注意:如果您在其他扩展中使用导入扩展,您需要将以下配置添加到您扩展的 Services.yaml(在 _defaults 下方)
_instanceof:
Itx\Importer\Consumer\ConsumerInterface:
tags: [ 'queue_consumer' ]
lazy: true
Itx\Importer\Command\Producer\AbstractJobProducer:
tags: [ 'queue_producer' ]
lazy: true
就这样!您现在可以设置任意数量的队列工作进程,以及为生产者和导入配置调度任务,导入将自动执行。
竞争条件和锁定
由于每个作业都可以由运行时并行运行,因此可能会尝试多次导入相同的记录。为了防止这种情况发生,您可以使用 Itx\Importer\Service\LockingService::createLock()
方法。此方法返回一个 Lock 对象,您可以在其上调用 acquire()
方法。请确保使用 blocking=true
参数调用它。还请确保在完成时在锁对象上调用 release()
方法。锁自动配置为在进程结束时释放,但手动释放它是良好的做法。
子作业
您可以在处理作业的同时创建作业。如果您需要导入层次结构数据,这很有用。
统计信息
要为您的导入创建统计信息,您可以使用 Itx\Importer\Service\StatisticsService::addStatistic()
方法。此方法可以并行运行,并将自动为您汇总统计信息。要确保数据在不同位置,请确保为相同的数据使用相同的表名和记录名。当多次调用时,值将相加。
您可以在后端模块中查看生成的统计记录。
清理
有一个清理命令可以用来删除之前的导入及其数据。
vendor/bin/typo3cms importer:cleanup <keep number of imports>