/** * 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) { $pipelineModifications->registerStep('OutgoingPhysicalToDispatchConnector', OutgoingPhysicalToDispatchConnector::class, function () use($builder) { return new OutgoingPhysicalToDispatchConnector($builder->build(OutgoingContextFactory::class), $builder->build(DateTimeConverter::class), $builder->build(ClockInterface::class)); }); $pipelineModifications->registerStep('ImmediateDispatchTerminator', ImmediateDispatchTerminator::class, function () use($builder) { return new ImmediateDispatchTerminator($builder->build(MessageDispatcherInterface::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) { $maxRetries = $this->getMaxRetries($settings); $builder->defineSingleton(FirstLevelRetryStorage::class, new FirstLevelRetryStorage()); $builder->defineSingleton(FirstLevelRetryPolicy::class, new FirstLevelRetryPolicy($maxRetries)); $pipelineModifications->registerStep('FirstLevelRetryPipelineStep', FirstLevelRetryPipelineStep::class, function () use($builder) { return new FirstLevelRetryPipelineStep($builder->build(FirstLevelRetryStorage::class), $builder->build(FirstLevelRetryPolicy::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) { $pipelineModifications->registerStep('OutgoingLogicalMessageMutation', OutgoingLogicalMessageMutationPipelineStep::class, function () use($builder) { return new OutgoingLogicalMessageMutationPipelineStep($builder->build(MessageMutatorRegistry::class)); }); $pipelineModifications->registerStep('OutgoingPhysicalMessageMutation', OutgoingPhysicalMessageMutationPipelineStep::class, function () use($builder) { return new OutgoingPhysicalMessageMutationPipelineStep($builder->build(MessageMutatorRegistry::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) { $pipelineModifications->registerStep('LoadHandlersConnector', LoadHandlersConnector::class, function () use($builder) { return new LoadHandlersConnector($builder->build(MessageHandlerRegistry::class), $builder->build(IncomingContextFactory::class)); }); $pipelineModifications->registerStep('InvokeHandlerTerminator', InvokeHandlerTerminator::class, function () use($builder) { return new InvokeHandlerTerminator(); }); }
/** * 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())); }); }
/** * 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)); }); } }
/** * 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)); }); }
/** * 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'); }
/** * @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; }
/** * @param string $stepId * @param string $stepFqcn * @param callable|null $factory * @param string|null $description * * @return Pipeline\StepRegistration */ public function registerPipelineStep($stepId, $stepFqcn, callable $factory = null, $description = null) { return $this->pipelineModifications->registerStep($stepId, $stepFqcn, $factory, $description); }
/** * 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) { $pipelineModifications->registerStep('AttachCorrelationIdPipelineStep', AttachCorrelationIdPipelineStep::class, function () { return new AttachCorrelationIdPipelineStep(); }); }