SimpleProxyProvider #535
parent
62a6985103
commit
eb632a93d3
|
@ -38,4 +38,36 @@ public class Proxy {
|
|||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Proxy proxy = (Proxy) o;
|
||||
|
||||
if (port != proxy.port) return false;
|
||||
if (host != null ? !host.equals(proxy.host) : proxy.host != null) return false;
|
||||
if (username != null ? !username.equals(proxy.username) : proxy.username != null) return false;
|
||||
return password != null ? password.equals(proxy.password) : proxy.password == null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = host != null ? host.hashCode() : 0;
|
||||
result = 31 * result + port;
|
||||
result = 31 * result + (username != null ? username.hashCode() : 0);
|
||||
result = 31 * result + (password != null ? password.hashCode() : 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Proxy{" +
|
||||
"host='" + host + '\'' +
|
||||
", port=" + port +
|
||||
", username='" + username + '\'' +
|
||||
", password='" + password + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
package us.codecraft.webmagic.proxy;
|
||||
|
||||
import us.codecraft.webmagic.Page;
|
||||
import us.codecraft.webmagic.Task;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* A simple ProxyProvider. Provide proxy as round-robin without heartbeat and error check. It can be used when all proxies are stable.
|
||||
* @author code4crafter@gmail.com
|
||||
* Date: 17/4/16
|
||||
* Time: 10:18
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public class SimpleProxyProvider implements ProxyProvider {
|
||||
|
||||
private final List<Proxy> proxies;
|
||||
|
||||
private final AtomicInteger pointer;
|
||||
|
||||
private SimpleProxyProvider(List<Proxy> proxies, AtomicInteger pointer) {
|
||||
this.proxies = proxies;
|
||||
this.pointer = pointer;
|
||||
}
|
||||
|
||||
public static SimpleProxyProvider from(Proxy... proxies) {
|
||||
List<Proxy> proxiesTemp = new ArrayList<Proxy>(proxies.length);
|
||||
for (Proxy proxy : proxies) {
|
||||
proxiesTemp.add(proxy);
|
||||
}
|
||||
return new SimpleProxyProvider(Collections.unmodifiableList(proxiesTemp), new AtomicInteger(-1));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void returnProxy(Proxy proxy, Page page, Task task) {
|
||||
//Donothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public Proxy getProxy(Task task) {
|
||||
return proxies.get(incrForLoop());
|
||||
}
|
||||
|
||||
private int incrForLoop() {
|
||||
int p = pointer.incrementAndGet();
|
||||
int size = proxies.size();
|
||||
if (p < size) {
|
||||
return p;
|
||||
}
|
||||
while (!pointer.compareAndSet(p, p % size)) {
|
||||
p = pointer.get();
|
||||
}
|
||||
return p % size;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package us.codecraft.webmagic.proxy;
|
||||
|
||||
import org.junit.Test;
|
||||
import us.codecraft.webmagic.Site;
|
||||
import us.codecraft.webmagic.Task;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* @author code4crafter@gmail.com
|
||||
* Date: 17/4/16
|
||||
* Time: 上午10:29
|
||||
*/
|
||||
public class SimpleProxyProviderTest {
|
||||
|
||||
public static final Task TASK = Site.me().toTask();
|
||||
|
||||
@Test
|
||||
public void test_get_proxy() throws Exception {
|
||||
Proxy originProxy1 = new Proxy("127.0.0.1", 1087);
|
||||
Proxy originProxy2 = new Proxy("127.0.0.1", 1088);
|
||||
SimpleProxyProvider proxyProvider = SimpleProxyProvider.from(originProxy1, originProxy2);
|
||||
Proxy proxy = proxyProvider.getProxy(TASK);
|
||||
assertThat(proxy).isEqualTo(originProxy1);
|
||||
proxy = proxyProvider.getProxy(TASK);
|
||||
assertThat(proxy).isEqualTo(originProxy2);
|
||||
proxy = proxyProvider.getProxy(TASK);
|
||||
assertThat(proxy).isEqualTo(originProxy1);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue