Passed
Push — master ( 18af30...0e6a78 )
by Mathias
45:31 queued 28:39
created

JobResultStrategy::handleJobResult()   C

Complexity

Conditions 15
Paths 35

Size

Total Lines 59
Code Lines 35

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 240

Importance

Changes 0
Metric Value
eloc 35
dl 0
loc 59
ccs 0
cts 43
cp 0
rs 5.9166
c 0
b 0
f 0
cc 15
nc 35
nop 1
crap 240

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * YAWIK
4
 *
5
 * @filesource
6
 * @license MIT
7
 * @copyright  2013 - 2019 Cross Solution <http://cross-solution.de>
8
 */
9
  
10
/** */
11
namespace Core\Queue\Strategy;
12
13
use Core\Queue\Job\JobResult;
14
use Core\Queue\Job\ResultProviderInterface;
15
use Core\Queue\MongoQueue;
16
use Core\Queue\Utils;
17
use SlmQueue\Strategy\AbstractStrategy;
18
use SlmQueue\Worker\Event\AbstractWorkerEvent;
19
use SlmQueue\Worker\Event\ProcessJobEvent;
20
use Zend\EventManager\EventManagerInterface;
21
22
/**
23
 * ${CARET}
24
 * 
25
 * @author Mathias Gelhausen <[email protected]>
26
 * @todo write test 
27
 */
28
class JobResultStrategy extends AbstractStrategy
29
{
30
    public function attach(EventManagerInterface $events, $priority = 1)
31
    {
32
        $this->listeners[] = $events->attach(AbstractWorkerEvent::EVENT_PROCESS_JOB, [$this, 'handleJobResult'], -999);
33
    }
34
35
    public function handleJobResult(ProcessJobEvent $event)
36
    {
37
        $result = $event->getResult();
38
        $queue = $event->getQueue();
39
        $job   = $event->getJob();
40
        $logger = $event->getParam('logger');
41
42
        if (!$queue instanceOf MongoQueue) {
43
            return;
44
        }
45
46
        $result = $job instanceOf ResultProviderInterface ? $job->getResult() : new JobResult($result);
47
48
        if ($result->isSuccess()) {
49
            $queue->delete($job);
50
            if ($reason = $result->getReason()) {
51
                $logger && $logger->info($reason, $result->getExtra() ?? []);
52
            }
53
54
            return;
55
        }
56
57
        if ($result->isFailure()) {
58
            $reason = $result->getReason();
59
            $extra  = $result->getExtra();
60
61
            $queue->fail($job, ['message' => $reason, 'trace' => $extra]);
62
63
            $logger && $logger->err($reason, $extra ?? []);
64
65
            return;
66
        }
67
68
        if ($result->isRecoverable()) {
69
            $reason = $result->getReason();
70
            $extra  = $result->getExtra();
71
            $delay  = $result->getDelay();
72
            $date   = $result->getDate();
73
74
            $options = ['message' => $reason, 'trace' => $extra];
75
76
            $logger && $logger->warn($reason, $extra ?? []);
77
78
            if ($delay) {
79
                $logger && $logger->notice('Will retry in ' . $this->formatDelay($delay));
80
                $options['delay'] = $delay;
81
82
            } elseif ($date) {
83
                $logger && $logger->notice('Will retry on ' . $this->formatScheduled($date));
84
                $options['scheduled'] = $date;
85
            }
86
87
            $queue->retry($job, $options);
88
89
            return;
90
        }
91
92
        $logger && $logger->warn('Unsupported job result: ' . $result->getResult() . '; Job will be deleted.');
93
        $queue->delete($job);
94
95
    }
96
97
    private function formatDelay($delay)
98
    {
99
        $delay = Utils::createDateInterval($delay);
100
        $parts = [];
101
        if ($delay->y) {
102
            $parts[] = $delay->y . ' years';
103
        }
104
        if ($delay->m) {
105
            $parts[] = $delay->m . ' months';
106
        }
107
        if ($delay->d) {
108
            $parts[] = $delay->d . ' days';
109
        }
110
        if ($delay->h) {
111
            $parts[] = $delay->h . ' hours';
112
        }
113
        if ($delay->i) {
114
            $parts[] = $delay->i . ' minutes';
115
        }
116
        if ($delay->s) {
117
            $parts[] = $delay->s . ' seconds';
118
        }
119
120
        return join(', ', $parts);
121
    }
122
123
    private function formatScheduled($scheduled)
124
    {
125
        $date = Utils::createDateTime($scheduled);
126
        return $date->format('d.m.Y H:i:s');
127
    }
128
129
}
130