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
14
15
16
17
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
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 }