diff --git a/pkg/bridge/DI/QuartzConfiguration.php b/pkg/bridge/DI/QuartzConfiguration.php index 48b7235..8decaea 100644 --- a/pkg/bridge/DI/QuartzConfiguration.php +++ b/pkg/bridge/DI/QuartzConfiguration.php @@ -7,27 +7,33 @@ class QuartzConfiguration implements ConfigurationInterface { - /** - * {@inheritdoc} - */ public function getConfigTreeBuilder() { $tb = new TreeBuilder(); $rootNode = $tb->root('quartz'); $rootNode->children() - ->arrayNode('store')->addDefaultsIfNotSet()->children() + ->arrayNode('yadm_simple_store')->children() ->scalarNode('uri')->defaultValue('mongodb://localhost:27017')->end() ->variableNode('uriOptions')->defaultValue([])->end() ->variableNode('driverOptions')->defaultValue([])->end() ->scalarNode('sessionId')->defaultValue('quartz')->end() ->scalarNode('dbName')->defaultValue(null)->end() - ->scalarNode('managementLockCol')->defaultValue('managementLock')->end() - ->scalarNode('calendarCol')->defaultValue('calendar')->end() - ->scalarNode('triggerCol')->defaultValue('trigger')->end() - ->scalarNode('firedTriggerCol')->defaultValue('firedTrigger')->end() - ->scalarNode('jobCol')->defaultValue('job')->end() - ->scalarNode('pausedTriggerCol')->defaultValue('pausedTrigger')->end() + ->scalarNode('managementLockCol')->defaultValue('quartz_management_lock')->end() + ->scalarNode('calendarCol')->defaultValue('quartz_calendar')->end() + ->scalarNode('triggerCol')->defaultValue('quartz_trigger')->end() + ->scalarNode('firedTriggerCol')->defaultValue('quartz_fired_trigger')->end() + ->scalarNode('jobCol')->defaultValue('quartz_job')->end() + ->scalarNode('pausedTriggerCol')->defaultValue('quartz_paused_trigger')->end() + ->end()->end() + ->arrayNode('yadm_bundle_store')->children() + ->scalarNode('sessionId')->defaultValue('quartz')->end() + ->scalarNode('managementLockCol')->defaultValue('quartz_management_lock')->end() + ->scalarNode('calendarStorage')->defaultValue('quartz_calendar')->end() + ->scalarNode('triggerStorage')->defaultValue('quartz_trigger')->end() + ->scalarNode('firedTriggerStorage')->defaultValue('quartz_fired_trigger')->end() + ->scalarNode('jobStorage')->defaultValue('quartz_job')->end() + ->scalarNode('pausedTriggerStorage')->defaultValue('quartz_paused_trigger')->end() ->end()->end() ->integerNode('misfireThreshold')->min(10)->defaultValue(60)->end() ; diff --git a/pkg/bridge/DI/QuartzExtension.php b/pkg/bridge/DI/QuartzExtension.php index 7ad7742..5e5b268 100644 --- a/pkg/bridge/DI/QuartzExtension.php +++ b/pkg/bridge/DI/QuartzExtension.php @@ -7,12 +7,13 @@ use Quartz\Bridge\Scheduler\EnqueueJobRunShell; use Quartz\Bridge\Scheduler\JobRunShellProcessor; use Quartz\Bridge\Scheduler\RpcProtocol; +use Quartz\Bridge\Yadm\BundleStoreResource; +use Quartz\Bridge\Yadm\SimpleStoreResource; +use Quartz\Bridge\Yadm\YadmStore; use Quartz\Core\SimpleJobFactory; use Quartz\Scheduler\StdJobRunShell; use Quartz\Scheduler\StdJobRunShellFactory; use Quartz\Scheduler\StdScheduler; -use Quartz\Scheduler\Store\YadmStore; -use Quartz\Scheduler\Store\YadmStoreResource; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Reference; @@ -47,12 +48,30 @@ public function load(array $configs, ContainerBuilder $container) { $config = $this->processConfiguration(new QuartzConfiguration(), $configs); - $container->register($this->format('store_resource'), YadmStoreResource::class) - ->setArguments([$config['store']]) - ; + if (false == empty($config['yadm_simple_store']) && false == empty($config['yadm_bundle_store'])) { + throw new \LogicException('Either yadm_simple_store or yadm_bundle_store must be set. Both are set'); + } + if (empty($config['yadm_simple_store']) && empty($config['yadm_bundle_store'])) { + throw new \LogicException('Either yadm_simple_store or yadm_bundle_store must be set. None is set'); + } + + if (false == empty($config['yadm_simple_store'])) { + $container->register($this->format('store_resource'), SimpleStoreResource::class) + ->addArgument($config['yadm_simple_store']) + ; + } + + if (false == empty($config['yadm_bundle_store'])) { + $container->register($this->format('store_resource'), BundleStoreResource::class) + ->addArgument(new Reference('yadm.client_provider')) + ->addArgument(new Reference('yadm.collection_factory')) + ->addArgument(new Reference('yadm')) + ->addArgument($config['yadm_bundle_store']) + ; + } $container->register($this->format('store'), YadmStore::class) - ->setArguments([new Reference($this->format('store_resource'))]) + ->addArgument(new Reference($this->format('store_resource'))) ->addMethodCall('setMisfireThreshold', [$config['misfireThreshold']]) ; diff --git a/pkg/bridge/Scheduler/SchedulerFactory.php b/pkg/bridge/Scheduler/SchedulerFactory.php index 03759eb..2bf4825 100644 --- a/pkg/bridge/Scheduler/SchedulerFactory.php +++ b/pkg/bridge/Scheduler/SchedulerFactory.php @@ -5,6 +5,8 @@ use Quartz\Bridge\Enqueue\EnqueueRemoteTransport; use Quartz\Bridge\Enqueue\EnqueueRemoteTransportProcessor; use Quartz\Bridge\Enqueue\EnqueueResponseJob; +use Quartz\Bridge\Yadm\SimpleStoreResource; +use Quartz\Bridge\Yadm\YadmStore; use Quartz\Core\Scheduler; use Quartz\Core\SchedulerFactory as BaseSchedulerFactory; use Quartz\Core\SimpleJobFactory; @@ -12,8 +14,6 @@ use Quartz\Scheduler\StdJobRunShell; use Quartz\Scheduler\StdJobRunShellFactory; use Quartz\Scheduler\StdScheduler; -use Quartz\Scheduler\Store\YadmStore; -use Quartz\Scheduler\Store\YadmStoreResource; use Symfony\Component\EventDispatcher\EventDispatcher; class SchedulerFactory implements BaseSchedulerFactory @@ -134,7 +134,7 @@ public function getStore() { if (null == $this->store) { $config = isset($this->config['store']) ? $this->config['store'] : []; - $this->store = new YadmStore(new YadmStoreResource($config)); + $this->store = new YadmStore(new SimpleStoreResource($config)); } return $this->store; diff --git a/pkg/bridge/Tests/Scheduler/JobRunShellProcessorTest.php b/pkg/bridge/Tests/Scheduler/JobRunShellProcessorTest.php index 7b6b118..2853734 100644 --- a/pkg/bridge/Tests/Scheduler/JobRunShellProcessorTest.php +++ b/pkg/bridge/Tests/Scheduler/JobRunShellProcessorTest.php @@ -10,8 +10,8 @@ use Interop\Queue\Processor; use PHPUnit\Framework\TestCase; use Quartz\Bridge\Scheduler\JobRunShellProcessor; +use Quartz\Bridge\Yadm\YadmStore; use Quartz\Scheduler\StdJobRunShell; -use Quartz\Scheduler\Store\YadmStore; use Quartz\Triggers\SimpleTrigger; class JobRunShellProcessorTest extends TestCase diff --git a/pkg/quartz/Tests/Functional/Scheduler/Store/YadmStoreTest.php b/pkg/bridge/Tests/Yadm/YadmStoreTest.php similarity index 99% rename from pkg/quartz/Tests/Functional/Scheduler/Store/YadmStoreTest.php rename to pkg/bridge/Tests/Yadm/YadmStoreTest.php index 2a8664a..b01dc00 100644 --- a/pkg/quartz/Tests/Functional/Scheduler/Store/YadmStoreTest.php +++ b/pkg/bridge/Tests/Yadm/YadmStoreTest.php @@ -1,5 +1,5 @@ getenv('MONGODB_DB') ]; - $this->res = new YadmStoreResource($config); + $this->res = new SimpleStoreResource($config); $this->store = new YadmStore($this->res); $this->store->initialize($this->createMock(StdScheduler::class)); $this->store->clearAllSchedulingData(); diff --git a/pkg/bridge/Yadm/BundleStoreResource.php b/pkg/bridge/Yadm/BundleStoreResource.php new file mode 100644 index 0000000..20752d9 --- /dev/null +++ b/pkg/bridge/Yadm/BundleStoreResource.php @@ -0,0 +1,93 @@ +options = array_replace([ + 'sessionId' => 'quartz', + 'managementLockCol' => 'quartz_management_lock', + 'calendarStorage' => 'quartz_calendar', + 'triggerStorage' => 'quartz_trigger', + 'firedTriggerStorage' => 'quartz_fired_trigger', + 'jobStorage' => 'quartz_job', + 'pausedTriggerStorage' => 'quartz_paused_trigger', + ], $options); + + $this->clientProvider = $clientProvider; + $this->collectionFactory = $collectionFactory; + $this->registry = $registry; + } + + public function getClient(): Client + { + return $this->getClientProvider()->getClient(); + } + + public function getClientProvider(): ClientProvider + { + return $this->clientProvider; + } + + public function getCollectionFactory(): CollectionFactory + { + return $this->collectionFactory; + } + + public function getManagementLock(): PessimisticLock + { + if (false == $this->managementLock) { + $collection = $this->getCollectionFactory()->create($this->options['managementLockCol']); + + $this->managementLock = new PessimisticLock($collection, $this->options['sessionId']); + } + + return $this->managementLock; + } + + public function getCalendarStorage(): CalendarStorage + { + return $this->registry->getStorage($this->options['calendarStorage']); + } + + public function getTriggerStorage(): TriggerStorage + { + return $this->registry->getStorage($this->options['triggerStorage']); + } + + public function getFiredTriggerStorage(): FiredTriggerStorage + { + return $this->registry->getStorage($this->options['firedTriggerStorage']); + } + + public function getJobStorage(): JobStorage + { + return $this->registry->getStorage($this->options['jobStorage']); + } + + public function getPausedTriggerStorage(): PausedTriggerStorage + { + return $this->registry->getStorage($this->options['pausedTriggerStorage']); + } +} diff --git a/pkg/bridge/Yadm/CalendarStorage.php b/pkg/bridge/Yadm/CalendarStorage.php new file mode 100644 index 0000000..c57e025 --- /dev/null +++ b/pkg/bridge/Yadm/CalendarStorage.php @@ -0,0 +1,28 @@ + 1], ['unique' => true]), + ]; + } + + public function getCreateCollectionOptions(): array + { + return []; + } +} \ No newline at end of file diff --git a/pkg/bridge/Yadm/FiredTriggerStorage.php b/pkg/bridge/Yadm/FiredTriggerStorage.php new file mode 100644 index 0000000..02a4da8 --- /dev/null +++ b/pkg/bridge/Yadm/FiredTriggerStorage.php @@ -0,0 +1,28 @@ + 1]), + ]; + } + + public function getCreateCollectionOptions(): array + { + return []; + } +} \ No newline at end of file diff --git a/pkg/bridge/Yadm/JobStorage.php b/pkg/bridge/Yadm/JobStorage.php new file mode 100644 index 0000000..2f2a099 --- /dev/null +++ b/pkg/bridge/Yadm/JobStorage.php @@ -0,0 +1,29 @@ + 1, 'group' => 1], ['unique' => true]), + new Index(['group' => 1]), + ]; + } + + public function getCreateCollectionOptions(): array + { + return []; + } +} diff --git a/pkg/bridge/Yadm/ModelHydrator.php b/pkg/bridge/Yadm/ModelHydrator.php new file mode 100644 index 0000000..1c3da48 --- /dev/null +++ b/pkg/bridge/Yadm/ModelHydrator.php @@ -0,0 +1,21 @@ +hydrate($values, build_object($class, $values)); + } +} \ No newline at end of file diff --git a/pkg/bridge/Yadm/PausedTriggerStorage.php b/pkg/bridge/Yadm/PausedTriggerStorage.php new file mode 100644 index 0000000..a4de817 --- /dev/null +++ b/pkg/bridge/Yadm/PausedTriggerStorage.php @@ -0,0 +1,28 @@ + 1]), + ]; + } + + public function getCreateCollectionOptions(): array + { + return []; + } +} \ No newline at end of file diff --git a/pkg/bridge/Yadm/SimpleStoreResource.php b/pkg/bridge/Yadm/SimpleStoreResource.php new file mode 100644 index 0000000..1b7bb0f --- /dev/null +++ b/pkg/bridge/Yadm/SimpleStoreResource.php @@ -0,0 +1,146 @@ +options = array_replace([ + 'uri' => 'mongodb://localhost:27017', + 'uriOptions' => [], + 'driverOptions' => [], + 'sessionId' => 'quartz', + 'dbName' => 'quartz', + 'managementLockCol' => 'managementLock', + 'calendarCol' => 'calendar', + 'triggerCol' => 'trigger', + 'firedTriggerCol' => 'firedTrigger', + 'jobCol' => 'job', + 'pausedTriggerCol' => 'pausedTrigger', + + ], $options); + } + + public function getClient(): Client + { + return $this->getClientProvider()->getClient(); + } + + public function getClientProvider(): ClientProvider + { + if (false == $this->clientProvider) { + $this->clientProvider = new ClientProvider($this->options['uri'], $this->options['uriOptions'], $this->options['driverOptions']); + } + + return $this->clientProvider; + } + + public function getCollectionFactory(): CollectionFactory + { + if (false == $this->collectionFactory) { + $this->collectionFactory = new CollectionFactory($this->getClientProvider(), $this->options['uri']); + } + + return $this->collectionFactory; + } + + public function getManagementLock(): PessimisticLock + { + if (false == $this->managementLock) { + $collection = $this->getCollectionFactory()->create($this->options['managementLockCol']); + + $this->managementLock = new PessimisticLock($collection, $this->options['sessionId']); + } + + return $this->managementLock; + } + + public function getCalendarStorage(): CalendarStorage + { + if (false == $this->calendarStorage) { + $this->calendarStorage = new CalendarStorage( + $this->options['calendarCol'], + $this->getCollectionFactory(), + new ModelHydrator() + ); + } + + return $this->calendarStorage; + } + + public function getTriggerStorage(): TriggerStorage + { + if (false == $this->triggerStorage) { + $this->triggerStorage = new TriggerStorage( + $this->options['triggerCol'], + $this->getCollectionFactory(), + new ModelHydrator() + ); + } + + return $this->triggerStorage; + } + + public function getFiredTriggerStorage(): FiredTriggerStorage + { + if (false == $this->firedTriggerStorage) { + $this->firedTriggerStorage = new FiredTriggerStorage( + $this->options['firedTriggerCol'], + $this->getCollectionFactory(), + new ModelHydrator() + ); + } + + return $this->firedTriggerStorage; + } + + public function getJobStorage(): JobStorage + { + if (false == $this->jobStorage) { + $this->jobStorage = new JobStorage( + $this->options['jobCol'], + $this->getCollectionFactory(), + new ModelHydrator() + ); + } + + return $this->jobStorage; + } + + public function getPausedTriggerStorage(): PausedTriggerStorage + { + if (false == $this->pausedTriggerStorage) { + $this->pausedTriggerStorage = new PausedTriggerStorage( + $this->options['pausedTriggerCol'], + $this->getCollectionFactory(), + new ModelHydrator() + ); + } + + return $this->pausedTriggerStorage; + } +} diff --git a/pkg/bridge/Yadm/StoreResource.php b/pkg/bridge/Yadm/StoreResource.php new file mode 100644 index 0000000..049eacd --- /dev/null +++ b/pkg/bridge/Yadm/StoreResource.php @@ -0,0 +1,29 @@ + 1, 'group' => 1], ['unique' => true]), + new Index(['group' => 1]), + new Index(['jobName' => 1, 'jobGroup' => 1]), + new Index(['jobGroup' => 1]), + new Index(['calendarName' => 1]), + new Index(['state' => 1]), + new Index(['nextFireTime.unix' => 1]), + ]; + } + + public function getCreateCollectionOptions(): array + { + return []; + } +} \ No newline at end of file diff --git a/pkg/quartz/Scheduler/Store/YadmStore.php b/pkg/bridge/Yadm/YadmStore.php similarity index 94% rename from pkg/quartz/Scheduler/Store/YadmStore.php rename to pkg/bridge/Yadm/YadmStore.php index f813856..178eec0 100644 --- a/pkg/quartz/Scheduler/Store/YadmStore.php +++ b/pkg/bridge/Yadm/YadmStore.php @@ -1,11 +1,14 @@ res = $res; } @@ -419,7 +419,7 @@ public function doClearAllSchedulingData() $this->res->getTriggerStorage()->getCollection()->deleteMany([]); $this->res->getJobStorage()->getCollection()->deleteMany([]); $this->res->getCalendarStorage()->getCollection()->deleteMany([]); - $this->res->getPausedTriggerCol()->deleteMany([]); + $this->res->getPausedTriggerStorage()->getCollection()->deleteMany([]); $this->res->getFiredTriggerStorage()->getCollection()->deleteMany([]); } @@ -679,7 +679,7 @@ public function resumeTriggers(GroupMatcher $matcher) */ public function getPausedTriggerGroups() { - return $this->res->getPausedTriggerCol()->distinct('groupName'); + return $this->res->getPausedTriggerStorage()->getCollection()->distinct('groupName'); } /** @@ -1138,7 +1138,7 @@ private function executeInLock($lockName, callable $callback) */ public function insertPausedTriggerGroup($groupName) { - $result = $this->res->getPausedTriggerCol()->updateOne( + $result = $this->res->getPausedTriggerStorage()->getCollection()->updateOne( ['groupName' => $groupName], ['$set' => ['groupName' => $groupName]], ['upsert' => true] @@ -1154,7 +1154,7 @@ public function insertPausedTriggerGroup($groupName) */ public function deletePausedTriggerGroup($groupName) { - $result = $this->res->getPausedTriggerCol()->deleteOne(['groupName' => $groupName]); + $result = $this->res->getPausedTriggerStorage()->getCollection()->deleteOne(['groupName' => $groupName]); return $result->isAcknowledged() && $result->getDeletedCount(); } @@ -1166,7 +1166,7 @@ public function deletePausedTriggerGroup($groupName) */ public function isTriggerGroupPaused($groupName) { - return (bool) $this->res->getPausedTriggerCol()->count(['groupName' => $groupName]); + return (bool) $this->res->getPausedTriggerStorage()->getCollection()->count(['groupName' => $groupName]); } /** @@ -1206,7 +1206,33 @@ public function retrieveFireTrigger($fireInstanceId) */ public function createIndexes() { - $this->res->dropIndexes(); - $this->res->createIndexes(); + try { + $this->res->getTriggerStorage()->getCollection()->dropIndexes(); + $this->res->getJobStorage()->getCollection()->dropIndexes(); + $this->res->getCalendarStorage()->getCollection()->dropIndexes(); + $this->res->getPausedTriggerStorage()->getCollection()->dropIndexes(); + $this->res->getFiredTriggerStorage()->getCollection()->dropIndexes(); + } catch (RuntimeException $e) { + } + + $lock = $this->res->getManagementLock(); + foreach ($lock->getIndexes() as $index) { + $lock->getCollection()->createIndexes($index->getKey(), $index->getOptions()); + } + + $storages = [ + $this->res->getCalendarStorage(), + $this->res->getTriggerStorage(), + $this->res->getJobStorage(), + $this->res->getPausedTriggerStorage(), + $this->res->getFiredTriggerStorage(), + ]; + + foreach ($storages as $storage) { + /** @var Storage|StorageMetaInterface $storage */ + foreach ($storage->getIndexes() as $index) { + $storage->getCollection()->createIndexes($index->getKey(), $index->getOptions()); + } + } } } diff --git a/pkg/bridge/composer.json b/pkg/bridge/composer.json index 06d5468..92f06db 100644 --- a/pkg/bridge/composer.json +++ b/pkg/bridge/composer.json @@ -9,6 +9,7 @@ "php": "^7.1.3", "symfony/framework-bundle": "^3|^4", "enqueue/enqueue": "^0.9", + "formapro/yadm": "^0.5.5", "queue-interop/queue-interop": "^0.7|^0.8", "php-quartz/quartz": "^0.2" }, diff --git a/pkg/bundle/Tests/Command/ManagementCommandTest.php b/pkg/bundle/Tests/Command/ManagementCommandTest.php index ac31759..0c4beb9 100644 --- a/pkg/bundle/Tests/Command/ManagementCommandTest.php +++ b/pkg/bundle/Tests/Command/ManagementCommandTest.php @@ -2,9 +2,9 @@ namespace Quartz\Bundle\Tests\Command; use PHPUnit\Framework\TestCase; +use Quartz\Bridge\Yadm\YadmStore; use Quartz\Bundle\Command\ManagementCommand; use Quartz\Scheduler\StdScheduler; -use Quartz\Scheduler\Store\YadmStore; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\HelperSet; use Symfony\Component\Console\Helper\QuestionHelper; diff --git a/pkg/quartz/ModelClassFactory.php b/pkg/quartz/ModelClassFactory.php index d24aff3..27f8db0 100644 --- a/pkg/quartz/ModelClassFactory.php +++ b/pkg/quartz/ModelClassFactory.php @@ -17,13 +17,9 @@ class ModelClassFactory { /** - * @param array $values - * - * @return string - * * @throws SchedulerException */ - public static function getClass($values) + public static function getClass(array $values): string { if (false == isset($values['instance'])) { throw new SchedulerException('Values has no "instance" field'); diff --git a/pkg/quartz/Scheduler/Store/YadmStoreResource.php b/pkg/quartz/Scheduler/Store/YadmStoreResource.php deleted file mode 100644 index e3eb333..0000000 --- a/pkg/quartz/Scheduler/Store/YadmStoreResource.php +++ /dev/null @@ -1,253 +0,0 @@ -options = array_replace([ - 'uri' => 'mongodb://localhost:27017', - 'uriOptions' => [], - 'driverOptions' => [], - 'sessionId' => 'quartz', - 'dbName' => 'quartz', - 'managementLockCol' => 'managementLock', - 'calendarCol' => 'calendar', - 'triggerCol' => 'trigger', - 'firedTriggerCol' => 'firedTrigger', - 'jobCol' => 'job', - 'pausedTriggerCol' => 'pausedTrigger', - - ], $options); - } - - public function getClient(): Client - { - return $this->getClientProvider()->getClient(); - } - - public function getClientProvider(): ClientProvider - { - if (false == $this->clientProvider) { - $this->clientProvider = new ClientProvider($this->options['uri'], $this->options['uriOptions'], $this->options['driverOptions']); - } - - return $this->clientProvider; - } - - public function getCollection(string $name): Collection - { - $factory = new CollectionFactory($this->getClientProvider(), $this->options['uri']); - - return $factory->create($name, $this->options['dbName']); - } - - /** - * @return PessimisticLock - */ - public function getManagementLock() - { - if (false == $this->managementLock) { - $this->managementLock = new PessimisticLock($this->getCollection($this->options['managementLockCol']), $this->options['sessionId']); - } - - return $this->managementLock; - } - - /** - * @return Storage - */ - public function getCalendarStorage() - { - if (false == $this->calendarStorage) { - $collection = $this->getCollection($this->options['calendarCol']); - $hydrator = new Hydrator(function($values) { - return ModelClassFactory::getClass($values); - }); - - $this->calendarStorage = new Storage($collection, $hydrator); - } - - return $this->calendarStorage; - } - - /** - * @return Storage - */ - public function getTriggerStorage() - { - if (false == $this->triggerStorage) { - $collection = $this->getCollection($this->options['triggerCol']); - $hydrator = new Hydrator(function($values) { - return ModelClassFactory::getClass($values); - }); - - $this->triggerStorage = new Storage($collection, $hydrator); - } - - return $this->triggerStorage; - } - - /** - * @return Storage - */ - public function getFiredTriggerStorage() - { - if (false == $this->firedTriggerStorage) { - $collection = $this->getCollection($this->options['firedTriggerCol']); - $hydrator = new Hydrator(function($values) { - return ModelClassFactory::getClass($values); - }); - - $this->firedTriggerStorage = new Storage($collection, $hydrator); - } - - return $this->firedTriggerStorage; - } - - /** - * @return Storage - */ - public function getJobStorage() - { - if (false == $this->jobStorage) { - $collection = $this->getCollection($this->options['jobCol']); - $hydrator = new Hydrator(JobDetail::class); - - $this->jobStorage = new Storage($collection, $hydrator); - } - - return $this->jobStorage; - } - - /** - * @return Collection - */ - public function getPausedTriggerCol() - { - if (false == $this->pausedTriggerCol) { - $this->pausedTriggerCol = $this->getCollection($this->options['pausedTriggerCol']); - } - - return $this->pausedTriggerCol; - } - - public function dropIndexes() - { - try { - $this->getTriggerStorage()->getCollection()->dropIndexes(); - $this->getJobStorage()->getCollection()->dropIndexes(); - $this->getCalendarStorage()->getCollection()->dropIndexes(); - $this->getPausedTriggerCol()->dropIndexes(); - $this->getFiredTriggerStorage()->getCollection()->dropIndexes(); - } catch (RuntimeException $e) { - } - } - - public function createIndexes() - { - $this->getManagementLock()->createIndexes(); - - $this->getTriggerStorage()->getCollection()->createIndexes([ - [ - 'key' => ['name' => 1, 'group' => 1], 'unique' => true, - ], - [ - 'key' => ['group' => 1], - ], - [ - 'key' => ['jobName' => 1, 'jobGroup' => 1], - ], - [ - 'key' => ['jobGroup' => 1], - ], - [ - 'key' => ['calendarName' => 1], - ], - [ - 'key' => ['state' => 1], - ], - [ - 'key' => ['nextFireTime.unix' => 1], - ], - ]); - - $this->getJobStorage()->getCollection()->createIndexes([ - [ - 'key' => ['name' => 1, 'group' => 1], 'unique' => true, - ], - [ - 'key' => ['group' => 1], - ], - ]); - - $this->getCalendarStorage()->getCollection()->createIndexes([ - [ - 'key' => ['name' => 1], 'unique' => true, - ], - ]); - - $this->getPausedTriggerCol()->createIndexes([ - [ - 'key' => ['groupName' => 1], - ], - ]); - - $this->getFiredTriggerStorage()->getCollection()->createIndexes([ - [ - 'key' => ['fireInstanceId' => 1], - ], - ]); - } -} diff --git a/pkg/quartz/composer.json b/pkg/quartz/composer.json index d126218..71c4671 100644 --- a/pkg/quartz/composer.json +++ b/pkg/quartz/composer.json @@ -8,13 +8,16 @@ "require": { "php": "^7.1.3", "ramsey/uuid": "^2|^3.5", - "formapro/yadm": "^0.5", "g4/cron": "^0.1", "symfony/event-dispatcher": "^3.4|^4" }, "require-dev": { + "formapro/yadm": "^0.5.5", "phpunit/phpunit": "^5.5" }, + "suggest": { + "php-quartz/bridge": "Provides a Yadm storage, Enqueue integration and other extension." + }, "autoload": { "psr-4": { "Quartz\\": "" }, "exclude-from-classmap": [ diff --git a/pkg/quartz/examples/calendar-interval-trigger.php b/pkg/quartz/examples/calendar-interval-trigger.php index e060576..ce15a61 100644 --- a/pkg/quartz/examples/calendar-interval-trigger.php +++ b/pkg/quartz/examples/calendar-interval-trigger.php @@ -10,8 +10,8 @@ use Quartz\Scheduler\StdJobRunShellFactory; use Quartz\Core\TriggerBuilder; use Quartz\Scheduler\StdScheduler; -use Quartz\Scheduler\Store\YadmStore; -use Quartz\Scheduler\Store\YadmStoreResource; +use Quartz\Bridge\Yadm\YadmStore; +use Quartz\Bridge\Yadm\SimpleStoreResource; use Symfony\Component\EventDispatcher\EventDispatcher; require_once '../vendor/autoload.php'; @@ -39,7 +39,7 @@ public function execute(JobExecutionContext $context) ->withSchedule(CalendarIntervalScheduleBuilder::calendarIntervalSchedule()->withIntervalInSeconds(10)) ->build(); -$store = new YadmStore(new YadmStoreResource($config)); +$store = new YadmStore(new SimpleStoreResource($config)); $store->clearAllSchedulingData(); $scheduler = new StdScheduler($store, new StdJobRunShellFactory(new StdJobRunShell()), new SimpleJobFactory(), new EventDispatcher()); diff --git a/pkg/quartz/examples/cron-trigger.php b/pkg/quartz/examples/cron-trigger.php index 52d7ecd..283ee98 100644 --- a/pkg/quartz/examples/cron-trigger.php +++ b/pkg/quartz/examples/cron-trigger.php @@ -10,8 +10,8 @@ use Quartz\Scheduler\StdJobRunShellFactory; use Quartz\Core\TriggerBuilder; use Quartz\Scheduler\StdScheduler; -use Quartz\Scheduler\Store\YadmStore; -use Quartz\Scheduler\Store\YadmStoreResource; +use Quartz\Bridge\Yadm\YadmStore; +use Quartz\Bridge\Yadm\SimpleStoreResource; use Symfony\Component\EventDispatcher\EventDispatcher; require_once '../vendor/autoload.php'; @@ -39,7 +39,7 @@ public function execute(JobExecutionContext $context) ->withSchedule(CronScheduleBuilder::cronSchedule('*/5 * * * * *')) ->build(); -$store = new YadmStore(new YadmStoreResource($config)); +$store = new YadmStore(new SimpleStoreResource($config)); $store->clearAllSchedulingData(); $scheduler = new StdScheduler($store, new StdJobRunShellFactory(new StdJobRunShell()), new SimpleJobFactory(), new EventDispatcher()); diff --git a/pkg/quartz/examples/daily-interval-trigger.php b/pkg/quartz/examples/daily-interval-trigger.php index fc03698..80991ce 100644 --- a/pkg/quartz/examples/daily-interval-trigger.php +++ b/pkg/quartz/examples/daily-interval-trigger.php @@ -10,8 +10,8 @@ use Quartz\Scheduler\StdJobRunShellFactory; use Quartz\Core\TriggerBuilder; use Quartz\Scheduler\StdScheduler; -use Quartz\Scheduler\Store\YadmStore; -use Quartz\Scheduler\Store\YadmStoreResource; +use Quartz\Bridge\Yadm\YadmStore; +use Quartz\Bridge\Yadm\SimpleStoreResource; use Symfony\Component\EventDispatcher\EventDispatcher; $dir = realpath(dirname($_SERVER['PHP_SELF'])); @@ -40,7 +40,7 @@ public function execute(JobExecutionContext $context) ->withSchedule(DailyTimeIntervalScheduleBuilder::dailyTimeIntervalSchedule()->withIntervalInSeconds(10)) ->build(); -$store = new YadmStore(new YadmStoreResource($config)); +$store = new YadmStore(new SimpleStoreResource($config)); $store->clearAllSchedulingData(); $scheduler = new StdScheduler($store, new StdJobRunShellFactory(new StdJobRunShell()), new SimpleJobFactory(), new EventDispatcher()); diff --git a/pkg/quartz/examples/scheduler.php b/pkg/quartz/examples/scheduler.php index 68e5e18..509eb97 100644 --- a/pkg/quartz/examples/scheduler.php +++ b/pkg/quartz/examples/scheduler.php @@ -7,8 +7,8 @@ use Quartz\Scheduler\StdJobRunShell; use Quartz\Scheduler\StdJobRunShellFactory; use Quartz\Scheduler\StdScheduler; -use Quartz\Scheduler\Store\YadmStore; -use Quartz\Scheduler\Store\YadmStoreResource; +use Quartz\Bridge\Yadm\YadmStore; +use Quartz\Bridge\Yadm\SimpleStoreResource; use Symfony\Component\EventDispatcher\EventDispatcher; require_once '../vendor/autoload.php'; @@ -20,7 +20,7 @@ 'dbName' => getenv('MONGODB_DB') ]; -$store = new YadmStore(new YadmStoreResource($config)); +$store = new YadmStore(new SimpleStoreResource($config)); $store->clearAllSchedulingData(); class MyJob implements Job diff --git a/pkg/quartz/examples/simple-trigger.php b/pkg/quartz/examples/simple-trigger.php index 8ed1e8e..a0f9ac2 100644 --- a/pkg/quartz/examples/simple-trigger.php +++ b/pkg/quartz/examples/simple-trigger.php @@ -10,8 +10,8 @@ use Quartz\Scheduler\StdJobRunShellFactory; use Quartz\Core\TriggerBuilder; use Quartz\Scheduler\StdScheduler; -use Quartz\Scheduler\Store\YadmStore; -use Quartz\Scheduler\Store\YadmStoreResource; +use Quartz\Bridge\Yadm\YadmStore; +use Quartz\Bridge\Yadm\SimpleStoreResource; use Symfony\Component\EventDispatcher\EventDispatcher; require_once '../vendor/autoload.php'; @@ -39,7 +39,7 @@ public function execute(JobExecutionContext $context) ->withSchedule(SimpleScheduleBuilder::repeatSecondlyForever(5)) ->build(); -$store = new YadmStore(new YadmStoreResource($config)); +$store = new YadmStore(new SimpleStoreResource($config)); $store->clearAllSchedulingData(); $scheduler = new StdScheduler($store, new StdJobRunShellFactory(new StdJobRunShell()), new SimpleJobFactory(), new EventDispatcher());