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