AsyncHttpClient/async-http-client

Is there a way to reuse AsyncHttpClient asynchronously for different proxy servers?

couldbejake opened this issue · 2 comments

I'm needing to create a large amount of clients / accommodate a large number of requests using different proxy servers.

I notice the object immutable, would reflection be required to update the client, or is there a solution I'm not seeing.

Thanks!

I have updated the code by doing some research, but now continually get the error

"java.util.concurrent.atomic.AtomicReferenceFieldUpdater.compareAndSet(Object, Object, Object)" because "org.asynchttpclient.netty.NettyResponseFuture.EX_EX_UPDATER" is null

[AsyncHttpClient-4-27] ERROR org.asynchttpclient.netty.handler.HttpHandler - Cannot invoke "java.util.concurrent.atomic.AtomicReferenceFieldUpdater.compareAndSet(Object, Object, Object)" because "org.asynchttpclient.netty.NettyResponseFuture.EX_EX_UPDATER" is null
java.lang.NullPointerException: Cannot invoke "java.util.concurrent.atomic.AtomicReferenceFieldUpdater.compareAndSet(Object, Object, Object)" because "org.asynchttpclient.netty.NettyResponseFuture.EX_EX_UPDATER" is null
	at org.asynchttpclient.netty.NettyResponseFuture.abort(NettyResponseFuture.java:239)
	at org.asynchttpclient.netty.request.NettyRequestSender.abort(NettyRequestSender.java:392)
	at org.asynchttpclient.netty.handler.AsyncHttpClientHandler.exceptionCaught(AsyncHttpClientHandler.java:211)
	at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:230)
	at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:209)
	at io.netty.channel.ChannelInboundHandlerAdapter.exceptionCaught(ChannelInboundHandlerAdapter.java:131)
	at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:230)
	at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:209)
	at io.netty.channel.ChannelInboundHandlerAdapter.exceptionCaught(ChannelInboundHandlerAdapter.java:131)
	at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:230)
	at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:209)
	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireExceptionCaught(CombinedChannelDuplexHandler.java:416)
	at io.netty.channel.ChannelHandlerAdapter.exceptionCaught(ChannelHandlerAdapter.java:79)
	at io.netty.channel.CombinedChannelDuplexHandler$1.fireExceptionCaught(CombinedChannelDuplexHandler.java:144)
	at io.netty.channel.ChannelInboundHandlerAdapter.exceptionCaught(ChannelInboundHandlerAdapter.java:131)
	at io.netty.channel.CombinedChannelDuplexHandler.exceptionCaught(CombinedChannelDuplexHandler.java:223)
	at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:230)
	at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:209)
	at io.netty.channel.ChannelHandlerAdapter.exceptionCaught(ChannelHandlerAdapter.java:79)
	at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:230)
	at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:209)
	at io.netty.channel.DefaultChannelPipeline.fireExceptionCaught(DefaultChannelPipeline.java:950)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.handleReadException(AbstractNioByteChannel.java:87)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:162)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:528)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:447)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:401)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:371)
	at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
	at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
	at java.base/java.lang.Thread.run(Thread.java:1589)

I will continue investigating, but if anyone has a quick fix, please share!


/* Thread class */

public TaskProcessor() {

    AsyncHttpClientConfig config = new DefaultAsyncHttpClientConfig.Builder().build();
    this.c = asyncHttpClient(config);

}

public void processNextTask() {

    ProxyServer proxy1 = new ProxyServer.Builder("proxy1.example.com", 8080).build();
    
    Request request1 = new RequestBuilder("GET")
            .setUrl("http://example.com/")
            //.setProxyServer(proxy1)
            .build();

        c.executeRequest(request1, new handler(c, this));
}

/* consumer class */

import org.asynchttpclient.*;

import java.io.IOException;

public class handler implements AsyncHandler<Integer> {
    
    private final AsyncHttpClient c;
    private final TaskProcessor processor;
    private Integer status;

    public handler(AsyncHttpClient c, TaskProcessor TaskProcessor) {
        this.c = c;
        this.processor = TaskProcessor;
    }


    @Override
        public AsyncHandler.State onStatusReceived(HttpResponseStatus responseStatus) throws Exception {
            status = responseStatus.getStatusCode();
            if(status >= 200 && status < 400){
                this.processor.getScraper().logger.increaseSuccessRequestCount();
            } else {
                this.processor.getScraper().logger.increaseFailedRequestCount();
            }
            return AsyncHandler.State.ABORT;
        }

        @Override
        public AsyncHandler.State onHeadersReceived(HttpResponseHeaders headers) throws Exception {
            return AsyncHandler.State.ABORT;
        }


        @Override
        public AsyncHandler.State onBodyPartReceived(HttpResponseBodyPart bodyPart) throws Exception {
            return AsyncHandler.State.ABORT;
        }

        @Override
        public Integer onCompleted() throws Exception{
            return status;

        }

        @Override
        public void onThrowable(Throwable t) {
            
        }

}

Looks like this was patched in the latest version!