Hydrate events one by one to preserve memory

This commit is contained in:
Thibaud Fabre
2016-04-06 16:16:29 +02:00
parent 334dcff6bf
commit c05cac4800
2 changed files with 15 additions and 5 deletions

View File

@@ -21,6 +21,9 @@ use Doctrine\ORM\EntityRepository;
*/ */
class WebhookEventRepository extends EntityRepository class WebhookEventRepository extends EntityRepository
{ {
/**
* @deprecated This method can overflow available memory when there is a large number of unprocessed events
*/
public function findUnprocessedEvents() public function findUnprocessedEvents()
{ {
$qb = $this->createQueryBuilder('e'); $qb = $this->createQueryBuilder('e');
@@ -29,4 +32,12 @@ class WebhookEventRepository extends EntityRepository
return $qb->getQuery()->getResult(); return $qb->getQuery()->getResult();
} }
public function getUnprocessedEventIterator()
{
$queryBuilder = $this->createQueryBuilder('e')
->where('e.processed = 0');
return $queryBuilder->getQuery()->iterate();
}
} }

View File

@@ -102,6 +102,7 @@ class WebhookJob extends AbstractJob
$retry = true; $retry = true;
if ($response && (null !== $deliverId = parse_url($request->getUrl(), PHP_URL_FRAGMENT))) { if ($response && (null !== $deliverId = parse_url($request->getUrl(), PHP_URL_FRAGMENT))) {
$delivery = $app['repo.webhook-delivery']->find($deliverId); $delivery = $app['repo.webhook-delivery']->find($deliverId);
if ($response->isSuccessful()) { if ($response->isSuccessful()) {
$app['manipulator.webhook-delivery']->deliverySuccess($delivery); $app['manipulator.webhook-delivery']->deliverySuccess($delivery);
@@ -114,17 +115,15 @@ class WebhookJob extends AbstractJob
} }
return $retry; return $retry;
}}, }
true, }, true, new CurlBackoffStrategy())
new CurlBackoffStrategy()
)
) )
)); ));
/** @var EventProcessorFactory $eventFactory */ /** @var EventProcessorFactory $eventFactory */
$eventFactory = $app['webhook.processor_factory']; $eventFactory = $app['webhook.processor_factory'];
foreach ($app['repo.webhook-event']->findUnprocessedEvents() as $event) { foreach ($app['repo.webhook-event']->getUnprocessedEventIterator() as $event) {
// set event as processed // set event as processed
$app['manipulator.webhook-event']->processed($event); $app['manipulator.webhook-event']->processed($event);