Example #1
0
 /**
  * Method is called if all defined conditions are met and the feature is marked as enabled.
  * Use this method to configure and initialize all required components for the feature like
  * the steps in the pipeline or the instances/factories in the container.
  *
  * @param Settings              $settings
  * @param BuilderInterface      $builder
  * @param PipelineModifications $pipelineModifications
  */
 public function setup(Settings $settings, BuilderInterface $builder, PipelineModifications $pipelineModifications)
 {
     $localAddress = $settings->get(KnownSettingsEnum::LOCAL_ADDRESS);
     $builder->defineSingleton(UnicastRouterInterface::class, function () use($localAddress, $builder, $settings) {
         return new UnicastRouter($localAddress, $builder->build(UnicastRoutingTable::class), $settings->get(TransportInfrastructure::class));
     });
     $pipelineModifications->registerStep('UnicastSendRoutingConnector', UnicastSendRoutingConnector::class, function () use($builder) {
         return new UnicastSendRoutingConnector($builder->build(UnicastRouterInterface::class), $builder->build(OutgoingContextFactory::class));
     });
     $pipelineModifications->registerStep('UnicastReplyRoutingConnector', UnicastReplyRoutingConnector::class, function () use($builder) {
         return new UnicastReplyRoutingConnector($builder->build(OutgoingContextFactory::class));
     });
     $pipelineModifications->registerStep('MulticastPublishRoutingConnector', MulticastPublishRoutingConnector::class, function () use($builder) {
         return new MulticastPublishRoutingConnector($builder->build(OutgoingContextFactory::class));
     });
     $canReceive = !$settings->get(KnownSettingsEnum::SEND_ONLY);
     if ($canReceive) {
         $pipelineModifications->registerStep('AttachReplyToAddressPipelineStep', AttachReplyToAddressPipelineStep::class, function () use($localAddress) {
             return new AttachReplyToAddressPipelineStep($localAddress);
         });
         /** @var TransportInfrastructure $transportInfrastructure */
         $transportInfrastructure = $settings->get(TransportInfrastructure::class);
         $subscriptionManagerFactory = $transportInfrastructure->configureSubscriptionInfrastructure();
         $builder->defineSingleton(SubscriptionManagerInterface::class, $subscriptionManagerFactory->getSubscriptionManagerFactory());
         $pipelineModifications->registerStep('SubscribeTerminator', SubscribeTerminator::class, function () use($builder) {
             return new SubscribeTerminator($builder->build(SubscriptionManagerInterface::class));
         });
         $pipelineModifications->registerStep('UnsubscribeTerminator', UnsubscribeTerminator::class, function () use($builder) {
             return new UnsubscribeTerminator($builder->build(SubscriptionManagerInterface::class));
         });
     }
 }
 public function install()
 {
     $createQueues = $this->settings->tryGet(KnownSettingsEnum::CREATE_QUEUES);
     if ($createQueues || $createQueues === null) {
         $this->queueCreator->createIfNecessary($this->settings->get(QueueBindings::class));
     }
 }
Example #3
0
 /**
  * Method is called if all defined conditions are met and the feature is marked as enabled.
  * Use this method to configure and initialize all required components for the feature like
  * the steps in the pipeline or the instances/factories in the container.
  *
  * @param Settings              $settings
  * @param BuilderInterface      $builder
  * @param PipelineModifications $pipelineModifications
  */
 public function setup(Settings $settings, BuilderInterface $builder, PipelineModifications $pipelineModifications)
 {
     /** @var QueueBindings $queueBindings */
     $queueBindings = $settings->get(QueueBindings::class);
     $queueBindings->bindReceiving($settings->get(KnownSettingsEnum::LOCAL_ADDRESS));
     /** @var InboundTransport $inboundTransport */
     $inboundTransport = $settings->get(InboundTransport::class);
     $receiveInfrastructure = $inboundTransport->configure($settings);
     $builder->defineSingleton(MessagePusherInterface::class, $receiveInfrastructure->getMessagePusherFactory());
     $builder->defineSingleton(QueueCreatorInterface::class, $receiveInfrastructure->getQueueCreatorFactory());
     $this->registerInstallTask(function () use($builder, $settings) {
         return new QueueCreatorFeatureInstallTask($builder->build(QueueCreatorInterface::class), $settings);
     });
 }
Example #4
0
 /**
  * Method is called if all defined conditions are met and the feature is marked as enabled.
  * Use this method to configure and initialize all required components for the feature like
  * the steps in the pipeline or the instances/factories in the container.
  *
  * @param Settings              $settings
  * @param BuilderInterface      $builder
  * @param PipelineModifications $pipelineModifications
  */
 public function setup(Settings $settings, BuilderInterface $builder, PipelineModifications $pipelineModifications)
 {
     /** @var OutboundTransport $outboundTransport */
     $outboundTransport = $settings->get(OutboundTransport::class);
     $sendInfrastructure = $outboundTransport->configure($settings);
     $builder->defineSingleton(MessageDispatcherInterface::class, $sendInfrastructure->getMessageDispatcherFactory());
 }
 /**
  * Method is called if all defined conditions are met and the feature is marked as enabled.
  * Use this method to configure and initialize all required components for the feature like
  * the steps in the pipeline or the instances/factories in the container.
  *
  * @param Settings              $settings
  * @param BuilderInterface      $builder
  * @param PipelineModifications $pipelineModifications
  */
 public function setup(Settings $settings, BuilderInterface $builder, PipelineModifications $pipelineModifications)
 {
     $errorQueue = $settings->get(KnownSettingsEnum::ERROR_QUEUE);
     /** @var QueueBindings $queueBindings */
     $queueBindings = $settings->get(QueueBindings::class);
     $queueBindings->bindSending($errorQueue);
     $localAddress = $settings->get(KnownSettingsEnum::LOCAL_ADDRESS);
     $builder->defineSingleton(ExceptionToHeadersConverter::class, function () use($builder) {
         return new ExceptionToHeadersConverter($builder->build(ClockInterface::class), $builder->build(DateTimeConverter::class));
     });
     $registration = $pipelineModifications->registerStep('MoveErrorsToErrorQueuePipelineStep', MoveErrorsToErrorQueuePipelineStep::class, function () use($errorQueue, $localAddress, $builder) {
         /** @var PipelineFactory $pipelineFactory */
         $pipelineFactory = $builder->build(PipelineFactory::class);
         return new MoveErrorsToErrorQueuePipelineStep($errorQueue, $localAddress, $pipelineFactory->createStartingWith(DispatchContext::class, $builder->build(PipelineModifications::class)), $builder->build(ExceptionToHeadersConverter::class), $builder->build(OutgoingContextFactory::class));
     });
     $registration->insertBeforeIfExists('FirstLevelRetryPipelineStep');
     $registration->insertBeforeIfExists('SecondLevelRetryPipelineStep');
 }
Example #6
0
 /**
  * Method is called if all defined conditions are met and the feature is marked as enabled.
  * Use this method to configure and initialize all required components for the feature like
  * the steps in the pipeline or the instances/factories in the container.
  *
  * @param Settings              $settings
  * @param BuilderInterface      $builder
  * @param PipelineModifications $pipelineModifications
  */
 public function setup(Settings $settings, BuilderInterface $builder, PipelineModifications $pipelineModifications)
 {
     $supportedStorageTypes = $settings->get(KnownSettingsEnum::SUPPORTED_STORAGE_TYPE_VALUES);
     if (!in_array(StorageType::OUTBOX, $supportedStorageTypes)) {
         throw new UnexpectedValueException("Selected persistence doesn't have support for outbox storage. " . "Please select another storage or disable the outbox feature using endpointConfigurator.disableFeature.");
     }
     $pipelineModifications->registerStep('OutboxConnector', OutboxConnector::class, function () use($builder) {
         /** @var PipelineFactory $pipelineFactory */
         $pipelineFactory = $builder->build(PipelineFactory::class);
         return new OutboxConnector($pipelineFactory->createStartingWith(DispatchContext::class, $builder->build(PipelineModifications::class)), $builder->build(OutboxStorageInterface::class), $builder->build(IncomingContextFactory::class), $builder->build(OutgoingContextFactory::class), new TransportOperationsConverter(new OutboxTransportOperationFactory()));
     });
 }
Example #7
0
 /**
  * @return StartableEndpoint
  */
 public function prepare()
 {
     $this->persistenceDefinitionApplier->apply($this->settings);
     $featureActivator = new FeatureActivator($this->settings);
     foreach ($this->settings->get(KnownSettingsEnum::FEATURE_FQCN_LIST) as $featureFqcn) {
         /** @var Feature $feature */
         $feature = new $featureFqcn();
         $feature->describe();
         $featureActivator->addFeature($feature);
     }
     $featureInstaller = new FeatureInstaller($featureActivator->getFeatures());
     $featureStarter = new FeatureStarter($featureActivator->getFeatures());
     /** @var TransportDefinition $transportDefinition */
     $transportDefinition = $this->settings->get(TransportDefinition::class);
     $this->settings->set(TransportInfrastructure::class, $transportDefinition->formalize($this->settings, $transportDefinition->createConnectionFactory($this->settings)));
     $featureActivator->activateFeatures($this->builder, $this->pipelineModifications);
     $featureInstaller->installFeatures($this->builder, $this->settings);
     $this->pipelineModifications->registerStepsInBuilder($this->builder);
     $featureStarter->startFeatures($this->builder, $this->busContext);
     $this->isPrepared = true;
     return $this;
 }
 /**
  * Method is called if all defined conditions are met and the feature is marked as enabled.
  * Use this method to configure and initialize all required components for the feature like
  * the steps in the pipeline or the instances/factories in the container.
  *
  * @param Settings              $settings
  * @param BuilderInterface      $builder
  * @param PipelineModifications $pipelineModifications
  */
 public function setup(Settings $settings, BuilderInterface $builder, PipelineModifications $pipelineModifications)
 {
     /** @var SerializationDefinition $definition */
     $definition = $settings->get(SerializationDefinition::class);
     $serializerFactory = $definition->formalize($settings);
     $builder->defineSingleton(MessageSerializerInterface::class, $serializerFactory);
     $builder->defineSingleton(MessageDeserializerResolver::class, function () use($builder) {
         $serializer = $builder->build(MessageSerializerInterface::class);
         return new MessageDeserializerResolver([$serializer], get_class($serializer));
     });
     $builder->defineSingleton(IncomingLogicalMessageFactory::class, new IncomingLogicalMessageFactory());
     $pipelineModifications->registerStep('DeserializeLogicalMessageConnector', DeserializeLogicalMessageConnector::class, function () use($builder) {
         return new DeserializeLogicalMessageConnector($builder->build(MessageDeserializerResolver::class), $builder->build(IncomingLogicalMessageFactory::class), $builder->build(IncomingContextFactory::class));
     });
     $pipelineModifications->registerStep('SerializeMessageConnector', SerializeMessageConnector::class, function () use($builder) {
         return new SerializeMessageConnector($builder->build(MessageSerializerInterface::class), $builder->build(OutgoingContextFactory::class));
     });
 }
 private function registerBaseContainerServices(Container $c)
 {
     $c[Settings::class] = $this->settings;
     $c[MessageHandlerRegistry::class] = $this->messageHandlerRegistry;
     $c[MessageMutatorRegistry::class] = $this->messageMutatorRegistry;
     $c[UnicastRoutingTable::class] = $this->unicastRoutingTable;
     $c[PipelineModifications::class] = $this->pipelineModifications;
     /** @var UuidGenerationDefinition $uuidDefinition */
     $uuidDefinition = $this->settings->get(UuidGenerationDefinition::class);
     $c[UuidGeneratorInterface::class] = $uuidDefinition->formalize($this->settings);
     $c[PipelineFactory::class] = new PipelineFactory($c[BuilderInterface::class], new StepChainBuilderFactory());
     $c[BusOperationsContextFactory::class] = new BusOperationsContextFactory();
     $c[BusOperations::class] = new BusOperations($c[PipelineFactory::class], $c[BusOperationsContextFactory::class], $c[PipelineModifications::class], $c[UuidGeneratorInterface::class]);
     $c[OutgoingOptionsFactory::class] = new OutgoingOptionsFactory();
     $c[BusContext::class] = new BusContext(new PipelineRootStageContext($c[BuilderInterface::class]), $c[BusOperations::class], $c[OutgoingOptionsFactory::class]);
     $c[IncomingContextFactory::class] = function ($c) {
         return new IncomingContextFactory($c[BusOperations::class], $c[OutgoingOptionsFactory::class]);
     };
     $c[OutgoingContextFactory::class] = function () {
         return new OutgoingContextFactory();
     };
     $c[ClockInterface::class] = function () {
         return new SystemClock();
     };
     $c[DateTimeConverter::class] = function () {
         return new DateTimeConverter();
     };
     $c[PushPipe::class] = function ($c) {
         /** @var PipelineFactory $pipelineFactory */
         $pipelineFactory = $c[PipelineFactory::class];
         return new PushPipe(new TransportReceiveContextFactory($c[BuilderInterface::class]), $pipelineFactory->createStartingWith(TransportReceiveContext::class, $c[PipelineModifications::class]));
     };
     $c[PushSettings::class] = function () {
         $errorQueue = $this->settings->tryGet(KnownSettingsEnum::ERROR_QUEUE);
         if (!$errorQueue) {
             throw new UnexpectedValueException("The error queue needs to be set. You can do it using endpointConfigurator.sendFailedMessagesTo.");
         }
         return new PushSettings($this->settings->get(KnownSettingsEnum::LOCAL_ADDRESS), $this->settings->get(KnownSettingsEnum::ERROR_QUEUE), $this->settings->tryGet(KnownSettingsEnum::PURGE_ON_STARTUP) ?: false);
     };
     $c[TransportReceiver::class] = function ($c) {
         return new TransportReceiver($c[MessagePusherInterface::class], $c[PushSettings::class], $c[PushPipe::class]);
     };
 }
 /**
  * Method is called if all defined conditions are met and the feature is marked as enabled.
  * Use this method to configure and initialize all required components for the feature like
  * the steps in the pipeline or the instances/factories in the container.
  *
  * @param Settings              $settings
  * @param BuilderInterface      $builder
  * @param PipelineModifications $pipelineModifications
  */
 public function setup(Settings $settings, BuilderInterface $builder, PipelineModifications $pipelineModifications)
 {
     $builder->defineSingleton(LogicalConnection::class, new LogicalConnectionFactory($settings));
     $builder->defineSingleton(OutboxPersister::class, function () use($builder, $settings) {
         return new OutboxPersister($builder->build(LogicalConnection::class), $settings->get(Doctrine1KnownSettingsEnum::OUTBOX_MESSAGES_TABLE_NAME), $settings->get(Doctrine1KnownSettingsEnum::OUTBOX_ENDPOINTS_TABLE_NAME));
     });
     $builder->defineSingleton(OutboxStorageInterface::class, function () use($builder, $settings) {
         return new Doctrine1OutboxStorage($builder->build(OutboxPersister::class), new OutboxMessageConverter(), $settings->get(Doctrine1KnownSettingsEnum::OUTBOX_ENDPOINT_ID));
     });
     $this->registerStartupTask(function () use($builder, $settings) {
         return new EndpointIdLoaderFeatureStartupTask($builder->build(OutboxPersister::class), $settings, $settings->get(KnownSettingsEnum::ENDPOINT_NAME));
     });
     $this->registerStartupTask(function () use($builder, $settings) {
         return new OutboxCleanerFeatureStartupTask($builder->build(OutboxPersister::class), new \DateTime('now', new \DateTimeZone('UTC')), $settings->tryGet(KnownSettingsEnum::DAYS_TO_KEEP_DEDUPLICATION_DATA));
     });
     $this->registerInstallTask(function () use($builder, $settings) {
         return new OutboxTablesCreatorFeatureInstallTask($builder->build(LogicalConnection::class), new OutboxEndpointSchemaProvider(), new OutboxMessageSchemaProvider(), $settings->get(Doctrine1KnownSettingsEnum::OUTBOX_ENDPOINTS_TABLE_NAME), $settings->get(Doctrine1KnownSettingsEnum::OUTBOX_MESSAGES_TABLE_NAME));
     });
 }
Example #11
0
 /**
  * @param Settings $settings
  *
  * @return TransportSendInfrastructure
  */
 public function configure(Settings $settings)
 {
     /** @var TransportInfrastructure $transportInfrastructure */
     $transportInfrastructure = $settings->get(TransportInfrastructure::class);
     return $transportInfrastructure->configureSendInfrastructure();
 }
 /**
  * @return string
  */
 private function getLocalAddress()
 {
     return $this->settings->get(KnownSettingsEnum::LOCAL_ADDRESS);
 }