/**
  * @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;
 }