/** * @param CommandMessageInterface $commandMessage * @param SerializerInterface $serializer * @param bool $expectReply */ public function __construct(CommandMessageInterface $commandMessage, SerializerInterface $serializer, $expectReply) { $this->commandMessage = $commandMessage; $this->commandIdentifier = $commandMessage->getIdentifier(); $this->expectReply = $expectReply; $messageSerializer = new MessageSerializer($serializer); $payload = $messageSerializer->serializePayload($commandMessage); $metaData = $messageSerializer->serializeMetaData($commandMessage); $this->payloadType = $payload->getType()->getName(); $this->payloadRevision = $payload->getType()->getRevision(); $this->serializedPayload = $payload->getData(); $this->serializedMetaData = $metaData->getData(); $this->commandName = $commandMessage->getCommandName(); }
/** * @param EventMessageInterface $event * @return mixed */ public function writeEventMessage(EventMessageInterface $event) { if ($event instanceof DomainEventMessageInterface) { $type = 3; } else { $type = 1; } $serializedPayload = $this->serializer->serializePayload($event); $serializedMetaData = $this->serializer->serializeMetaData($event); $data = pack("na36N", $type, $event->getIdentifier(), $event->getTimestamp()->format('U')); if ($event instanceof DomainEventMessageInterface) { $data .= pack("a36N", $event->getAggregateIdentifier(), $event->getScn()); } $packFormat = sprintf("Na%sNa%sNa%s", strlen($serializedPayload->getType()->getName()), strlen($serializedPayload->getData()), strlen($serializedMetaData->getData())); $data .= pack($packFormat, strlen($serializedPayload->getType()->getName()), $serializedPayload->getType()->getName(), strlen($serializedPayload->getData()), $serializedPayload->getData(), strlen($serializedMetaData->getData()), $serializedMetaData->getData()); return $data; }
/** * Reads the data and constructs the suitable EventMessageInterface implementation. * * @param mixed $data Input data. * @return GenericDomainEventMessage|GenericEventMessage */ public function readEventMessage($data) { $raw = unpack("ntype/a36identifier/Ntimestamp", $data); $offset = 42; if ($raw['type'] === 3) { $raw = array_merge($raw, unpack("a36aggregateIdentifier/Nscn", substr($data, $offset))); $offset += 40; } $this->read($raw, $offset, $data, "payloadType"); $this->read($raw, $offset, $data, "payload"); $this->read($raw, $offset, $data, "meta"); $serializedPayload = new SimpleSerializedObject($raw['payload'], new SimpleSerializedType($raw['payloadType'])); $serializedMetadata = new SimpleSerializedObject($raw['meta'], new SimpleSerializedType(MetaData::class)); $dateTime = \DateTime::createFromFormat('U', $raw['timestamp']); $dateTime->setTimezone(new \DateTimeZone(date_default_timezone_get())); if (3 === $raw['type']) { return new GenericDomainEventMessage($raw['aggregateIdentifier'], $raw['scn'], $this->serializer->deserialize($serializedPayload), $this->serializer->deserialize($serializedMetadata), $raw['identifier'], $dateTime); } else { return new GenericEventMessage($this->serializer->deserialize($serializedPayload), $this->serializer->deserialize($serializedMetadata), $raw['identifier'], $dateTime); } }
public function readEvents($type, $identifier) { $snapshotScn = -1; $snapshotEvent = null; $lastSnapshotEvent = $this->entryStore->loadLastSnapshotEvent($type, $identifier, $this->entityManager); if (null !== $lastSnapshotEvent) { try { $snapshotEvent = new GenericDomainEventMessage($identifier, $lastSnapshotEvent->getScn(), $this->serializer->deserialize($lastSnapshotEvent->getPayload()), $this->serializer->deserialize($lastSnapshotEvent->getMetaData())); $snapshotScn = $snapshotEvent->getScn(); } catch (\RuntimeException $ex) { $this->logger->warn("Error while reading snapshot event entry. " . "Reconstructing aggregate on entire event stream. Caused by: {class} {message}", array('class' => get_class($ex), 'message' => $ex->getMessage())); } } $entries = $this->entryStore->fetchAggregateStream($type, $identifier, $snapshotScn, $this->batchSize, $this->entityManager); if ($snapshotEvent === null && !$entries->valid()) { throw new EventStreamNotFoundException($type, $identifier); } return new OrmDomainEventStream($this->serializer, $entries, $identifier, $snapshotEvent); }
/** * Creates a new event entry to store in Mongo. * * @param string $aggregateType String containing the aggregate type of the event * @param DomainEventMessageInterface $event The actual DomainEvent to store * @param SerializerInterface $serializer Serializer to use for the event to store * @return EventEntry */ public static function fromDomainEvent($aggregateType, DomainEventMessageInterface $event, SerializerInterface $serializer) { /**serializationTarget = String.class; * if (serializer.canSerializeTo(DBObject.class)) { * serializationTarget = DBObject.class; * }*/ $messageSerializer = new MessageSerializer($serializer); $serializedPayloadObject = $messageSerializer->serializePayload($event); $serializedMetaDataObject = $messageSerializer->serializeMetaData($event); return new self($event->getAggregateIdentifier(), $event->getScn(), $event->getTimestamp()->getTimestamp(), $aggregateType, $serializedPayloadObject->getData(), $serializedPayloadObject->getType()->getName(), $serializedPayloadObject->getType()->getRevision(), $serializedMetaDataObject->getData(), $event->getIdentifier()); }