@@ -107,9 +107,33 @@ public boolean isRunning() {
107
107
return isRunning ;
108
108
}
109
109
110
+ /** Should be queues be marked as durable? */
111
+ private boolean durable = false ;
112
+ public boolean isDurable () {
113
+ return durable ;
114
+ }
115
+ public void setDurable (boolean durable ) {
116
+ this .durable = durable ;
117
+ }
118
+
119
+ /** Should be queues be marked as auto-delete? */
120
+ private boolean autoDelete = true ;
121
+ public boolean isAutoDelete () {
122
+ return autoDelete ;
123
+ }
124
+ public void setAutoDelete (boolean autoDelete ) {
125
+ this .autoDelete = autoDelete ;
126
+ }
127
+
110
128
private transient Lock lock = new ReentrantLock (true );
111
129
130
+ private boolean pauseConsumer = true ;
131
+
132
+ private boolean isConsuming = false ;
133
+
112
134
private class StarterRestarter extends Thread {
135
+ private String consumerTag = null ;
136
+
113
137
public StarterRestarter (String name ) {
114
138
super (name );
115
139
}
@@ -119,35 +143,52 @@ public void run() {
119
143
while (!Thread .interrupted ()) {
120
144
try {
121
145
lock .lockInterruptibly ();
146
+ logger .finest ("Checking isConsuming=" + isConsuming + " and pauseConsumer=" + pauseConsumer );
122
147
try {
123
- if (!isRunning ) {
148
+ if (!isConsuming && ! pauseConsumer ) {
124
149
// start up again
125
150
try {
126
151
Consumer consumer = new UrlConsumer (channel ());
127
152
channel ().exchangeDeclare (getExchange (), "direct" , true );
128
- channel ().queueDeclare (getQueueName (), false , false , true , null );
153
+ channel ().queueDeclare (getQueueName (), durable ,
154
+ false , autoDelete , null );
129
155
channel ().queueBind (getQueueName (), getExchange (), getQueueName ());
130
- channel ().basicConsume (getQueueName (), false , consumer );
131
- isRunning = true ;
132
- logger .info ("started AMQP consumer uri=" + getAmqpUri () + " exchange=" + getExchange () + " queueName=" + getQueueName ());
156
+ consumerTag = channel ().basicConsume (getQueueName (), false , consumer );
157
+ isConsuming = true ;
158
+ logger .info ("started AMQP consumer uri=" + getAmqpUri () + " exchange=" + getExchange () + " queueName=" + getQueueName () + " consumerTag=" + consumerTag );
159
+ } catch (IOException e ) {
160
+ logger .log (Level .SEVERE , "problem starting AMQP consumer (will try again after 10 seconds)" , e );
161
+ }
162
+ }
163
+
164
+ if (isConsuming && pauseConsumer ) {
165
+ try {
166
+ if (consumerTag != null ) {
167
+ logger .info ("Attempting to cancel URLConsumer with consumerTag=" + consumerTag );
168
+ channel ().basicCancel (consumerTag );
169
+ consumerTag = null ;
170
+ isConsuming = false ;
171
+ logger .info ("Cancelled URLConsumer." );
172
+ }
133
173
} catch (IOException e ) {
134
- logger .log (Level .SEVERE , "problem starting AMQP consumer (will try again after 30 seconds)" , e );
174
+ logger .log (Level .SEVERE , "problem cancelling AMQP consumer (will try again after 10 seconds)" , e );
135
175
}
136
176
}
137
177
138
- Thread .sleep (30000 );
178
+ Thread .sleep (10 * 1000 );
139
179
} finally {
140
180
lock .unlock ();
141
181
}
142
182
} catch (InterruptedException e ) {
183
+
143
184
return ;
144
185
}
145
186
}
146
187
}
147
188
}
148
189
149
190
transient private StarterRestarter starterRestarter ;
150
-
191
+
151
192
@ Override
152
193
public void start () {
153
194
lock .lock ();
@@ -274,9 +315,14 @@ public void handleDelivery(String consumerTag, Envelope envelope,
274
315
logger .log (Level .SEVERE ,
275
316
"problem creating CrawlURI from json received via AMQP "
276
317
+ decodedBody , e );
318
+ } catch (Exception e ) {
319
+ logger .log (Level .SEVERE ,
320
+ "Unanticipated problem creating CrawlURI from json received via AMQP "
321
+ + decodedBody , e );
277
322
}
278
323
} else {
279
- logger .warning ("ignoring url with method other than GET - " + decodedBody );
324
+ logger .info ("ignoring url with method other than GET - "
325
+ + decodedBody );
280
326
}
281
327
282
328
this .getChannel ().basicAck (envelope .getDeliveryTag (), false );
@@ -290,7 +336,7 @@ public void handleShutdownSignal(String consumerTag,
290
336
} else {
291
337
logger .info ("amqp channel/connection shut down consumerTag=" + consumerTag );
292
338
}
293
- isRunning = false ;
339
+ isConsuming = false ;
294
340
}
295
341
296
342
// {
@@ -349,7 +395,19 @@ protected CrawlURI makeCrawlUri(JSONObject jo) throws URIException,
349
395
curi .setSchedulingDirective (SchedulingConstants .HIGH );
350
396
curi .setPrecedence (1 );
351
397
352
- //curi.setForceFetch(true);
398
+ // optional forceFetch instruction:
399
+ if (jo .has ("forceFetch" )) {
400
+ boolean forceFetch = jo .getBoolean ("forceFetch" );
401
+ logger .info ("Setting forceFetch=" + forceFetch );
402
+ curi .setForceFetch (forceFetch );
403
+ }
404
+
405
+ // optional isSeed instruction:
406
+ if (jo .has ("isSeed" )) {
407
+ boolean isSeed = jo .getBoolean ("isSeed" );
408
+ logger .info ("Setting isSeed=" + isSeed );
409
+ curi .setSeed (isSeed );
410
+ }
353
411
354
412
curi .getAnnotations ().add (A_RECEIVED_FROM_AMQP );
355
413
@@ -361,22 +419,15 @@ protected CrawlURI makeCrawlUri(JSONObject jo) throws URIException,
361
419
public void onApplicationEvent (CrawlStateEvent event ) {
362
420
switch (event .getState ()) {
363
421
case PAUSING : case PAUSED :
364
- if (channel != null && channel .isOpen ()) {
365
- try {
366
- channel .flow (false );
367
- } catch (IOException e ) {
368
- logger .log (Level .WARNING , "failed to pause flow on amqp channel" , e );
369
- }
370
- }
422
+ logger .info ("Requesting a pause of the URLConsumer..." );
423
+ this .pauseConsumer = true ;
371
424
break ;
372
425
373
- case RUNNING : case EMPTY : case PREPARING :
374
- if (channel != null && channel .isOpen ()) {
375
- try {
376
- channel .flow (true );
377
- } catch (IOException e ) {
378
- logger .log (Level .SEVERE , "failed to resume flow on amqp channel" , e );
379
- }
426
+ case RUNNING :
427
+ logger .info ("Requesting restart of the URLConsumer..." );
428
+ this .pauseConsumer = false ;
429
+ if (starterRestarter == null || !starterRestarter .isAlive ()) {
430
+ start ();
380
431
}
381
432
break ;
382
433
0 commit comments