View Javadoc
1   package us.codecraft.webmagic.proxy;
2   
3   import us.codecraft.webmagic.Page;
4   import us.codecraft.webmagic.Request;
5   import us.codecraft.webmagic.Task;
6   
7   import java.util.ArrayList;
8   import java.util.Collections;
9   import java.util.List;
10  import java.util.concurrent.atomic.AtomicInteger;
11  
12  /**
13   * A simple ProxyProvider. Provide proxy as round-robin without heartbeat and error check. It can be used when all proxies are stable.
14   * @author code4crafter@gmail.com
15   *         Date: 17/4/16
16   *         Time: 10:18
17   * @since 0.7.0
18   */
19  public class SimpleProxyProvider implements ProxyProvider {
20  
21      private final List<Proxy> proxies;
22  
23      private final AtomicInteger pointer;
24  
25      public SimpleProxyProvider(List<Proxy> proxies) {
26          this(proxies, new AtomicInteger(-1));
27      }
28  
29      private SimpleProxyProvider(List<Proxy> proxies, AtomicInteger pointer) {
30          this.proxies = proxies;
31          this.pointer = pointer;
32      }
33  
34      public static SimpleProxyProvider from(Proxy... proxies) {
35          List<Proxy> proxiesTemp = new ArrayList<Proxy>(proxies.length);
36          for (Proxy proxy : proxies) {
37              proxiesTemp.add(proxy);
38          }
39          return new SimpleProxyProvider(Collections.unmodifiableList(proxiesTemp));
40      }
41  
42      @Override
43      public void returnProxy(Proxy proxy, Page page, Task task) {
44          //Donothing
45      }
46  
47      @Override
48      public Proxy getProxy(Request request, Task task) {
49          return proxies.get(incrForLoop());
50      }
51  
52      private int incrForLoop() {
53          int p = pointer.incrementAndGet();
54          int size = proxies.size();
55          if (p < size) {
56              return p;
57          }
58          while (!pointer.compareAndSet(p, p % size)) {
59              p = pointer.get();
60          }
61          return p % size;
62      }
63  
64  }