CSS
2
Вклад в тег
... Хендлер так же каждые 5 секунд опрашивает, но уже не базу, а брокер очередей, на предмет появления новых тасков. Выполняет таск и ставит в базе данных статус "done".
Из преимуществ - первому хендлеру не нужно подключение к базе, все данные он будет получать из брокера очередей, но для этого их туда еще положить надо
public function getEntitiesByBatch(int $limit): \Generator
{
$expr = $this->createQueryBuilder('s');
$predicates = $expr->expr()->andX();
$predicates->add($expr->expr()->isNotNull('s.field1'));
$predicates->add($expr->expr()->isNotNull('s.field2'));
$accountState = $expr->expr()->eq('a.field3', 'true');
$qb = $this->createQueryBuilder('s')
->where($predicates)
->join('s.account', 'a')
->where($accountState)
;
$batches = ceil($qb->select('count(s.id)')->getQuery()->getSingleScalarResult() / $limit);
for ($batch = 1; $batch <= $batches; ++$batch) {
yield $this->createQueryBuilder('s')
->where($predicates)
->join('s.account', 'a')
->where($accountState)
->setFirstResult($batch * $limit - $limit)
->setMaxResults($limit)
->getQuery()
->toIterable() // тут можно возращать просто массив, но мне нужен итерируемый объект
;
}
}