8000 [Scheduler] Rework the component · symfony/symfony@a18127b · GitHub
[go: up one dir, main page]

Skip to content

Commit a18127b

Browse files
committed
[Scheduler] Rework the component
1 parent 6d9311f commit a18127b

File tree

67 files changed

+1074
-1690
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+1074
-1690
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@
132132
"doctrine/data-fixtures": "^1.1",
133133
"doctrine/dbal": "^2.13.1|^3.0",
134134
"doctrine/orm": "^2.12",
135+
"dragonmantank/cron-expression": "^3",
135136
"egulias/email-validator": "^2.1.10|^3.1|^4",
136137
"guzzlehttp/promises": "^1.4",
137138
"league/html-to-markdown": "^5.0",

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/UnusedTagsPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class UnusedTagsPass implements CompilerPassInterface
8080
'routing.expression_language_provider',
8181
'routing.loader',
8282
'routing.route_loader',
83-
'scheduler.schedule_config_locator',
83+
'scheduler.schedule_provider',
8484
'security.authenticator.login_linker',
8585
'security.expression_language_provider',
8686
'security.remember_me_aware',

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
use Symfony\Component\PropertyInfo\PropertyInfoExtractorInterface;
3838
use Symfony\Component\RateLimiter\Policy\TokenBucketLimiter;
3939
use Symfony\Component\RemoteEvent\RemoteEvent;
40+
use Symfony\Component\Scheduler\Messenger\SchedulerTransportFactory;
4041
use Symfony\Component\Semaphore\Semaphore;
4142
use Symfony\Component\Serializer\Serializer;
4243
use Symfony\Component\Translation\Translator;
@@ -173,6 +174,7 @@ public function getConfigTreeBuilder(): TreeBuilder
173174
$this->addLockSection($rootNode, $enableIfStandalone);
174175
$this->addSemaphoreSection($rootNode, $enableIfStandalone);
175176
$this->addMessengerSection($rootNode, $enableIfStandalone);
177+
$this->addSchedulerSection($rootNode, $enableIfStandalone);
176178
$this->addRobotsIndexSection($rootNode);
177179
$this->addHttpClientSection($rootNode, $enableIfStandalone);
178180
$this->addMailerSection($rootNode, $enableIfStandalone);
@@ -1606,6 +1608,18 @@ function ($a) {
16061608
;
16071609
}
16081610

1611+
private function addSchedulerSection(ArrayNodeDefinition $rootNode, callable $enableIfStandalone): void
1612+
{
1613+
$rootNode
1614+
->children()
1615+
->arrayNode('scheduler')
1616+
->info('Scheduler configuration')
1617+
->{$enableIfStandalone('symfony/scheduler', SchedulerTransportFactory::class)}()
1618+
->end()
1619+
->end()
1620+
;
1621+
}
1622+
16091623
private function addRobotsIndexSection(ArrayNodeDefinition $rootNode): void
16101624
{
16111625
$rootNode

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,8 @@
215215
use Symfony\Component\RemoteEvent\Attribute\AsRemoteEventConsumer;
216216
use Symfony\Component\RemoteEvent\RemoteEvent;
217217
use Symfony\Component\Routing\Loader\Psr4DirectoryLoader;
218-
use Symfony\Component\Scheduler\Locator\ScheduleConfigLocatorInterface;
219-
use Symfony\Component\Scheduler\Messenger\ScheduleTransportFactory;
218+
use Symfony\Component\Scheduler\Attribute\AsSchedule;
219+
use Symfony\Component\Scheduler\Messenger\SchedulerTransportFactory;
220220
use Symfony\Component\Security\Core\AuthenticationEvents;
221221
use Symfony\Component\Security\Core\Exception\AuthenticationException;
222222
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
@@ -528,9 +528,18 @@ public function load(array $configs, ContainerBuilder $container)
528528
// validation depends on form, annotations being registered
529529
$this->registerValidationConfiguration($config['validation'], $container, $loader, $propertyInfoEnabled);
530530

531+
$messengerEnabled = $this->readConfigEnabled('messenger', $container, $config['messenger']);
532+
533+
if ($this->readConfigEnabled('scheduler', $container, $config['scheduler'])) {
534+
if (!$messengerEnabled) {
535+
throw new LogicException('Scheduler support cannot be enabled as the Messenger component is not '.(interface_exists(MessageBusInterface::class) ? 'enabled.' : 'installed. Try running "composer require symfony/messenger".'));
536+
}
537+
$this->registerSchedulerConfiguration($config['scheduler'], $container, $loader);
538+
}
539+
531540
// messenger depends on validation being registered
532-
if ($this->readConfigEnabled('messenger', $container, $config['messenger'])) {
533-
$this->registerMessengerConfiguration($config['messenger'], $container, $loader, $config['validation']);
541+
if ($messengerEnabled) {
542+
$this->registerMessengerConfiguration($config['messenger'], $container, $loader, $this->readConfigEnabled('validation', $container, $config['validation']));
534543
} else {
535544
$container->removeDefinition('console.command.messenger_consume_messages');
536545
$container->removeDefinition('console.command.messenger_stats');
@@ -675,8 +684,6 @@ public function load(array $configs, ContainerBuilder $container)
675684
->addTag('messenger.message_handler');
676685
$container->registerForAutoconfiguration(TransportFactoryInterface::class)
677686
->addTag('messenger.transport_factory');
678-
$container->registerForAutoconfiguration(ScheduleConfigLocatorInterface::class)
679-
->addTag('scheduler.schedule_config_locator');
680687
$container->registerForAutoconfiguration(MimeTypeGuesserInterface::class)
681688
->addTag('mime.mime_type_guesser');
682689
$container->registerForAutoconfiguration(LoggerAwareInterface::class)
@@ -710,10 +717,12 @@ public function load(array $configs, ContainerBuilder $container)
710717
}
711718
$definition->addTag('messenger.message_handler', $tagAttributes);
712719
});
713-
714720
$container->registerAttributeForAutoconfiguration(AsTargetedValueResolver::class, static function (ChildDefinition $definition, AsTargetedValueResolver $attribute): void {
715721
$definition->addTag('controller.targeted_value_resolver', $attribute->name ? ['name' => $attribute->name] : []);
716722
});
723+
$container->registerAttributeForAutoconfiguration(AsSchedule::class, static function (ChildDefinition $definition, AsSchedule $attribute): void {
724+
$definition->addTag('scheduler.schedule_provider', ['name' => $attribute->name]);
725+
});
717726

718727
if (!$container->getParameter('kernel.debug')) {
719728
// remove tagged iterator argument for resource checkers
@@ -1999,7 +2008,20 @@ private function registerSemaphoreConfiguration(array $config, ContainerBuilder
19992008
}
20002009
}
20012010

2002-
private function registerMessengerConfiguration(array $config, ContainerBuilder $container, PhpFileLoader $loader, array $validationConfig): void
2011+
private function registerSchedulerConfiguration(array $config, ContainerBuilder $container, PhpFileLoader $loader): void
2012+
{
2013+
if (!class_exists(SchedulerTransportFactory::class)) {
2014+
throw new LogicException('Scheduler support cannot be enabled as the Scheduler component is not installed. Try running "composer require symfony/scheduler".');
2015+
}
2016+
2017+
if (!interface_exists(MessageBusInterface::class)) {
2018+
throw new LogicException('Scheduler support cannot be enabled as the Messenger component is not installed. Try running "composer require symfony/messenger".');
2019+
}
2020+
2021+
$loader->load('scheduler.php');
2022+
}
2023+
2024+
private function registerMessengerConfiguration(array $config, ContainerBuilder $container, PhpFileLoader $loader, bool $validationEnabled): void
20032025
{
20042026
if (!interface_exists(MessageBusInterface::class)) {
20052027
throw new LogicException('Messenger support cannot be enabled as the Messenger component is not installed. Try running "composer require symfony/messenger".');
@@ -2031,10 +2053,6 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
20312053
$container->getDefinition('messenger.transport.beanstalkd.factory')->addTag('messenger.transport_factory');
20322054
}
20332055

2034-
if (ContainerBuilder::willBeAvailable('symfony/scheduler', ScheduleTransportFactory::class, ['symfony/framework-bundle', 'symfony/messenger'])) {
2035-
$loader->load('scheduler.php');
2036-
}
2037-
20382056
if (null === $config['default_bus'] && 1 === \count($config['buses'])) {
20392057
$config['default_bus'] = key($config['buses']);
20402058
}
@@ -2065,7 +2083,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
20652083
}
20662084

20672085
foreach ($middleware as $middlewareItem) {
2068-
if (!$validationConfig['enabled'] && \in_array($middlewareItem['id'], ['validation', 'messenger.middleware.validation'], true)) {
2086+
if (!$validationEnabled && \in_array($middlewareItem['id'], ['validation', 'messenger.middleware.validation'], true)) {
20692087
throw new LogicException('The Validation middleware is only available when the Validator component is installed and enabled. Try running "composer require symfony/validator".');
20702088
}
20712089
}
@@ -2091,7 +2109,6 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
20912109
$container->removeDefinition('messenger.transport.redis.factory');
20922110
$container->removeDefinition('messenger.transport.sqs.factory');
20932111
$container->removeDefinition('messenger.transport.beanstalkd.factory');
2094-
$container->removeDefinition('scheduler.messenger_transport_factory');
20952112
$container->removeAlias(SerializerInterface::class);
20962113
} else {
20972114
$container->getDefinition('messenger.transport.symfony_serializer')

src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
use Symfony\Component\Mime\DependencyInjection\AddMimeTypeGuesserPass;
6161
use Symfony\Component\PropertyInfo\DependencyInjection\PropertyInfoPass;
6262
use Symfony\Component\Routing\DependencyInjection\RoutingResolverPass;
63-
use Symfony\Component\Scheduler\DependencyInjection\SchedulerPass;
63+
use Symfony\Component\Scheduler\DependencyInjection\AddScheduleMessengerPass;
6464
use Symfony\Component\Serializer\DependencyInjection\SerializerPass;
6565
use Symfony\Component\Translation\DependencyInjection\TranslationDumperPass;
6666
use Symfony\Component\Translation\DependencyInjection\TranslationExtractorPass;
@@ -166,8 +166,8 @@ public function build(ContainerBuilder $container)
166166
$container->addCompilerPass(new TestServiceContainerWeakRefPass(), PassConfig::TYPE_BEFORE_REMOVING, -32);
167167
$container->addCompilerPass(new TestServiceContainerRealRefPass(), PassConfig::TYPE_AFTER_REMOVING);
168168
$this->addCompilerPassIfExists($container, AddMimeTypeGuesserPass::class);
169+
$this->addCompilerPassIfExists($container, AddScheduleMessengerPass::class);
169170
$this->addCompilerPassIfExists($container, MessengerPass::class);
170-
$this->addCompilerPassIfExists($container, SchedulerPass::class);
171171
$this->addCompilerPassIfExists($container, HttpClientPass::class);
172172
$this->addCompilerPassIfExists($container, AddAutoMappingConfigurationPass::class);
173173
$container->addCompilerPass(new RegisterReverseContainerPass(true));

src/Symfony/Bundle/FrameworkBundle/Resources/config/cache.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@
7171
->private()
7272
->tag('cache.pool')
7373

74+
->set('cache.scheduler')
75+
->parent('cache.app')
76+
->private()
77+
->tag('cache.pool')
78+
7479
->set('cache.adapter.system', AdapterInterface::class)
7580
->abstract()
7681
->factory([AbstractAdapter::class, 'createSystemCache'])

src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
->tag('serializer.normalizer', ['priority' => -880])
7676

7777
->set('messenger.transport.native_php_serializer', PhpSerializer::class)
78+
->alias('messenger.default_serializer', 'messenger.transport.native_php_serializer')
7879

7980
// Middleware
8081
->set('messenger.middleware.handle_message', HandleMessageMiddleware::class)

src/Symfony/Bundle/FrameworkBundle/Resources/config/scheduler.php

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,42 +11,15 @@
1111

1212
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
1313

14-
use Symfony\Component\DependencyInjection\ServiceLocator;
15-
use Symfony\Component\Scheduler\Locator\ChainScheduleConfigLocator;
16-
use Symfony\Component\Scheduler\Messenger\ScheduleTransportFactory;
17-
use Symfony\Component\Scheduler\State\StateFactory;
14+
use Symfony\Component\Scheduler\Messenger\SchedulerTransportFactory;
1815

1916
return static function (ContainerConfigurator $container) {
2017
$container->services()
21-
->set('scheduler.messenger_transport_factory', ScheduleTransportFactory::class)
18+
->set('scheduler.messenger_transport_factory', SchedulerTransportFactory::class)
2219
->args([
20+
tagged_locator('scheduler.schedule_provider', 'name'),
2321
service('clock'),
24-
service('scheduler.schedule_config_locator'),
25-
service('scheduler.state_factory'),
2622
])
2723
->tag('messenger.transport_factory')
28-
29-
->set('scheduler.schedule_config_locator', ChainScheduleConfigLocator::class)
30-
->args([
31-
tagged_iterator('scheduler.schedule_config_locator'),
32-
])
33-
34-
->set('scheduler.state_factory', StateFactory::class)
35-
->args([
36-
service('scheduler.lock_locator'),
37-
service('scheduler.cache_locator'),
38-
])
39-
40-
->set('scheduler.lock_locator', ServiceLocator::class)
41-
->args([
42-
[],
43-
])
44-
->tag('container.service_locator')
45-
46-
->set('scheduler.cache_locator', ServiceLocator::class)
47-
->args([
48-
[],
49-
])
50-
->tag('container.service_locator')
5124
;
5225
};

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<xsd:element name="validation" type="validation" minOccurs="0" maxOccurs="1" />
2525
<xsd:element name="annotations" type="annotations" minOccurs="0" maxOccurs="1" />
2626
<xsd:element name="property-access" type="property_access" minOccurs="0" maxOccurs="1" />
27+
<xsd:element name="scheduler" type="scheduler" minOccurs="0" maxOccurs="1" />
2728
<xsd:element name="serializer" type="serializer" minOccurs="0" maxOccurs="1" />
2829
<xsd:element name="property-info" type="property_info" minOccurs="0" maxOccurs="1" />
2930
<xsd:element name="cache" type="cache" minOccurs="0" maxOccurs="1" />
@@ -271,6 +272,10 @@
271272
<xsd:attribute name="throw-exception-on-invalid-property-path" type="xsd:boolean" />
272273
</xsd:complexType>
273274

275+
<xsd:complexType name="scheduler">
276+
<xsd:attribute name="enabled" type="xsd:boolean" />
277+
</xsd:complexType>
278+
274279
<xsd:complexType name="serializer">
275280
<xsd:choice minOccurs="0" maxOccurs="unbounded">
276281
<xsd:element name="mapping" type="file_mapping" />

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php

Lines changed: 4 additions & 0 deletions
F438
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use Symfony\Component\Messenger\MessageBusInterface;
2727
use Symfony\Component\Notifier\Notifier;
2828
use Symfony\Component\RateLimiter\Policy\TokenBucketLimiter;
29+
use Symfony\Component\Scheduler\Messenger\SchedulerTransportFactory;
2930
use Symfony\Component\Uid\Factory\UuidFactory;
3031

3132
class ConfigurationTest extends TestCase
@@ -687,6 +688,9 @@ class_exists(SemaphoreStore::class) && SemaphoreStore::isSupported() ? 'semaphor
687688
'enabled' => !class_exists(FullStack::class) && class_exists(HtmlSanitizer::class),
688689
'sanitizers' => [],
689690
],
691+
'scheduler' => [
692+
'enabled' => !class_exists(FullStack::class) && class_exists(SchedulerTransportFactory::class),
693+
],
690694
'exceptions' => [],
691695
'webhook' => [
692696
'enabled' => false,

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
$container->loadFromExtension('framework', [
77
'http_method_override' => false,
8+
'scheduler' => true,
89
'messenger' => [
910
'routing' => [
1011
FooMessage::class => ['sender.bar', 'sender.biz'],

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_schedule.php

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
77

88
<framework:config http-method-override="false">
9+
<framework:scheduler enabled="true" />
910
<framework:messenger>
1011
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage">
1112
<framework:sender service="sender.bar" />

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
framework:
22
http_method_override: false
3+
scheduler: true
34
messenger:
45
routing:
56
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage': ['sender.bar', 'sender.biz']

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -813,13 +813,13 @@ public function testMessenger()
813813
$container->compile();
814814

815815
$expectedFactories = [
816+
new Reference('scheduler.messenger_transport_factory'),
816817
new Reference('messenger.transport.amqp.factory'),
817818
new Reference('messenger.transport.redis.factory'),
818819
new Reference('messenger.transport.sync.factory'),
819820
new Reference('messenger.transport.in_memory.factory'),
820821
new Reference('messenger.transport.sqs.factory'),
821822
new Reference('messenger.transport.beanstalkd.factory'),
822-
new Reference('scheduler.messenger_transport_factory'),
823823
];
824824

825825
$this->assertTrue($container->hasDefinition('messenger.receiver_locator'));
@@ -979,8 +979,6 @@ public function testMessengerTransports()
979979
$this->assertCount(3, $transportArguments);
980980
$this->assertSame('schedule://default', $transportArguments[0]);
981981

982-
$this->assertTrue($container->hasDefinition('scheduler.messenger_transport_factory'));
983-
984982
$this->assertSame(10, $container->getDefinition('messenger.retry.multiplier_retry_strategy.customised')->getArgument(0));
985983
$this->assertSame(7, $container->getDefinition('messenger.retry.multiplier_retry_strategy.customised')->getArgument(1));
986984
$this->assertSame(3, $container->getDefinition('messenger.retry.multiplier_retry_strategy.customised')->getArgument(2));
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger;
4+
5+
use Symfony\Component\Cache\Adapter\ArrayAdapter;
6+
use Symfony\Component\Lock\Key;
7+
use Symfony\Component\Lock\Lock;
8+
use Symfony\Component\Lock\Store\InMemoryStore;
9+
use Symfony\Component\Scheduler\Attribute\AsSchedule;
10+
use Symfony\Component\Scheduler\Schedule;
11+
use Symfony\Component\Scheduler\ScheduleProviderInterface;
12+
13+
#[AsSchedule('dummy')]
14+
class DummySchedule implements ScheduleProviderInterface
15+
{
16+
public static array $recurringMessages;
17+
18+
public function getSchedule(): Schedule
19+
{
20+
return (new Schedule())
21+
->add(...self::$recurringMessages)
22+
->stateful(new ArrayAdapter())
23+
->lock(new Lock(new Key('dummy'), new InMemoryStore()))
24+
;
25+
}
26+
}

src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Messenger/DummyScheduleConfigLocator.php

Lines changed: 0 additions & 29 deletions
This file was deleted.

0 commit comments

Comments
 (0)
0