2
2
3
3
namespace Enqueue \Consumption ;
4
4
5
+ use Enqueue \AmqpExt \AmqpConsumer ;
5
6
use Enqueue \Consumption \Exception \ConsumptionInterruptedException ;
6
7
use Enqueue \Consumption \Exception \InvalidArgumentException ;
7
8
use Enqueue \Consumption \Exception \LogicException ;
8
9
use Enqueue \Util \VarExport ;
10
+ use Interop \Amqp \AmqpContext ;
11
+ use Interop \Amqp \AmqpMessage ;
9
12
use Interop \Queue \PsrConsumer ;
10
13
use Interop \Queue \PsrContext ;
11
14
use Interop \Queue \PsrProcessor ;
@@ -143,6 +146,10 @@ public function bind($queue, $processor)
143
146
*/
144
147
public function consume (ExtensionInterface $ runtimeExtension = null )
145
148
{
149
+ if (empty ($ this ->boundProcessors )) {
150
+ throw new \LogicException ('There is nothing to consume. It is required to bind something before calling consume method. ' );
151
+ }
152
+
146
153
/** @var PsrConsumer[] $consumers */
147
154
$ consumers = [];
148
155
/** @var PsrQueue $queue */
@@ -163,21 +170,65 @@ public function consume(ExtensionInterface $runtimeExtension = null)
163
170
164
171
while (true ) {
165
172
try {
166
- /** @var PsrQueue $queue */
167
- foreach ($ this ->boundProcessors as list ($ queue , $ processor )) {
168
- $ consumer = $ consumers [$ queue ->getQueueName ()];
169
-
170
- $ context = new Context ($ this ->psrContext );
171
- $ context ->setLogger ($ logger );
172
- $ context ->setPsrQueue ($ queue );
173
- $ context ->setPsrConsumer ($ consumer );
174
- $ context ->setPsrProcessor ($ processor );
175
-
176
- $ this ->doConsume ($ extension , $ context );
173
+ if ($ this ->psrContext instanceof AmqpContext) {
174
+ $ callback = function (AmqpMessage $ message , AmqpConsumer $ consumer ) use ($ extension , $ logger ) {
175
+ $ currentProcessor = null ;
176
+
177
+ /** @var PsrQueue $queue */
178
+ foreach ($ this ->boundProcessors as list ($ queue , $ processor )) {
179
+ if ($ queue ->getQueueName () === $ consumer ->getQueue ()->getQueueName ()) {
180
+ $ currentProcessor = $ processor ;
181
+ }
182
+ }
183
+
184
+ if (false == $ currentProcessor ) {
185
+ throw new \LogicException (sprintf ('The processor for the queue "%s" could not be found. ' , $ consumer ->getQueue ()->getQueueName ()));
186
+ }
187
+
188
+ $ context = new Context ($ this ->psrContext );
189
+ $ context ->setLogger ($ logger );
190
+ $ context ->setPsrQueue ($ consumer ->getQueue ());
191
+ $ context ->setPsrConsumer ($ consumer );
192
+ $ context ->setPsrProcessor ($ currentProcessor );
193
+ $ context ->setPsrMessage ($ message );
194
+
195
+ $ this ->doConsume ($ extension , $ context );
196
+
197
+ return true ;
198
+ };
199
+
200
+ foreach ($ consumers as $ consumer ) {
201
+ /* @var AmqpConsumer $consumer */
202
+
203
+ $ this ->psrContext ->subscribe ($ consumer , $ callback );
204
+ }
205
+
206
+ $ this ->psrContext ->consume ($ this ->receiveTimeout );
207
+ } else {
208
+ /** @var PsrQueue $queue */
209
+ foreach ($ this ->boundProcessors as list ($ queue , $ processor )) {
210
+ $ consumer = $ consumers [$ queue ->getQueueName ()];
211
+
212
+ $ context = new Context ($ this ->psrContext );
213
+ $ context ->setLogger ($ logger );
214
+ $ context ->setPsrQueue ($ queue );
215
+ $ context ->setPsrConsumer ($ consumer );
216
+ $ context ->setPsrProcessor ($ processor );
217
+
218
+ $ this ->doConsume ($ extension , $ context );
219
+ }
177
220
}
178
221
} catch (ConsumptionInterruptedException $ e ) {
179
222
$ logger ->info (sprintf ('Consuming interrupted ' ));
180
223
224
+ if ($ this ->psrContext instanceof AmqpContext) {
225
+ foreach ($ consumers as $ consumer ) {
226
+ /* @var AmqpConsumer $consumer */
227
+
228
+ $ this ->psrContext ->unsubscribe ($ consumer );
229
+ }
230
+ }
231
+
181
232
$ context ->setExecutionInterrupted (true );
182
233
183
234
$ extension ->onInterrupted ($ context );
@@ -218,14 +269,19 @@ protected function doConsume(ExtensionInterface $extension, Context $context)
218
269
throw new ConsumptionInterruptedException ();
219
270
}
220
271
221
- if ($ message = $ consumer ->receive ($ this ->receiveTimeout )) {
272
+ $ message = $ context ->getPsrMessage ();
273
+ if (false == $ message ) {
274
+ if ($ message = $ consumer ->receive ($ this ->receiveTimeout )) {
275
+ $ context ->setPsrMessage ($ message );
276
+ }
277
+ }
278
+
279
+ if ($ message ) {
222
280
$ logger ->info ('Message received from the queue: ' .$ context ->getPsrQueue ()->getQueueName ());
223
281
$ logger ->debug ('Headers: {headers} ' , ['headers ' => new VarExport ($ message ->getHeaders ())]);
224
282
$ logger ->debug ('Properties: {properties} ' , ['properties ' => new VarExport ($ message ->getProperties ())]);
225
283
$ logger ->debug ('Payload: {payload} ' , ['payload ' => new VarExport ($ message ->getBody ())]);
226
284
227
- $ context ->setPsrMessage ($ message );
228
-
229
285
$ extension ->onPreReceived ($ context );
230
286
if (!$ context ->getResult ()) {
231
287
$ result = $ processor ->process ($ message , $ this ->psrContext );
0 commit comments