11
11
use Interop \Amqp \AmqpMessage ;
12
12
use Interop \Queue \PsrConsumer ;
13
13
use Interop \Queue \PsrContext ;
14
+ use Interop \Queue \PsrMessage ;
14
15
use Interop \Queue \PsrProcessor ;
15
16
use Interop \Queue \PsrQueue ;
17
+ use Psr \Log \LoggerInterface ;
16
18
use Psr \Log \NullLogger ;
17
19
18
20
class QueueConsumer
@@ -23,9 +25,9 @@ class QueueConsumer
23
25
private $ psrContext ;
24
26
25
27
/**
26
- * @var ExtensionInterface|ChainExtension|null
28
+ * @var ExtensionInterface|ChainExtension
27
29
*/
28
- private $ extension ;
30
+ private $ staticExtension ;
29
31
30
32
/**
31
33
* [
@@ -46,6 +48,16 @@ class QueueConsumer
46
48
*/
47
49
private $ receiveTimeout ;
48
50
51
+ /**
52
+ * @var ExtensionInterface|ChainExtension
53
+ */
54
+ private $ extension ;
55
+
56
+ /**
57
+ * @var LoggerInterface
58
+ */
59
+ private $ logger ;
60
+
49
61
/**
50
62
* @param PsrContext $psrContext
51
63
* @param ExtensionInterface|ChainExtension|null $extension
@@ -59,11 +71,12 @@ public function __construct(
59
71
$ receiveTimeout = 10
60
72
) {
61
73
$ this ->psrContext = $ psrContext ;
62
- $ this ->extension = $ extension ;
74
+ $ this ->staticExtension = $ extension ?: new ChainExtension ([]) ;
63
75
$ this ->idleTimeout = $ idleTimeout ;
64
76
$ this ->receiveTimeout = $ receiveTimeout ;
65
77
66
78
$ this ->boundProcessors = [];
79
+ $ this ->logger = new NullLogger ();
67
80
}
68
81
69
82
/**
@@ -157,19 +170,19 @@ public function consume(ExtensionInterface $runtimeExtension = null)
157
170
$ consumers [$ queue ->getQueueName ()] = $ this ->psrContext ->createConsumer ($ queue );
158
171
}
159
172
160
- $ extension = $ this ->extension ?: new ChainExtension ([]);
161
- if ( $ runtimeExtension) {
162
- $ extension = new ChainExtension ([ $ extension , $ runtimeExtension ]);
163
- }
173
+ $ this ->extension = $ runtimeExtension ?
174
+ new ChainExtension ([ $ this -> staticExtension , $ runtimeExtension]) :
175
+ $ this -> staticExtension
176
+ ;
164
177
165
178
$ context = new Context ($ this ->psrContext );
166
- $ extension ->onStart ($ context );
179
+ $ this -> extension ->onStart ($ context );
167
180
168
- $ logger = $ context ->getLogger () ?: new NullLogger ();
169
- $ logger ->info ('Start consuming ' );
181
+ $ this -> logger = $ context ->getLogger () ?: new NullLogger ();
182
+ $ this -> logger ->info ('Start consuming ' );
170
183
171
184
if ($ this ->psrContext instanceof AmqpContext) {
172
- $ callback = function (AmqpMessage $ message , AmqpConsumer $ consumer ) use ($ extension , $ logger , &$ context ) {
185
+ $ callback = function (AmqpMessage $ message , AmqpConsumer $ consumer ) use (&$ context ) {
173
186
$ currentProcessor = null ;
174
187
175
188
/** @var PsrQueue $queue */
@@ -184,13 +197,13 @@ public function consume(ExtensionInterface $runtimeExtension = null)
184
197
}
185
198
186
199
$ context = new Context ($ this ->psrContext );
187
- $ context ->setLogger ($ logger );
200
+ $ context ->setLogger ($ this -> logger );
188
201
$ context ->setPsrQueue ($ consumer ->getQueue ());
189
202
$ context ->setPsrConsumer ($ consumer );
190
203
$ context ->setPsrProcessor ($ currentProcessor );
191
204
$ context ->setPsrMessage ($ message );
192
205
193
- $ this ->doConsume ($ extension , $ context );
206
+ $ this ->doConsume ($ this -> extension , $ context );
194
207
195
208
return true ;
196
209
};
@@ -205,7 +218,7 @@ public function consume(ExtensionInterface $runtimeExtension = null)
205
218
while (true ) {
206
219
try {
207
220
if ($ this ->psrContext instanceof AmqpContext) {
208
- $ extension ->onBeforeReceive ($ context );
221
+ $ this -> extension ->onBeforeReceive ($ context );
209
222
210
223
if ($ context ->isExecutionInterrupted ()) {
211
224
throw new ConsumptionInterruptedException ();
@@ -214,23 +227,23 @@ public function consume(ExtensionInterface $runtimeExtension = null)
214
227
$ this ->psrContext ->consume ($ this ->receiveTimeout );
215
228
216
229
usleep ($ this ->idleTimeout * 1000 );
217
- $ extension ->onIdle ($ context );
230
+ $ this -> extension ->onIdle ($ context );
218
231
} else {
219
232
/** @var PsrQueue $queue */
220
233
foreach ($ this ->boundProcessors as list ($ queue , $ processor )) {
221
234
$ consumer = $ consumers [$ queue ->getQueueName ()];
222
235
223
236
$ context = new Context ($ this ->psrContext );
224
- $ context ->setLogger ($ logger );
237
+ $ context ->setLogger ($ this -> logger );
225
238
$ context ->setPsrQueue ($ queue );
226
239
$ context ->setPsrConsumer ($ consumer );
227
240
$ context ->setPsrProcessor ($ processor );
228
241
229
- $ this ->doConsume ($ extension , $ context );
242
+ $ this ->doConsume ($ this -> extension , $ context );
230
243
}
231
244
}
232
245
} catch (ConsumptionInterruptedException $ e ) {
233
- $ logger ->info (sprintf ('Consuming interrupted ' ));
246
+ $ this -> logger ->info (sprintf ('Consuming interrupted ' ));
234
247
235
248
if ($ this ->psrContext instanceof AmqpContext) {
236
249
foreach ($ consumers as $ consumer ) {
@@ -242,15 +255,15 @@ public function consume(ExtensionInterface $runtimeExtension = null)
242
255
243
256
$ context ->setExecutionInterrupted (true );
244
257
245
- $ extension ->onInterrupted ($ context );
258
+ $ this -> extension ->onInterrupted ($ context );
246
259
247
260
return ;
248
261
} catch (\Exception $ exception ) {
249
262
$ context ->setExecutionInterrupted (true );
250
263
$ context ->setException ($ exception );
251
264
252
265
try {
253
- $ this ->onInterruptionByException ($ extension , $ context );
266
+ $ this ->onInterruptionByException ($ this -> extension , $ context );
254
267
} catch (\Exception $ e ) {
255
268
// for some reason finally does not work here on php5.5
256
269
@@ -272,55 +285,26 @@ protected function doConsume(ExtensionInterface $extension, Context $context)
272
285
{
273
286
$ processor = $ context ->getPsrProcessor ();
274
287
$ consumer = $ context ->getPsrConsumer ();
275
- $ logger = $ context ->getLogger ();
288
+ $ this -> logger = $ context ->getLogger ();
276
289
277
290
if ($ context ->isExecutionInterrupted ()) {
278
291
throw new ConsumptionInterruptedException ();
279
292
}
280
293
281
294
$ message = $ context ->getPsrMessage ();
282
295
if (false == $ message ) {
283
- $ extension ->onBeforeReceive ($ context );
296
+ $ this -> extension ->onBeforeReceive ($ context );
284
297
285
298
if ($ message = $ consumer ->receive ($ this ->receiveTimeout )) {
286
299
$ context ->setPsrMessage ($ message );
287
300
}
288
301
}
289
302
290
303
if ($ message ) {
291
- $ logger ->info ('Message received from the queue: ' .$ context ->getPsrQueue ()->getQueueName ());
292
- $ logger ->debug ('Headers: {headers} ' , ['headers ' => new VarExport ($ message ->getHeaders ())]);
293
- $ logger ->debug ('Properties: {properties} ' , ['properties ' => new VarExport ($ message ->getProperties ())]);
294
- $ logger ->debug ('Payload: {payload} ' , ['payload ' => new VarExport ($ message ->getBody ())]);
295
-
296
- $ extension ->onPreReceived ($ context );
297
- if (!$ context ->getResult ()) {
298
- $ result = $ processor ->process ($ message , $ this ->psrContext );
299
- $ context ->setResult ($ result );
300
- }
301
-
302
- $ extension ->onResult ($ context );
303
-
304
- switch ($ context ->getResult ()) {
305
- case Result::ACK :
306
- $ consumer ->acknowledge ($ message );
307
- break ;
308
- case Result::REJECT :
309
- $ consumer ->reject ($ message , false );
310
- break ;
311
- case Result::REQUEUE :
312
- $ consumer ->reject ($ message , true );
313
- break ;
314
- default :
315
- throw new \LogicException (sprintf ('Status is not supported: %s ' , $ context ->getResult ()));
316
- }
317
-
318
- $ logger ->info (sprintf ('Message processed: %s ' , $ context ->getResult ()));
319
-
320
- $ extension ->onPostReceived ($ context );
304
+ $ this ->processMessage ($ consumer , $ processor , $ message , $ context );
321
305
} else {
322
306
usleep ($ this ->idleTimeout * 1000 );
323
- $ extension ->onIdle ($ context );
307
+ $ this -> extension ->onIdle ($ context );
324
308
}
325
309
326
310
if ($ context ->isExecutionInterrupted ()) {
@@ -336,16 +320,16 @@ protected function doConsume(ExtensionInterface $extension, Context $context)
336
320
*/
337
321
protected function onInterruptionByException (ExtensionInterface $ extension , Context $ context )
338
322
{
339
- $ logger = $ context ->getLogger ();
340
- $ logger ->error (sprintf ('Consuming interrupted by exception ' ));
323
+ $ this -> logger = $ context ->getLogger ();
324
+ $ this -> logger ->error (sprintf ('Consuming interrupted by exception ' ));
341
325
342
326
$ exception = $ context ->getException ();
343
327
344
328
try {
345
- $ extension ->onInterrupted ($ context );
329
+ $ this -> extension ->onInterrupted ($ context );
346
330
} catch (\Exception $ e ) {
347
331
// logic is similar to one in Symfony's ExceptionListener::onKernelException
348
- $ logger ->error (sprintf (
332
+ $ this -> logger ->error (sprintf (
349
333
'Exception thrown when handling an exception (%s: %s at %s line %s) ' ,
350
334
get_class ($ e ),
351
335
$ e ->getMessage (),
@@ -369,4 +353,38 @@ protected function onInterruptionByException(ExtensionInterface $extension, Cont
369
353
370
354
throw $ exception ;
371
355
}
356
+
357
+ private function processMessage (PsrConsumer $ consumer , PsrProcessor $ processor , PsrMessage $ message , Context $ context )
358
+ {
359
+ $ this ->logger ->info ('Message received from the queue: ' .$ context ->getPsrQueue ()->getQueueName ());
360
+ $ this ->logger ->debug ('Headers: {headers} ' , ['headers ' => new VarExport ($ message ->getHeaders ())]);
361
+ $ this ->logger ->debug ('Properties: {properties} ' , ['properties ' => new VarExport ($ message ->getProperties ())]);
362
+ $ this ->logger ->debug ('Payload: {payload} ' , ['payload ' => new VarExport ($ message ->getBody ())]);
363
+
364
+ $ this ->extension ->onPreReceived ($ context );
365
+ if (!$ context ->getResult ()) {
366
+ $ result = $ processor ->process ($ message , $ this ->psrContext );
367
+ $ context ->setResult ($ result );
368
+ }
369
+
370
+ $ this ->extension ->onResult ($ context );
371
+
372
+ switch ($ context ->getResult ()) {
373
+ case Result::ACK :
374
+ $ consumer ->acknowledge ($ message );
375
+ break ;
376
+ case Result::REJECT :
377
+ $ consumer ->reject ($ message , false );
378
+ break ;
379
+ case Result::REQUEUE :
380
+ $ consumer ->reject ($ message , true );
381
+ break ;
382
+ default :
383
+ throw new \LogicException (sprintf ('Status is not supported: %s ' , $ context ->getResult ()));
384
+ }
385
+
386
+ $ this ->logger ->info (sprintf ('Message processed: %s ' , $ context ->getResult ()));
387
+
388
+ $ this ->extension ->onPostReceived ($ context );
389
+ }
372
390
}
0 commit comments