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\DynamoDb\DynamoDbClient;
6
use Illuminate\Contracts\Debug\ExceptionHandler;
7
use Illuminate\Contracts\Support\DeferrableProvider;
8
use Illuminate\Queue\Connectors\BeanstalkdConnector;
9
use Illuminate\Queue\Connectors\DatabaseConnector;
10
use Illuminate\Queue\Connectors\NullConnector;
11
use Illuminate\Queue\Connectors\RedisConnector;
12
use Illuminate\Queue\Connectors\SqsConnector;
13
use Illuminate\Queue\Connectors\SyncConnector;
14
use Illuminate\Queue\Failed\DatabaseFailedJobProvider;
15
use Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider;
16
use Illuminate\Queue\Failed\DynamoDbFailedJobProvider;
17
use Illuminate\Queue\Failed\NullFailedJobProvider;
18
use Illuminate\Support\Arr;
19
use Illuminate\Support\Facades\Facade;
20
use Illuminate\Support\ServiceProvider;
21
use Laravel\SerializableClosure\SerializableClosure;
22
 
23
class QueueServiceProvider extends ServiceProvider implements DeferrableProvider
24
{
25
    use SerializesAndRestoresModelIdentifiers;
26
 
27
    /**
28
     * Register the service provider.
29
     *
30
     * @return void
31
     */
32
    public function register()
33
    {
34
        $this->configureSerializableClosureUses();
35
 
36
        $this->registerManager();
37
        $this->registerConnection();
38
        $this->registerWorker();
39
        $this->registerListener();
40
        $this->registerFailedJobServices();
41
    }
42
 
43
    /**
44
     * Configure serializable closures uses.
45
     *
46
     * @return void
47
     */
48
    protected function configureSerializableClosureUses()
49
    {
50
        SerializableClosure::transformUseVariablesUsing(function ($data) {
51
            foreach ($data as $key => $value) {
52
                $data[$key] = $this->getSerializedPropertyValue($value);
53
            }
54
 
55
            return $data;
56
        });
57
 
58
        SerializableClosure::resolveUseVariablesUsing(function ($data) {
59
            foreach ($data as $key => $value) {
60
                $data[$key] = $this->getRestoredPropertyValue($value);
61
            }
62
 
63
            return $data;
64
        });
65
    }
66
 
67
    /**
68
     * Register the queue manager.
69
     *
70
     * @return void
71
     */
72
    protected function registerManager()
73
    {
74
        $this->app->singleton('queue', function ($app) {
75
            // Once we have an instance of the queue manager, we will register the various
76
            // resolvers for the queue connectors. These connectors are responsible for
77
            // creating the classes that accept queue configs and instantiate queues.
78
            return tap(new QueueManager($app), function ($manager) {
79
                $this->registerConnectors($manager);
80
            });
81
        });
82
    }
83
 
84
    /**
85
     * Register the default queue connection binding.
86
     *
87
     * @return void
88
     */
89
    protected function registerConnection()
90
    {
91
        $this->app->singleton('queue.connection', function ($app) {
92
            return $app['queue']->connection();
93
        });
94
    }
95
 
96
    /**
97
     * Register the connectors on the queue manager.
98
     *
99
     * @param  \Illuminate\Queue\QueueManager  $manager
100
     * @return void
101
     */
102
    public function registerConnectors($manager)
103
    {
104
        foreach (['Null', 'Sync', 'Database', 'Redis', 'Beanstalkd', 'Sqs'] as $connector) {
105
            $this->{"register{$connector}Connector"}($manager);
106
        }
107
    }
108
 
109
    /**
110
     * Register the Null queue connector.
111
     *
112
     * @param  \Illuminate\Queue\QueueManager  $manager
113
     * @return void
114
     */
115
    protected function registerNullConnector($manager)
116
    {
117
        $manager->addConnector('null', function () {
118
            return new NullConnector;
119
        });
120
    }
121
 
122
    /**
123
     * Register the Sync queue connector.
124
     *
125
     * @param  \Illuminate\Queue\QueueManager  $manager
126
     * @return void
127
     */
128
    protected function registerSyncConnector($manager)
129
    {
130
        $manager->addConnector('sync', function () {
131
            return new SyncConnector;
132
        });
133
    }
134
 
135
    /**
136
     * Register the database queue connector.
137
     *
138
     * @param  \Illuminate\Queue\QueueManager  $manager
139
     * @return void
140
     */
141
    protected function registerDatabaseConnector($manager)
142
    {
143
        $manager->addConnector('database', function () {
144
            return new DatabaseConnector($this->app['db']);
145
        });
146
    }
147
 
148
    /**
149
     * Register the Redis queue connector.
150
     *
151
     * @param  \Illuminate\Queue\QueueManager  $manager
152
     * @return void
153
     */
154
    protected function registerRedisConnector($manager)
155
    {
156
        $manager->addConnector('redis', function () {
157
            return new RedisConnector($this->app['redis']);
158
        });
159
    }
160
 
161
    /**
162
     * Register the Beanstalkd queue connector.
163
     *
164
     * @param  \Illuminate\Queue\QueueManager  $manager
165
     * @return void
166
     */
167
    protected function registerBeanstalkdConnector($manager)
168
    {
169
        $manager->addConnector('beanstalkd', function () {
170
            return new BeanstalkdConnector;
171
        });
172
    }
173
 
174
    /**
175
     * Register the Amazon SQS queue connector.
176
     *
177
     * @param  \Illuminate\Queue\QueueManager  $manager
178
     * @return void
179
     */
180
    protected function registerSqsConnector($manager)
181
    {
182
        $manager->addConnector('sqs', function () {
183
            return new SqsConnector;
184
        });
185
    }
186
 
187
    /**
188
     * Register the queue worker.
189
     *
190
     * @return void
191
     */
192
    protected function registerWorker()
193
    {
194
        $this->app->singleton('queue.worker', function ($app) {
195
            $isDownForMaintenance = function () {
196
                return $this->app->isDownForMaintenance();
197
            };
198
 
199
            $resetScope = function () use ($app) {
200
                if (method_exists($app['log']->driver(), 'withoutContext')) {
201
                    $app['log']->withoutContext();
202
                }
203
 
204
                if (method_exists($app['db'], 'getConnections')) {
205
                    foreach ($app['db']->getConnections() as $connection) {
206
                        $connection->resetTotalQueryDuration();
207
                        $connection->allowQueryDurationHandlersToRunAgain();
208
                    }
209
                }
210
 
211
                $app->forgetScopedInstances();
212
 
213
                return Facade::clearResolvedInstances();
214
            };
215
 
216
            return new Worker(
217
                $app['queue'],
218
                $app['events'],
219
                $app[ExceptionHandler::class],
220
                $isDownForMaintenance,
221
                $resetScope
222
            );
223
        });
224
    }
225
 
226
    /**
227
     * Register the queue listener.
228
     *
229
     * @return void
230
     */
231
    protected function registerListener()
232
    {
233
        $this->app->singleton('queue.listener', function ($app) {
234
            return new Listener($app->basePath());
235
        });
236
    }
237
 
238
    /**
239
     * Register the failed job services.
240
     *
241
     * @return void
242
     */
243
    protected function registerFailedJobServices()
244
    {
245
        $this->app->singleton('queue.failer', function ($app) {
246
            $config = $app['config']['queue.failed'];
247
 
248
            if (array_key_exists('driver', $config) &&
249
                (is_null($config['driver']) || $config['driver'] === 'null')) {
250
                return new NullFailedJobProvider;
251
            }
252
 
253
            if (isset($config['driver']) && $config['driver'] === 'dynamodb') {
254
                return $this->dynamoFailedJobProvider($config);
255
            } elseif (isset($config['driver']) && $config['driver'] === 'database-uuids') {
256
                return $this->databaseUuidFailedJobProvider($config);
257
            } elseif (isset($config['table'])) {
258
                return $this->databaseFailedJobProvider($config);
259
            } else {
260
                return new NullFailedJobProvider;
261
            }
262
        });
263
    }
264
 
265
    /**
266
     * Create a new database failed job provider.
267
     *
268
     * @param  array  $config
269
     * @return \Illuminate\Queue\Failed\DatabaseFailedJobProvider
270
     */
271
    protected function databaseFailedJobProvider($config)
272
    {
273
        return new DatabaseFailedJobProvider(
274
            $this->app['db'], $config['database'], $config['table']
275
        );
276
    }
277
 
278
    /**
279
     * Create a new database failed job provider that uses UUIDs as IDs.
280
     *
281
     * @param  array  $config
282
     * @return \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider
283
     */
284
    protected function databaseUuidFailedJobProvider($config)
285
    {
286
        return new DatabaseUuidFailedJobProvider(
287
            $this->app['db'], $config['database'], $config['table']
288
        );
289
    }
290
 
291
    /**
292
     * Create a new DynamoDb failed job provider.
293
     *
294
     * @param  array  $config
295
     * @return \Illuminate\Queue\Failed\DynamoDbFailedJobProvider
296
     */
297
    protected function dynamoFailedJobProvider($config)
298
    {
299
        $dynamoConfig = [
300
            'region' => $config['region'],
301
            'version' => 'latest',
302
            'endpoint' => $config['endpoint'] ?? null,
303
        ];
304
 
305
        if (! empty($config['key']) && ! empty($config['secret'])) {
306
            $dynamoConfig['credentials'] = Arr::only(
307
                $config, ['key', 'secret', 'token']
308
            );
309
        }
310
 
311
        return new DynamoDbFailedJobProvider(
312
            new DynamoDbClient($dynamoConfig),
313
            $this->app['config']['app.name'],
314
            $config['table']
315
        );
316
    }
317
 
318
    /**
319
     * Get the services provided by the provider.
320
     *
321
     * @return array
322
     */
323
    public function provides()
324
    {
325
        return [
326
            'queue',
327
            'queue.connection',
328
            'queue.failer',
329
            'queue.listener',
330
            'queue.worker',
331
        ];
332
    }
333
}