Subversion-Projekte lars-tiefland.laravel_shop

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
 
3
namespace Illuminate\Queue;
4
 
5
use Aws\Sqs\SqsClient;
6
use Illuminate\Contracts\Queue\ClearableQueue;
7
use Illuminate\Contracts\Queue\Queue as QueueContract;
8
use Illuminate\Queue\Jobs\SqsJob;
9
use Illuminate\Support\Str;
10
 
11
class SqsQueue extends Queue implements QueueContract, ClearableQueue
12
{
13
    /**
14
     * The Amazon SQS instance.
15
     *
16
     * @var \Aws\Sqs\SqsClient
17
     */
18
    protected $sqs;
19
 
20
    /**
21
     * The name of the default queue.
22
     *
23
     * @var string
24
     */
25
    protected $default;
26
 
27
    /**
28
     * The queue URL prefix.
29
     *
30
     * @var string
31
     */
32
    protected $prefix;
33
 
34
    /**
35
     * The queue name suffix.
36
     *
37
     * @var string
38
     */
39
    private $suffix;
40
 
41
    /**
42
     * Create a new Amazon SQS queue instance.
43
     *
44
     * @param  \Aws\Sqs\SqsClient  $sqs
45
     * @param  string  $default
46
     * @param  string  $prefix
47
     * @param  string  $suffix
48
     * @param  bool  $dispatchAfterCommit
49
     * @return void
50
     */
51
    public function __construct(SqsClient $sqs,
52
                                $default,
53
                                $prefix = '',
54
                                $suffix = '',
55
                                $dispatchAfterCommit = false)
56
    {
57
        $this->sqs = $sqs;
58
        $this->prefix = $prefix;
59
        $this->default = $default;
60
        $this->suffix = $suffix;
61
        $this->dispatchAfterCommit = $dispatchAfterCommit;
62
    }
63
 
64
    /**
65
     * Get the size of the queue.
66
     *
67
     * @param  string|null  $queue
68
     * @return int
69
     */
70
    public function size($queue = null)
71
    {
72
        $response = $this->sqs->getQueueAttributes([
73
            'QueueUrl' => $this->getQueue($queue),
74
            'AttributeNames' => ['ApproximateNumberOfMessages'],
75
        ]);
76
 
77
        $attributes = $response->get('Attributes');
78
 
79
        return (int) $attributes['ApproximateNumberOfMessages'];
80
    }
81
 
82
    /**
83
     * Push a new job onto the queue.
84
     *
85
     * @param  string  $job
86
     * @param  mixed  $data
87
     * @param  string|null  $queue
88
     * @return mixed
89
     */
90
    public function push($job, $data = '', $queue = null)
91
    {
92
        return $this->enqueueUsing(
93
            $job,
94
            $this->createPayload($job, $queue ?: $this->default, $data),
95
            $queue,
96
            null,
97
            function ($payload, $queue) {
98
                return $this->pushRaw($payload, $queue);
99
            }
100
        );
101
    }
102
 
103
    /**
104
     * Push a raw payload onto the queue.
105
     *
106
     * @param  string  $payload
107
     * @param  string|null  $queue
108
     * @param  array  $options
109
     * @return mixed
110
     */
111
    public function pushRaw($payload, $queue = null, array $options = [])
112
    {
113
        return $this->sqs->sendMessage([
114
            'QueueUrl' => $this->getQueue($queue), 'MessageBody' => $payload,
115
        ])->get('MessageId');
116
    }
117
 
118
    /**
119
     * Push a new job onto the queue after (n) seconds.
120
     *
121
     * @param  \DateTimeInterface|\DateInterval|int  $delay
122
     * @param  string  $job
123
     * @param  mixed  $data
124
     * @param  string|null  $queue
125
     * @return mixed
126
     */
127
    public function later($delay, $job, $data = '', $queue = null)
128
    {
129
        return $this->enqueueUsing(
130
            $job,
131
            $this->createPayload($job, $queue ?: $this->default, $data),
132
            $queue,
133
            $delay,
134
            function ($payload, $queue, $delay) {
135
                return $this->sqs->sendMessage([
136
                    'QueueUrl' => $this->getQueue($queue),
137
                    'MessageBody' => $payload,
138
                    'DelaySeconds' => $this->secondsUntil($delay),
139
                ])->get('MessageId');
140
            }
141
        );
142
    }
143
 
144
    /**
145
     * Push an array of jobs onto the queue.
146
     *
147
     * @param  array  $jobs
148
     * @param  mixed  $data
149
     * @param  string|null  $queue
150
     * @return void
151
     */
152
    public function bulk($jobs, $data = '', $queue = null)
153
    {
154
        foreach ((array) $jobs as $job) {
155
            if (isset($job->delay)) {
156
                $this->later($job->delay, $job, $data, $queue);
157
            } else {
158
                $this->push($job, $data, $queue);
159
            }
160
        }
161
    }
162
 
163
    /**
164
     * Pop the next job off of the queue.
165
     *
166
     * @param  string|null  $queue
167
     * @return \Illuminate\Contracts\Queue\Job|null
168
     */
169
    public function pop($queue = null)
170
    {
171
        $response = $this->sqs->receiveMessage([
172
            'QueueUrl' => $queue = $this->getQueue($queue),
173
            'AttributeNames' => ['ApproximateReceiveCount'],
174
        ]);
175
 
176
        if (! is_null($response['Messages']) && count($response['Messages']) > 0) {
177
            return new SqsJob(
178
                $this->container, $this->sqs, $response['Messages'][0],
179
                $this->connectionName, $queue
180
            );
181
        }
182
    }
183
 
184
    /**
185
     * Delete all of the jobs from the queue.
186
     *
187
     * @param  string  $queue
188
     * @return int
189
     */
190
    public function clear($queue)
191
    {
192
        return tap($this->size($queue), function () use ($queue) {
193
            $this->sqs->purgeQueue([
194
                'QueueUrl' => $this->getQueue($queue),
195
            ]);
196
        });
197
    }
198
 
199
    /**
200
     * Get the queue or return the default.
201
     *
202
     * @param  string|null  $queue
203
     * @return string
204
     */
205
    public function getQueue($queue)
206
    {
207
        $queue = $queue ?: $this->default;
208
 
209
        return filter_var($queue, FILTER_VALIDATE_URL) === false
210
            ? $this->suffixQueue($queue, $this->suffix)
211
            : $queue;
212
    }
213
 
214
    /**
215
     * Add the given suffix to the given queue name.
216
     *
217
     * @param  string  $queue
218
     * @param  string  $suffix
219
     * @return string
220
     */
221
    protected function suffixQueue($queue, $suffix = '')
222
    {
223
        if (str_ends_with($queue, '.fifo')) {
224
            $queue = Str::beforeLast($queue, '.fifo');
225
 
226
            return rtrim($this->prefix, '/').'/'.Str::finish($queue, $suffix).'.fifo';
227
        }
228
 
229
        return rtrim($this->prefix, '/').'/'.Str::finish($queue, $this->suffix);
230
    }
231
 
232
    /**
233
     * Get the underlying SQS instance.
234
     *
235
     * @return \Aws\Sqs\SqsClient
236
     */
237
    public function getSqs()
238
    {
239
        return $this->sqs;
240
    }
241
}