Skip to content
This repository was archived by the owner on Nov 9, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions pkg/bridge/DI/QuartzConfiguration.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()
;
Expand Down
31 changes: 25 additions & 6 deletions pkg/bridge/DI/QuartzExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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']])
;

Expand Down
6 changes: 3 additions & 3 deletions pkg/bridge/Scheduler/SchedulerFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
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;
use Quartz\Scheduler\JobRunShellFactory;
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
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion pkg/bridge/Tests/Scheduler/JobRunShellProcessorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?php
namespace Quartz\Tests\Functional\Scheduler\Store;
namespace Quartz\Bridge\Tests\Yadm;

use function Formapro\Values\register_cast_hooks;
use Quartz\Calendar\HolidayCalendar;
Expand All @@ -11,8 +11,8 @@
use Quartz\JobDetail\JobDetail;
use Quartz\Core\ObjectAlreadyExistsException;
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 Quartz\Triggers\SimpleTrigger;

class YadmStoreTest extends \PHPUnit_Framework_TestCase
Expand All @@ -23,7 +23,7 @@ class YadmStoreTest extends \PHPUnit_Framework_TestCase
private $store;

/**
* @var YadmStoreResource
* @var SimpleStoreResource
*/
private $res;

Expand All @@ -41,7 +41,7 @@ protected function setUp()
'dbName' => 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();
Expand Down
93 changes: 93 additions & 0 deletions pkg/bridge/Yadm/BundleStoreResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?php
namespace Quartz\Bridge\Yadm;

use Formapro\Yadm\ClientProvider;
use Formapro\Yadm\CollectionFactory;
use Formapro\Yadm\PessimisticLock;
use Formapro\Yadm\Registry;
use MongoDB\Client;

class BundleStoreResource implements StoreResource
{
private $options;

private $clientProvider;

private $collectionFactory;

private $managementLock;

private $registry;

public function __construct(
ClientProvider $clientProvider,
CollectionFactory $collectionFactory,
Registry $registry,
array $options = []
) {
$this->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']);
}
}
28 changes: 28 additions & 0 deletions pkg/bridge/Yadm/CalendarStorage.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php declare(strict_types=1);

namespace Quartz\Bridge\Yadm;

use Formapro\Yadm\Index;
use Formapro\Yadm\Storage;
use Formapro\Yadm\StorageMetaInterface;
use Quartz\Core\Calendar;

/**
* @method Calendar|null create()
* @method Calendar|null findOne(array $filter = [], array $options = [])
* @method Calendar[]|\Traversable find(array $filter = [], array $options = [])
*/
class CalendarStorage extends Storage implements StorageMetaInterface
{
public function getIndexes(): array
{
return [
new Index(['name' => 1], ['unique' => true]),
];
}

public function getCreateCollectionOptions(): array
{
return [];
}
}
28 changes: 28 additions & 0 deletions pkg/bridge/Yadm/FiredTriggerStorage.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php declare(strict_types=1);

namespace Quartz\Bridge\Yadm;

use Formapro\Yadm\Index;
use Formapro\Yadm\Storage;
use Formapro\Yadm\StorageMetaInterface;
use Quartz\Core\Trigger;

/**
* @method Trigger|null create()
* @method Trigger|null findOne(array $filter = [], array $options = [])
* @method Trigger[]|\Traversable find(array $filter = [], array $options = [])
*/
class FiredTriggerStorage extends Storage implements StorageMetaInterface
{
public function getIndexes(): array
{
return [
new Index(['fireInstanceId' => 1]),
];
}

public function getCreateCollectionOptions(): array
{
return [];
}
}
29 changes: 29 additions & 0 deletions pkg/bridge/Yadm/JobStorage.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php declare(strict_types=1);

namespace Quartz\Bridge\Yadm;

use Formapro\Yadm\Index;
use Formapro\Yadm\Storage;
use Formapro\Yadm\StorageMetaInterface;
use Quartz\Core\Job;

/**
* @method Job|null create()
* @method Job|null findOne(array $filter = [], array $options = [])
* @method Job[]|\Traversable find(array $filter = [], array $options = [])
*/
class JobStorage extends Storage implements StorageMetaInterface
{
public function getIndexes(): array
{
return [
new Index(['name' => 1, 'group' => 1], ['unique' => true]),
new Index(['group' => 1]),
];
}

public function getCreateCollectionOptions(): array
{
return [];
}
}
21 changes: 21 additions & 0 deletions pkg/bridge/Yadm/ModelHydrator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php declare(strict_types=1);

namespace Quartz\Bridge\Yadm;

use function Formapro\Values\build_object;
use Formapro\Yadm\Hydrator;
use Quartz\ModelClassFactory;

class ModelHydrator extends Hydrator
{
public function __construct()
{
}

public function create(array $values = [])
{
$class = ModelClassFactory::getClass($values);

return $this->hydrate($values, build_object($class, $values));
}
}
Loading