/** * @param string $exchangeName * @return integer */ public function publishTo($exchangeName) { if (!$this->tracker->hasPublishedMessages($exchangeName)) { $mostRecentMessage = null; $messages = $this->store->allEvents(); } else { $mostRecentMessage = $this->tracker->mostRecentPublishedMessage($exchangeName); $messages = $this->store->eventsStoredAfter($mostRecentMessage->mostRecentMessageId()); } if (!$messages) { return 0; } $publishedMessages = 0; $lastPublishedNotification = null; try { $this->producer->open($exchangeName); foreach ($messages as $message) { $this->producer->send($exchangeName, $message); $lastPublishedNotification = $message; $publishedMessages++; } $this->producer->close($exchangeName); } catch (Exception $e) { } finally { if (!$mostRecentMessage) { $mostRecentMessage = new PublishedMessage($exchangeName, $lastPublishedNotification->id()); } else { $mostRecentMessage->updateMostRecentMessageId($lastPublishedNotification->id()); } $this->tracker->track($mostRecentMessage); } return $publishedMessages; }
/** * @param PublishedMessage $mostRecentPublishedMessage * @throws InvalidPublishedMessageToTrack There can only be one last * published message for exchange this exception's thrown if 2 are found */ public function track(PublishedMessage $mostRecentPublishedMessage) { $builder = $this->createQueryBuilder('p'); $builder->andWhere('p.exchangeName = :exchangeName')->setParameter('exchangeName', $mostRecentPublishedMessage->exchangeName()); $currentMessage = $builder->getQuery()->getOneOrNullResult(); if ($currentMessage && !$currentMessage->equals($mostRecentPublishedMessage)) { throw new InvalidPublishedMessageToTrack(); } $this->_em->persist($mostRecentPublishedMessage); $this->_em->flush($mostRecentPublishedMessage); }