Skip to content

Commit 189e323

Browse files
committed
* Add possibility to save exceptions in file
1 parent 0938f7f commit 189e323

7 files changed

Lines changed: 67 additions & 6 deletions

File tree

src/DependencyInjection/CodeRhapsodieDataflowExtension.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
class CodeRhapsodieDataflowExtension extends Extension
1717
{
18-
public function load(array $configs, ContainerBuilder $container)
18+
public function load(array $configs, ContainerBuilder $container): void
1919
{
2020
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
2121
$loader->load('services.yaml');
@@ -29,6 +29,11 @@ public function load(array $configs, ContainerBuilder $container)
2929

3030
$container->setParameter('coderhapsodie.dataflow.dbal_default_connection', $config['dbal_default_connection']);
3131
$container->setParameter('coderhapsodie.dataflow.default_logger', $config['default_logger']);
32+
$container->setParameter('coderhapsodie.dataflow.exception_mode.type', $config['exception_mode']['type']);
33+
34+
if ($config['exception_mode']['type'] === 'file') {
35+
$container->setParameter('coderhapsodie.dataflow.flysystem_service', $config['exception_mode']['flysystem_service']);
36+
}
3237

3338
if ($config['messenger_mode']['enabled']) {
3439
$container->setParameter('coderhapsodie.dataflow.bus', $config['messenger_mode']['bus']);

src/DependencyInjection/Compiler/BusCompilerPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
class BusCompilerPass implements CompilerPassInterface
1414
{
15-
public function process(ContainerBuilder $container)
15+
public function process(ContainerBuilder $container): void
1616
{
1717
if (!$container->hasParameter('coderhapsodie.dataflow.bus')) {
1818
return;

src/DependencyInjection/Compiler/DataflowTypeCompilerPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717
class DataflowTypeCompilerPass implements CompilerPassInterface
1818
{
19-
public function process(ContainerBuilder $container)
19+
public function process(ContainerBuilder $container): void
2020
{
2121
if (!$container->has(DataflowTypeRegistry::class)) {
2222
return;

src/DependencyInjection/Compiler/DefaultLoggerCompilerPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
class DefaultLoggerCompilerPass implements CompilerPassInterface
1414
{
15-
public function process(ContainerBuilder $container)
15+
public function process(ContainerBuilder $container): void
1616
{
1717
$defaultLogger = $container->getParameter('coderhapsodie.dataflow.default_logger');
1818
if (!$container->has($defaultLogger)) {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodeRhapsodie\DataflowBundle\DependencyInjection\Compiler;
6+
7+
use CodeRhapsodie\DataflowBundle\Processor\JobProcessor;
8+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
9+
use Symfony\Component\DependencyInjection\ContainerBuilder;
10+
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
11+
use Symfony\Component\DependencyInjection\Reference;
12+
13+
class ExceptionCompilerPass implements CompilerPassInterface
14+
{
15+
public function process(ContainerBuilder $container): void
16+
{
17+
if (!$container->hasParameter('coderhapsodie.dataflow.flysystem_service')) {
18+
return;
19+
}
20+
21+
$flysystem = $container->getParameter('coderhapsodie.dataflow.flysystem_service');
22+
if (!$container->has($flysystem)) {
23+
throw new InvalidArgumentException(\sprintf('Service "%s" not found', $flysystem));
24+
}
25+
26+
$definition = $container->findDefinition(JobProcessor::class);
27+
$definition->setArgument('$filesystem', new Reference($flysystem));
28+
}
29+
}

src/DependencyInjection/Configuration.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,20 @@ public function getConfigTreeBuilder(): TreeBuilder
3838
->thenInvalid('You need "symfony/messenger" in order to use Dataflow messenger mode.')
3939
->end()
4040
->end()
41+
->arrayNode('exceptions_mode')
42+
->addDefaultsIfNotSet()
43+
->children()
44+
->scalarNode('type')
45+
->defaultValue('database')
46+
->end()
47+
->scalarNode('flysystem_service')
48+
->end()
49+
->validate()
50+
->ifTrue(static fn($v): bool => 'file' === $v['type'] && !interface_exists('\League\Flysystem\Filesystem'))
51+
->thenInvalid('You need "league/flysystem" to use Dataflow file exception mode.')
52+
->end()
53+
->end()
54+
->end()
4155
->end()
4256
;
4357

src/Processor/JobProcessor.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use CodeRhapsodie\DataflowBundle\Logger\DelegatingLogger;
1414
use CodeRhapsodie\DataflowBundle\Registry\DataflowTypeRegistryInterface;
1515
use CodeRhapsodie\DataflowBundle\Repository\JobRepository;
16+
use League\Flysystem\Filesystem;
1617
use Monolog\Logger;
1718
use Psr\Log\LoggerAwareInterface;
1819
use Psr\Log\LoggerAwareTrait;
@@ -22,7 +23,12 @@ class JobProcessor implements JobProcessorInterface, LoggerAwareInterface
2223
{
2324
use LoggerAwareTrait;
2425

25-
public function __construct(private JobRepository $repository, private DataflowTypeRegistryInterface $registry, private EventDispatcherInterface $dispatcher)
26+
public function __construct(
27+
private JobRepository $repository,
28+
private DataflowTypeRegistryInterface $registry,
29+
private EventDispatcherInterface $dispatcher,
30+
private ?Filesystem $filesystem = null
31+
)
2632
{
2733
}
2834

@@ -69,12 +75,19 @@ private function beforeProcessing(Job $job): void
6975

7076
private function afterProcessing(Job $job, Result $result, BufferHandler $bufferLogger): void
7177
{
78+
$exceptions = $bufferLogger->clearBuffer();
79+
if ($this->filesystem) {
80+
$this->filesystem->write(sprintf('dataflow-job-%s.log',$job->getId()), json_encode($exceptions));
81+
$exceptions = [];
82+
}
83+
7284
$job
7385
->setEndTime($result->getEndTime())
7486
->setStatus(Job::STATUS_COMPLETED)
7587
->setCount($result->getSuccessCount())
76-
->setExceptions($bufferLogger->clearBuffer())
88+
->setExceptions($exceptions)
7789
;
90+
7891
$this->repository->save($job);
7992

8093
$this->dispatcher->dispatch(new ProcessingEvent($job), Events::AFTER_PROCESSING);

0 commit comments

Comments
 (0)