1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.client;
20
21 import java.util.concurrent.TimeUnit;
22 import java.util.concurrent.TimeoutException;
23 import java.util.concurrent.atomic.AtomicReference;
24
25 import org.eclipse.jetty.client.api.Request;
26 import org.eclipse.jetty.client.api.Response;
27 import org.eclipse.jetty.client.api.Result;
28 import org.eclipse.jetty.util.log.Log;
29 import org.eclipse.jetty.util.log.Logger;
30 import org.eclipse.jetty.util.thread.Scheduler;
31
32 public class TimeoutCompleteListener implements Response.CompleteListener, Runnable
33 {
34 private static final Logger LOG = Log.getLogger(TimeoutCompleteListener.class);
35
36 private final AtomicReference<Scheduler.Task> task = new AtomicReference<>();
37 private final Request request;
38
39 public TimeoutCompleteListener(Request request)
40 {
41 this.request = request;
42 }
43
44 @Override
45 public void onComplete(Result result)
46 {
47 Scheduler.Task task = this.task.getAndSet(null);
48 if (task != null)
49 {
50 boolean cancelled = task.cancel();
51 LOG.debug("Cancelled (successfully: {}) timeout task {}", cancelled, task);
52 }
53 }
54
55 public boolean schedule(Scheduler scheduler)
56 {
57 long timeout = request.getTimeout();
58 Scheduler.Task task = scheduler.schedule(this, timeout, TimeUnit.MILLISECONDS);
59 if (this.task.getAndSet(task) != null)
60 throw new IllegalStateException();
61 LOG.debug("Scheduled timeout task {} in {} ms", task, timeout);
62 return true;
63 }
64
65 @Override
66 public void run()
67 {
68 request.abort(new TimeoutException("Total timeout elapsed"));
69 }
70 }